From c2da4394aebe6b6ece1aa805f4e3b1f407688d56 Mon Sep 17 00:00:00 2001 From: Hariharan Anantharaman Date: Fri, 23 Mar 2018 14:36:18 +0530 Subject: [PATCH] Following changes as per Satish request 1. Changed request response structure of water and battery consumption 2. Changed date in response to String to have only date(no timestamp) --- .metadata/.lock | 0 .metadata/.mylyn/.taskListIndex/segments.gen | Bin 0 -> 20 bytes .metadata/.mylyn/.taskListIndex/segments_1 | Bin 0 -> 32 bytes .../org.eclipse.compare/dialog_settings.xml | 9 + .../0/10212bdd762e001814c0d2815b26d8fe | 35 + .../0/60be039f97260018180ee1d7e30fe76e | 89 + .../1/1082bbb3b92d0018111effc5980105bf | 332 + .../1/a07f72be2f2c00181665d74572d9d988 | 125 + .../1/b028620d512c00181665d74572d9d988 | 283 + .../11/3040f116792e001814c0d2815b26d8fe | 390 ++ .../12/300709a8772e001814c0d2815b26d8fe | 30 + .../12/a09d9222772e001814c0d2815b26d8fe | 137 + .../12/d0fdbf56322c00181665d74572d9d988 | 9 + .../13/30b1b55fba2d0018111effc5980105bf | 374 ++ .../13/30da1bbe9a2d0018111effc5980105bf | 376 ++ .../13/e0b133a0842b00181358968824499f38 | 55 + .../14/70f8299afd2c001812c6cf03ff4f7112 | 289 + .../16/40c44f4aea2800181ac2881b40ece91c | 106 + .../17/20a97b91162900181ac2881b40ece91c | 47 + .../18/20ca66439f2d0018111effc5980105bf | 381 ++ .../19/50bb4bac452c00181665d74572d9d988 | 155 + .../19/a0570334eb2800181ac2881b40ece91c | 110 + .../1c/306310dbcd2d0018111effc5980105bf | 58 + .../1c/d0196520782e001814c0d2815b26d8fe | 390 ++ .../1d/007d0662ee2800181ac2881b40ece91c | 115 + .../1d/c0725a5beb2800181ac2881b40ece91c | 111 + .../1e/a01628d4112900181ac2881b40ece91c | 5 + .../1f/30f81df4b72d0018111effc5980105bf | 299 + .../2/a0cfc4bc2f2c00181665d74572d9d988 | 125 + .../21/70d9ec8f502c00181665d74572d9d988 | 283 + .../21/e0f7cda9152900181ac2881b40ece91c | 35 + .../24/3013fdffbb2d0018111effc5980105bf | 111 + .../25/b0f9f8942f2c00181665d74572d9d988 | 124 + .../26/60fe7d98772e001814c0d2815b26d8fe | 41 + .../27/101822082e2c00181665d74572d9d988 | 28 + .../27/1019b3a7842b00181358968824499f38 | 55 + .../2b/d0facc33ea2800181ac2881b40ece91c | 106 + .../2c/80d2a586eb2800181ac2881b40ece91c | 111 + .../2c/e0e21d9a9f2d0018111effc5980105bf | 381 ++ .../2d/4074b0b5b92d0018111effc5980105bf | 333 + .../2e/108e65c6cd2d0018111effc5980105bf | 55 + .../2e/70d0e89e152900181ac2881b40ece91c | 19 + .../2e/906184eacd2d0018111effc5980105bf | 134 + .../2f/b0dff843992d0018111effc5980105bf | 376 ++ .../3/807303ce3d2c00181665d74572d9d988 | 161 + .../3/d07f0370302c00181665d74572d9d988 | 133 + .../30/f0a34632212900181ac2881b40ece91c | 52 + .../32/70589016ed2c001812c6cf03ff4f7112 | 283 + .../32/80b9c133772e001814c0d2815b26d8fe | 138 + .../32/c082e327ea2800181ac2881b40ece91c | 106 + .../33/80561f88852b00181358968824499f38 | 5 + .../34/d0acb428792e001814c0d2815b26d8fe | 390 ++ .../36/d0949796fb2c001812c6cf03ff4f7112 | 289 + .../38/302b68a4312c00181665d74572d9d988 | 24 + .../38/c0a44eac852b00181358968824499f38 | 7 + .../39/0077340e792e001814c0d2815b26d8fe | 390 ++ .../3a/306633ab842b00181358968824499f38 | 55 + .../3a/705d296c312c00181665d74572d9d988 | 17 + .../3a/a0f864e5472c00181665d74572d9d988 | 155 + .../3a/e0fe5e4c502c00181665d74572d9d988 | 283 + .../3c/b0974d7b3d2c00181665d74572d9d988 | 155 + .../3d/909d2c8a832b00181358968824499f38 | 7 + .../3e/30c7a57dfb2c001812c6cf03ff4f7112 | 288 + .../3f/40ac8e92362c00181665d74572d9d988 | 154 + .../3f/e021b9057f2b00181358968824499f38 | 49 + .../3f/f0e191cfcd2d0018111effc5980105bf | 57 + .../4/703f75ac0d2d001812c6cf03ff4f7112 | 161 + .../40/40190c00ba2d0018111effc5980105bf | 337 + .../40/60769fbeea2800181ac2881b40ece91c | 110 + .../40/e0450ebefb2c001812c6cf03ff4f7112 | 293 + .../40/e051f09ca12d0018111effc5980105bf | 387 ++ .../42/20051409ec2800181ac2881b40ece91c | 115 + .../43/60b5c996ea2800181ac2881b40ece91c | 110 + .../44/10a0ec10322c00181665d74572d9d988 | 30 + .../45/20fcfcff0b2d001812c6cf03ff4f7112 | 161 + .../45/f00c5f55a02d0018111effc5980105bf | 385 ++ .../46/10564b2b302c00181665d74572d9d988 | 131 + .../48/208012b8b92d0018111effc5980105bf | 333 + .../48/a09f2d9a762e001814c0d2815b26d8fe | 19 + .../4a/00d376d5eb2800181ac2881b40ece91c | 114 + .../4d/302c9ed6312c00181665d74572d9d988 | 25 + .../4d/50cf87e2762e001814c0d2815b26d8fe | 29 + .../4d/f02ad9af0d2d001812c6cf03ff4f7112 | 161 + .../4e/20cc2f8c97260018180ee1d7e30fe76e | 86 + .../4e/f02a8914362c00181665d74572d9d988 | 149 + .../4f/80922cfe772e001814c0d2815b26d8fe | 390 ++ .../5/806fcd8c992d0018111effc5980105bf | 134 + .../5/a02fe5619f2d0018111effc5980105bf | 381 ++ .../5/d0c8280d782e001814c0d2815b26d8fe | 390 ++ .../5/e0dc4dee312c00181665d74572d9d988 | 28 + .../52/4050f512512c00181665d74572d9d988 | 283 + .../55/00503c45162900181ac2881b40ece91c | 36 + .../55/30f48cb8a12d0018111effc5980105bf | 389 ++ .../55/70f070241a2900181ac2881b40ece91c | 44 + .../56/2031fd5deb2800181ac2881b40ece91c | 111 + .../57/301d03fd122900181ac2881b40ece91c | 8 + .../57/70817ed72e2c00181665d74572d9d988 | 114 + .../59/a0f93f6efb2c001812c6cf03ff4f7112 | 284 + .../5a/f0d9ff82962d0018111effc5980105bf | 133 + .../5b/808b641c1a2900181ac2881b40ece91c | 44 + .../5c/709ee84d162900181ac2881b40ece91c | 36 + .../5d/00cd1088132900181ac2881b40ece91c | 12 + .../5d/307d7ceb5c2b00181358968824499f38 | 44 + .../5e/00fdaff4eb2800181ac2881b40ece91c | 114 + .../5e/90075c8beb2800181ac2881b40ece91c | 111 + .../5e/c05be952ef2800181ac2881b40ece91c | 116 + .../5e/f0899e2b212900181ac2881b40ece91c | 50 + .../5f/80159784772e001814c0d2815b26d8fe | 32 + .../5f/c0f41fe9bb2d0018111effc5980105bf | 376 ++ .../6/3075cf0eec2800181ac2881b40ece91c | 114 + .../6/f0a9d378302c00181665d74572d9d988 | 9 + .../60/603e69e5472c00181665d74572d9d988 | 117 + .../60/70500149ba2d0018111effc5980105bf | 374 ++ .../60/b0c27656992d0018111effc5980105bf | 376 ++ .../61/10e924a8762e001814c0d2815b26d8fe | 19 + .../61/90897935302c00181665d74572d9d988 | 131 + .../61/e08c4310132900181ac2881b40ece91c | 13 + .../62/20236f03852b00181358968824499f38 | 0 .../64/007b2ac5962d0018111effc5980105bf | 133 + .../64/a087c807132900181ac2881b40ece91c | 10 + .../65/204bc001792e001814c0d2815b26d8fe | 43 + .../66/3075d252eb2800181ac2881b40ece91c | 110 + .../66/b0dfd9e897260018180ee1d7e30fe76e | 89 + .../67/0019c9923d2c00181665d74572d9d988 | 133 + .../68/80b03c91992d0018111effc5980105bf | 134 + .../69/50593dcfeb2800181ac2881b40ece91c | 114 + .../69/806c61b7a12d0018111effc5980105bf | 389 ++ .../69/d014b4effb2c001812c6cf03ff4f7112 | 155 + .../6a/f08cc63dee2800181ac2881b40ece91c | 114 + .../6b/301ce604792e001814c0d2815b26d8fe | 43 + .../6c/90830c3d212900181ac2881b40ece91c | 53 + .../6c/b07e6a6ced2c001812c6cf03ff4f7112 | 283 + .../6d/a02b00ab0d2d001812c6cf03ff4f7112 | 161 + .../6d/a0e1ef5b302c00181665d74572d9d988 | 132 + .../6e/7081038a962d0018111effc5980105bf | 133 + .../6e/e0563813792e001814c0d2815b26d8fe | 390 ++ .../6e/e05fb1bf3d2c00181665d74572d9d988 | 162 + .../7/905c66c8ea2800181ac2881b40ece91c | 110 + .../70/1042ab6cba2d0018111effc5980105bf | 374 ++ .../70/80106135992d0018111effc5980105bf | 289 + .../71/70eb50ac452c00181665d74572d9d988 | 117 + .../71/70f64820a02d0018111effc5980105bf | 382 ++ .../71/80938f18a02d0018111effc5980105bf | 382 ++ .../73/10dab312782e001814c0d2815b26d8fe | 390 ++ .../73/40f325ae97260018180ee1d7e30fe76e | 89 + .../73/f05627da762e001814c0d2815b26d8fe | 27 + .../74/0071ef10b82d0018111effc5980105bf | 337 + .../74/90cde18b762e001814c0d2815b26d8fe | 28 + .../75/00204218512c00181665d74572d9d988 | 283 + .../75/d04a8495ef2800181ac2881b40ece91c | 116 + .../77/00d0b3ffeb2800181ac2881b40ece91c | 115 + .../79/9049c63d852b00181358968824499f38 | 0 .../7a/00642909302c00181665d74572d9d988 | 126 + .../7a/e074af40162900181ac2881b40ece91c | 36 + .../7b/c0ec7cc9b82d0018111effc5980105bf | 332 + .../7c/508630c6072d001812c6cf03ff4f7112 | 121 + .../7c/a0281a89322c00181665d74572d9d988 | 35 + .../7c/e090101f792e001814c0d2815b26d8fe | 390 ++ .../7d/900cf398a12d0018111effc5980105bf | 385 ++ .../7d/f0c0df30212900181ac2881b40ece91c | 52 + .../7e/40ee536ba02d0018111effc5980105bf | 385 ++ .../7e/d0b66bad302c00181665d74572d9d988 | 133 + .../7f/209464310d2d001812c6cf03ff4f7112 | 289 + .../7f/402a28c93d2c00181665d74572d9d988 | 161 + .../7f/50a9f525782e001814c0d2815b26d8fe | 390 ++ .../7f/c00fa836362c00181665d74572d9d988 | 154 + .../80/407b7cbab92d0018111effc5980105bf | 333 + .../81/10007c129a2d0018111effc5980105bf | 134 + .../81/30ce71c497260018180ee1d7e30fe76e | 89 + .../82/003a791c512c00181665d74572d9d988 | 283 + .../85/b0b893d2fb2c001812c6cf03ff4f7112 | 295 + .../87/30eb6c1b322c00181665d74572d9d988 | 31 + .../87/b03749fe762e001814c0d2815b26d8fe | 137 + .../88/405583fd97260018180ee1d7e30fe76e | 95 + .../88/708b1ccb962d0018111effc5980105bf | 139 + .../8a/10738b43842b00181358968824499f38 | 21 + .../8c/10a1b575302c00181665d74572d9d988 | 133 + .../8c/403ed463772e001814c0d2815b26d8fe | 28 + .../8d/802f981dba2d0018111effc5980105bf | 337 + .../8d/b0df4118212900181ac2881b40ece91c | 47 + .../8e/40b551002f2c00181665d74572d9d988 | 121 + .../8f/804dff1afc2c001812c6cf03ff4f7112 | 120 + .../9/90641cc8772e001814c0d2815b26d8fe | 389 ++ .../90/60af6d4d772e001814c0d2815b26d8fe | 137 + .../91/40d2bea0312c00181665d74572d9d988 | 18 + .../91/b01bbff9762e001814c0d2815b26d8fe | 137 + .../92/70abe09b132900181ac2881b40ece91c | 14 + .../92/80aa68db0b2d001812c6cf03ff4f7112 | 160 + .../94/10b64a3e992d0018111effc5980105bf | 376 ++ .../95/f0370eb6852b00181358968824499f38 | 9 + .../96/309ab2be112d001812c6cf03ff4f7112 | 39 + .../97/100005f1512c00181665d74572d9d988 | 283 + .../98/60a607c2762e001814c0d2815b26d8fe | 136 + .../98/70a0e2fa7e2b00181358968824499f38 | 48 + .../99/20016b35ef2800181ac2881b40ece91c | 116 + .../9b/c0dd6270b82d0018111effc5980105bf | 332 + .../9c/b02bb314372c00181665d74572d9d988 | 155 + .../9d/10e326ab842b00181358968824499f38 | 55 + .../9e/50ea9b89782e001814c0d2815b26d8fe | 141 + .../9e/909fb54f322c00181665d74572d9d988 | 139 + .../9e/b0c8526a312c00181665d74572d9d988 | 16 + .../9f/80943163992d0018111effc5980105bf | 376 ++ .../9f/9022780dec2800181ac2881b40ece91c | 114 + .../9f/90d17006ec2800181ac2881b40ece91c | 115 + .../a/a08fe125792e001814c0d2815b26d8fe | 390 ++ .../a1/e04b1e291a2900181ac2881b40ece91c | 14 + .../a2/c0c2ccf397260018180ee1d7e30fe76e | 94 + .../a4/4045d230782e001814c0d2815b26d8fe | 390 ++ .../a4/500c481a792e001814c0d2815b26d8fe | 390 ++ .../a6/20e5ec89362c00181665d74572d9d988 | 154 + .../a6/e0f85b953d2c00181665d74572d9d988 | 132 + .../a7/50c50232ee2800181ac2881b40ece91c | 114 + .../a9/904d1429fb2c001812c6cf03ff4f7112 | 284 + .../ad/30896caa832b00181358968824499f38 | 11 + .../ad/60d8524b162900181ac2881b40ece91c | 36 + .../ad/90d8caa6ea2800181ac2881b40ece91c | 110 + .../ae/20e362e1eb2800181ac2881b40ece91c | 114 + .../ae/f06dc1d0302c00181665d74572d9d988 | 133 + .../af/a03c9c6eba2d0018111effc5980105bf | 375 ++ .../b/602985ff212c00181665d74572d9d988 | 7 + .../b/d003c143ba2d0018111effc5980105bf | 343 ++ .../b0/20b8d7c9f02800181ac2881b40ece91c | 116 + .../b0/304d65e9312c00181665d74572d9d988 | 27 + .../b0/a05cf6de302c00181665d74572d9d988 | 134 + .../b2/2048341a772e001814c0d2815b26d8fe | 137 + .../b2/60e92c1da02d0018111effc5980105bf | 383 ++ .../b3/607b2e7f3d2c00181665d74572d9d988 | 133 + .../b3/e0152741162900181ac2881b40ece91c | 36 + .../b5/7090a592772e001814c0d2815b26d8fe | 41 + .../b6/b088a642312c00181665d74572d9d988 | 14 + .../b6/f06e99ea772e001814c0d2815b26d8fe | 389 ++ .../ba/4028bdc9112900181ac2881b40ece91c | 0 .../bc/e03516ad772e001814c0d2815b26d8fe | 42 + .../bd/10ab9178132900181ac2881b40ece91c | 7 + .../be/e08e3ae89c2d0018111effc5980105bf | 380 ++ .../bf/50619183322c00181665d74572d9d988 | 38 + .../bf/c04d285d132900181ac2881b40ece91c | 0 .../bf/e089d99f772e001814c0d2815b26d8fe | 41 + .../c/306d09d8fb2c001812c6cf03ff4f7112 | 298 + .../c/b070abc6eb2800181ac2881b40ece91c | 111 + .../c0/804b6064ee2800181ac2881b40ece91c | 116 + .../c0/b0015062262c00181665d74572d9d988 | 55 + .../c0/d0fb66d8f02800181ac2881b40ece91c | 116 + .../c0/e0ccbce3762e001814c0d2815b26d8fe | 137 + .../c1/700c2f48322c00181665d74572d9d988 | 134 + .../c1/b05304f45c2b00181358968824499f38 | 44 + .../c2/f08629062f2c00181665d74572d9d988 | 122 + .../c3/501006b8852b00181358968824499f38 | 7 + .../c3/e002cc68162900181ac2881b40ece91c | 37 + .../c4/009c07a42e2c00181665d74572d9d988 | 34 + .../c4/90b4642aba2d0018111effc5980105bf | 342 ++ .../c4/d006f6de962d0018111effc5980105bf | 140 + .../c4/d0996c46ee2800181ac2881b40ece91c | 115 + .../c5/10290991782e001814c0d2815b26d8fe | 141 + .../c9/e0419a8b132900181ac2881b40ece91c | 13 + .../c9/e0c69bd3ea2800181ac2881b40ece91c | 110 + .../ca/20380815b92d0018111effc5980105bf | 99 + .../ca/b0b92e19a02d0018111effc5980105bf | 383 ++ .../ca/d04afdf72e2c00181665d74572d9d988 | 121 + .../cd/90042faba12d0018111effc5980105bf | 387 ++ .../cd/b0d7fd49a02d0018111effc5980105bf | 382 ++ .../ce/50aa7ee0302c00181665d74572d9d988 | 134 + .../ce/c0ad08afea2800181ac2881b40ece91c | 110 + .../d/f005b88e2f2c00181665d74572d9d988 | 123 + .../d1/00aef0189a2d0018111effc5980105bf | 134 + .../d2/d0de6d17fb2c001812c6cf03ff4f7112 | 283 + .../d3/30f2fdff97260018180ee1d7e30fe76e | 96 + .../d4/5026a1b1342c00181665d74572d9d988 | 139 + .../d5/100976b6072d001812c6cf03ff4f7112 | 160 + .../d6/2003500db82d0018111effc5980105bf | 337 + .../d6/6065e46cb82d0018111effc5980105bf | 337 + .../d6/70790587322c00181665d74572d9d988 | 35 + .../d6/907e4f4ea02d0018111effc5980105bf | 384 ++ .../d7/50bb6c6dee2800181ac2881b40ece91c | 116 + .../d7/b0648310372c00181665d74572d9d988 | 154 + .../da/4029f615772e001814c0d2815b26d8fe | 137 + .../da/407c33942e2c00181665d74572d9d988 | 110 + .../dc/00795e15ba2d0018111effc5980105bf | 337 + .../dc/3012410a782e001814c0d2815b26d8fe | 390 ++ .../dc/908b903f302c00181665d74572d9d988 | 9 + .../dc/e01cfe3dbe2d0018111effc5980105bf | 365 ++ .../dd/5083184d2e2c00181665d74572d9d988 | 92 + .../dd/906f1d060c2d001812c6cf03ff4f7112 | 161 + .../dd/a030a94d992d0018111effc5980105bf | 376 ++ .../dd/a07469f1b92d0018111effc5980105bf | 337 + .../dd/d065f83a302c00181665d74572d9d988 | 132 + .../dd/e060a62f322c00181665d74572d9d988 | 31 + .../de/2047ab7b132900181ac2881b40ece91c | 12 + .../de/20a392c5ea2800181ac2881b40ece91c | 110 + .../df/4021f8e8962d0018111effc5980105bf | 143 + .../df/a077ed350d2d001812c6cf03ff4f7112 | 289 + .../df/b0740edd2e2c00181665d74572d9d988 | 115 + .../e0/90c504c8112d001812c6cf03ff4f7112 | 58 + .../e0/a0cdc434322c00181665d74572d9d988 | 31 + .../e1/7017dd5d162900181ac2881b40ece91c | 36 + .../e2/604553e5472c00181665d74572d9d988 | 293 + .../e2/d083769c97260018180ee1d7e30fe76e | 87 + .../e2/d0ef6c0f302c00181665d74572d9d988 | 130 + .../e3/50d10f17a02d0018111effc5980105bf | 382 ++ .../e3/a012b4efec2c001812c6cf03ff4f7112 | 155 + .../e4/109d1de2ea2800181ac2881b40ece91c | 110 + .../e5/a019f7812f2c00181665d74572d9d988 | 122 + .../e5/c056a9142e2c00181665d74572d9d988 | 88 + .../e5/f053768a162900181ac2881b40ece91c | 39 + .../e6/b0735490362c00181665d74572d9d988 | 154 + .../e6/f0f62378ba2d0018111effc5980105bf | 376 ++ .../e9/502f8390fb2c001812c6cf03ff4f7112 | 288 + .../ea/90d6905df22800181ac2881b40ece91c | 116 + .../ea/b03dde4cf22800181ac2881b40ece91c | 116 + .../eb/30ccb80ffc2c001812c6cf03ff4f7112 | 117 + .../eb/f0071473a02d0018111effc5980105bf | 385 ++ .../ec/c09cb3cb112d001812c6cf03ff4f7112 | 59 + .../ec/d03e9c462f2c00181665d74572d9d988 | 122 + .../ec/f0cd9d4c212900181ac2881b40ece91c | 54 + .../ed/b0ef3d84ea2800181ac2881b40ece91c | 108 + .../ee/202fb4f22f2c00181665d74572d9d988 | 125 + .../ee/e0ba93be3d2c00181665d74572d9d988 | 132 + .../ef/90cffd0398260018180ee1d7e30fe76e | 96 + .../ef/f0add5f9262c00181665d74572d9d988 | 7 + .../f/8089a64ca02d0018111effc5980105bf | 384 ++ .../f/c00163ebeb2800181ac2881b40ece91c | 114 + .../f0/507b5568a02d0018111effc5980105bf | 385 ++ .../f0/b0fe9edbb92d0018111effc5980105bf | 333 + .../f1/10c921eeea2800181ac2881b40ece91c | 110 + .../f1/5068a1f9b72d0018111effc5980105bf | 337 + .../f1/d096d17497260018180ee1d7e30fe76e | 81 + .../f1/f03c9a1cb92d0018111effc5980105bf | 99 + .../f3/40f13dcfeb2c001812c6cf03ff4f7112 | 34 + .../f3/50344cb2ed2c001812c6cf03ff4f7112 | 283 + .../f4/a0791770782e001814c0d2815b26d8fe | 390 ++ .../f4/d01cd4380d2d001812c6cf03ff4f7112 | 289 + .../f5/70bdaee8ec2c001812c6cf03ff4f7112 | 133 + .../f6/d064cd70072d001812c6cf03ff4f7112 | 289 + .../f7/308b28b82f2c00181665d74572d9d988 | 124 + .../f7/70fcf8f697260018180ee1d7e30fe76e | 95 + .../f8/00493851f22800181ac2881b40ece91c | 118 + .../f8/8011e3c9ea2800181ac2881b40ece91c | 110 + .../fb/70c72e01322c00181665d74572d9d988 | 29 + .../fc/40c3b40eb82d0018111effc5980105bf | 337 + .../fc/f092a823312c00181665d74572d9d988 | 10 + .../ff/008716fffb2c001812c6cf03ff4f7112 | 159 + .../ff/502e31baa12d0018111effc5980105bf | 389 ++ .../DataSimulator/.indexes/af/history.index | Bin 0 -> 94 bytes .../e4/81/f6/2b/aa/fc/b5/history.index | Bin 0 -> 2170 bytes .../.indexes/e4/81/f6/ba/aa/fc/history.index | Bin 0 -> 527 bytes .../.indexes/e4/81/f6/ba/aa/history.index | Bin 0 -> 490 bytes .../DataSimulator/.indexes/e4/history.index | Bin 0 -> 412 bytes .../DataSimulator/.indexes/history.index | Bin 0 -> 161 bytes .../DataSimulator/.indexes/properties.index | Bin 0 -> 86 bytes .../.projects/DataSimulator/.markers | Bin 0 -> 4568 bytes .../.projects/DataSimulator/.markers.snap | Bin 0 -> 48 bytes .../.projects/DataSimulator/.syncinfo.snap | Bin 0 -> 48 bytes .../org.eclipse.jdt.core/state.dat | Bin 0 -> 164185 bytes .../RemoteSystemsTempFiles/.markers.snap | Bin 0 -> 48 bytes .../RemoteSystemsTempFiles/.syncinfo.snap | Bin 0 -> 48 bytes .../.projects/Servers/.markers.snap | Bin 0 -> 48 bytes .../.projects/Servers/.syncinfo.snap | Bin 0 -> 48 bytes .../e4/b9/22/81/f6/2b/12/22/3c/history.index | Bin 0 -> 1060 bytes .../e4/b9/22/81/f6/2b/12/22/9c/history.index | Bin 0 -> 1206 bytes .../e4/b9/22/81/f6/2b/12/22/b5/history.index | Bin 0 -> 1552 bytes .../.indexes/properties.index | Bin 0 -> 86 bytes .../.projects/connectionstatistics/.markers | Bin 0 -> 5151 bytes .../connectionstatistics/.markers.snap | Bin 0 -> 6291 bytes .../connectionstatistics/.syncinfo.snap | Bin 0 -> 48 bytes .../e4/b9/22/81/f6/2b/12/3c/history.index | Bin 0 -> 160 bytes .../e4/b9/22/81/f6/2b/12/b5/history.index | Bin 0 -> 817 bytes .../.indexes/properties.index | Bin 0 -> 86 bytes .../.projects/consolidateddetails/.markers | Bin 0 -> 2571 bytes .../consolidateddetails/.markers.snap | Bin 0 -> 48 bytes .../consolidateddetails/.syncinfo.snap | Bin 0 -> 48 bytes .../org.eclipse.jdt.core/state.dat | Bin 0 -> 176373 bytes .../e4/b9/22/81/f6/2b/12/5c/b5/history.index | Bin 0 -> 1292 bytes .../mapdataservice/.indexes/properties.index | Bin 0 -> 86 bytes .../.projects/mapdataservice/.markers | Bin 0 -> 4056 bytes .../.projects/mapdataservice/.markers.snap | Bin 0 -> 48 bytes .../.projects/mapdataservice/.syncinfo.snap | Bin 0 -> 48 bytes .../org.eclipse.jdt.core/state.dat | Bin 0 -> 175878 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 282 bytes .../.root/.indexes/properties.version | 1 + .../.root/.markers.snap | Bin 0 -> 75 bytes .../org.eclipse.core.resources/.root/9.tree | Bin 0 -> 22136 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 3712 bytes .../org.eclipse.core.resources/9.snap | Bin 0 -> 2290 bytes .../.settings/org.eclipse.ajdt.ui.prefs | 2 + .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.debug.core.prefs | 2 + .../.settings/org.eclipse.debug.ui.prefs | 7 + .../org.eclipse.epp.logging.aeri.ide.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../.settings/org.eclipse.jdt.debug.ui.prefs | 2 + .../.settings/org.eclipse.jdt.launching.prefs | 2 + .../.settings/org.eclipse.jdt.ui.prefs | 21 + .../.settings/org.eclipse.m2e.discovery.prefs | 2 + .../org.eclipse.mylyn.context.core.prefs | 2 + .../.settings/org.eclipse.mylyn.java.ui.prefs | 3 + .../org.eclipse.mylyn.monitor.ui.prefs | 2 + .../org.eclipse.mylyn.tasks.ui.prefs | 5 + .../.settings/org.eclipse.pde.api.tools.prefs | 2 + ....eclipse.recommenders.completion.rcp.prefs | 2 + .../.settings/org.eclipse.rse.core.prefs | 4 + .../.settings/org.eclipse.rse.ui.prefs | 2 + .../.settings/org.eclipse.search.prefs | 2 + .../.settings/org.eclipse.team.ui.prefs | 2 + .../.settings/org.eclipse.ui.editors.prefs | 2 + .../.settings/org.eclipse.ui.ide.prefs | 5 + .../.settings/org.eclipse.ui.prefs | 2 + .../.settings/org.eclipse.ui.workbench.prefs | 4 + .../.settings/org.eclipse.wst.jsdt.ui.prefs | 10 + .../org.eclipse.wst.server.core.prefs | 2 + .../.settings/org.eclipse.wst.sse.ui.prefs | 4 + .../org.eclipse.wst.ws.service.policy.prefs | 3 + ...ingframework.ide.eclipse.boot.wizard.prefs | 14 + ....springframework.ide.eclipse.imports.prefs | 2 + ...rce.ide.eclipse.commons.configurator.prefs | 2 + ...pringsource.ide.eclipse.commons.core.prefs | 2 + ....ide.eclipse.commons.frameworks.core.prefs | 2 + ...pringsource.ide.eclipse.dashboard.ui.prefs | 2 + .../.launches/DataSimulator.launch | 16 + .../.launches/PopulateData.launch | 15 + .../.launches/connectionstatistics (1).launch | 16 + .../.launches/connectionstatistics.launch | 16 + .../.launches/consolidateddetails (1).launch | 16 + .../.launches/consolidateddetails.launch | 16 + .../.launches/mapdataservice (1).launch | 16 + .../.launches/mapdataservice.launch | 16 + .../org.eclipse.debug.ui/dialog_settings.xml | 23 + .../launchConfigurationHistory.xml | 43 + .../org.eclipse.e4.workbench/workbench.xmi | 3933 ++++++++++++ .../http-cache/segments.gen | Bin 0 -> 20 bytes .../http-cache/segments_1 | Bin 0 -> 32 bytes .../http-cache/write.lock | 0 .../local-history/_0.fdt | Bin 0 -> 11 bytes .../local-history/_0.fdx | Bin 0 -> 12 bytes .../local-history/_0.fnm | 1 + .../local-history/_0.frq | 0 .../local-history/_0.nrm | 1 + .../local-history/_0.tii | Bin 0 -> 24 bytes .../local-history/_0.tis | Bin 0 -> 24 bytes .../local-history/segments.gen | Bin 0 -> 20 bytes .../local-history/segments_1 | Bin 0 -> 241 bytes .../local-history/write.lock | 0 .../remote-history/_0.fdt | Bin 0 -> 11 bytes .../remote-history/_0.fdx | Bin 0 -> 12 bytes .../remote-history/_0.fnm | 1 + .../remote-history/_0.frq | 0 .../remote-history/_0.nrm | 1 + .../remote-history/_0.tii | Bin 0 -> 24 bytes .../remote-history/_0.tis | Bin 0 -> 24 bytes .../remote-history/segments.gen | Bin 0 -> 20 bytes .../remote-history/segments_1 | Bin 0 -> 241 bytes .../server-config.json | 44 + .../http-cache/segments.gen | Bin 0 -> 20 bytes .../http-cache/segments_1 | Bin 0 -> 32 bytes .../http-cache/write.lock | 0 .../local-history/_0.fdt | Bin 0 -> 11 bytes .../local-history/_0.fdx | Bin 0 -> 12 bytes .../local-history/_0.fnm | 1 + .../local-history/_0.frq | 0 .../local-history/_0.nrm | 1 + .../local-history/_0.tii | Bin 0 -> 24 bytes .../local-history/_0.tis | Bin 0 -> 24 bytes .../local-history/segments.gen | Bin 0 -> 20 bytes .../local-history/segments_1 | Bin 0 -> 241 bytes .../local-history/write.lock | 0 .../remote-history/_0.fdt | Bin 0 -> 11 bytes .../remote-history/_0.fdx | Bin 0 -> 12 bytes .../remote-history/_0.fnm | 1 + .../remote-history/_0.frq | 0 .../remote-history/_0.nrm | 1 + .../remote-history/_0.tii | Bin 0 -> 24 bytes .../remote-history/_0.tis | Bin 0 -> 24 bytes .../remote-history/segments.gen | Bin 0 -> 20 bytes .../remote-history/segments_1 | Bin 0 -> 241 bytes .../server-config.json | 72 + .../org.eclipse.jdt.core/1021361779.index | Bin 0 -> 37157 bytes .../org.eclipse.jdt.core/1075874757.index | Bin 0 -> 243694 bytes .../org.eclipse.jdt.core/1079038258.index | Bin 0 -> 88132 bytes .../org.eclipse.jdt.core/1168908523.index | Bin 0 -> 56097 bytes .../org.eclipse.jdt.core/1183045005.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/1219017619.index | Bin 0 -> 127556 bytes .../org.eclipse.jdt.core/1234405984.index | Bin 0 -> 992573 bytes .../org.eclipse.jdt.core/1329982142.index | Bin 0 -> 520517 bytes .../org.eclipse.jdt.core/1334412443.index | Bin 0 -> 29496 bytes .../org.eclipse.jdt.core/1337243334.index | Bin 0 -> 2380484 bytes .../org.eclipse.jdt.core/135737430.index | Bin 0 -> 599019 bytes .../org.eclipse.jdt.core/1427570240.index | Bin 0 -> 222476 bytes .../org.eclipse.jdt.core/1454368809.index | Bin 0 -> 68942 bytes .../org.eclipse.jdt.core/1494953510.index | Bin 0 -> 2016240 bytes .../org.eclipse.jdt.core/1512413526.index | Bin 0 -> 307307 bytes .../org.eclipse.jdt.core/1516196484.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/1541055472.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/1589171113.index | Bin 0 -> 194665 bytes .../org.eclipse.jdt.core/1592057207.index | Bin 0 -> 2839932 bytes .../org.eclipse.jdt.core/1667173024.index | Bin 0 -> 1862198 bytes .../org.eclipse.jdt.core/1672833549.index | Bin 0 -> 56629 bytes .../org.eclipse.jdt.core/1726734394.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/1779725183.index | Bin 0 -> 1358498 bytes .../org.eclipse.jdt.core/1795848935.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/180256137.index | Bin 0 -> 123734 bytes .../org.eclipse.jdt.core/1900061378.index | Bin 0 -> 90998 bytes .../org.eclipse.jdt.core/1913127049.index | Bin 0 -> 78055 bytes .../org.eclipse.jdt.core/1917620965.index | Bin 0 -> 31216 bytes .../org.eclipse.jdt.core/2056129497.index | Bin 0 -> 1384687 bytes .../org.eclipse.jdt.core/2137645919.index | Bin 0 -> 60719 bytes .../org.eclipse.jdt.core/218129733.index | Bin 0 -> 55782 bytes .../org.eclipse.jdt.core/220872954.index | Bin 0 -> 426527 bytes .../org.eclipse.jdt.core/2224137472.index | Bin 0 -> 65770 bytes .../org.eclipse.jdt.core/2250313712.index | Bin 0 -> 201755 bytes .../org.eclipse.jdt.core/2271440056.index | Bin 0 -> 6688 bytes .../org.eclipse.jdt.core/2319252545.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/232615225.index | Bin 0 -> 283236 bytes .../org.eclipse.jdt.core/2383619051.index | Bin 0 -> 1162680 bytes .../org.eclipse.jdt.core/2398967601.index | Bin 0 -> 879262 bytes .../org.eclipse.jdt.core/2540007405.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/2656071119.index | Bin 0 -> 17511 bytes .../org.eclipse.jdt.core/2678142691.index | Bin 0 -> 19089 bytes .../org.eclipse.jdt.core/2678862280.index | Bin 0 -> 1066647 bytes .../org.eclipse.jdt.core/2692185391.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/2694812966.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/2695614958.index | Bin 0 -> 453318 bytes .../org.eclipse.jdt.core/2714627633.index | Bin 0 -> 1168870 bytes .../org.eclipse.jdt.core/2764745181.index | Bin 0 -> 660027 bytes .../org.eclipse.jdt.core/2783619765.index | Bin 0 -> 635115 bytes .../org.eclipse.jdt.core/2796011814.index | Bin 0 -> 99224 bytes .../org.eclipse.jdt.core/2824089566.index | Bin 0 -> 130662 bytes .../org.eclipse.jdt.core/2827973200.index | Bin 0 -> 168363 bytes .../org.eclipse.jdt.core/2859019627.index | Bin 0 -> 312988 bytes .../org.eclipse.jdt.core/2922473502.index | Bin 0 -> 70383 bytes .../org.eclipse.jdt.core/293692079.index | Bin 0 -> 150531 bytes .../org.eclipse.jdt.core/3002676364.index | Bin 0 -> 35797 bytes .../org.eclipse.jdt.core/3040908808.index | Bin 0 -> 350048 bytes .../org.eclipse.jdt.core/3058499030.index | Bin 0 -> 367326 bytes .../org.eclipse.jdt.core/3064462347.index | Bin 0 -> 107717 bytes .../org.eclipse.jdt.core/306466308.index | Bin 0 -> 20951 bytes .../org.eclipse.jdt.core/3068640910.index | Bin 0 -> 179608 bytes .../org.eclipse.jdt.core/3072575981.index | Bin 0 -> 70911 bytes .../org.eclipse.jdt.core/3160633646.index | Bin 0 -> 7669365 bytes .../org.eclipse.jdt.core/318857592.index | Bin 0 -> 7175285 bytes .../org.eclipse.jdt.core/3258128499.index | Bin 0 -> 72009 bytes .../org.eclipse.jdt.core/3260877587.index | Bin 0 -> 271873 bytes .../org.eclipse.jdt.core/326362780.index | Bin 0 -> 295233 bytes .../org.eclipse.jdt.core/3277901512.index | Bin 0 -> 13849 bytes .../org.eclipse.jdt.core/3300596117.index | Bin 0 -> 329223 bytes .../org.eclipse.jdt.core/3315054708.index | Bin 0 -> 17385 bytes .../org.eclipse.jdt.core/335523926.index | Bin 0 -> 34834 bytes .../org.eclipse.jdt.core/3361718716.index | Bin 0 -> 177047 bytes .../org.eclipse.jdt.core/336683849.index | Bin 0 -> 119019 bytes .../org.eclipse.jdt.core/3423988565.index | Bin 0 -> 5781 bytes .../org.eclipse.jdt.core/342503077.index | Bin 0 -> 4893544 bytes .../org.eclipse.jdt.core/3470739580.index | Bin 0 -> 17577 bytes .../org.eclipse.jdt.core/3609118701.index | Bin 0 -> 12422 bytes .../org.eclipse.jdt.core/3701126133.index | Bin 0 -> 155650 bytes .../org.eclipse.jdt.core/3710301233.index | Bin 0 -> 12996 bytes .../org.eclipse.jdt.core/3778645487.index | Bin 0 -> 27787162 bytes .../org.eclipse.jdt.core/3789770329.index | Bin 0 -> 219456 bytes .../org.eclipse.jdt.core/3859523709.index | Bin 0 -> 32886 bytes .../org.eclipse.jdt.core/3879748754.index | Bin 0 -> 62478 bytes .../org.eclipse.jdt.core/3936350590.index | Bin 0 -> 1829638 bytes .../org.eclipse.jdt.core/4013218907.index | Bin 0 -> 66720 bytes .../org.eclipse.jdt.core/4043258483.index | Bin 0 -> 3093 bytes .../org.eclipse.jdt.core/414322597.index | Bin 0 -> 7746 bytes .../org.eclipse.jdt.core/4164071572.index | Bin 0 -> 419985 bytes .../org.eclipse.jdt.core/4210719947.index | Bin 0 -> 1141549 bytes .../org.eclipse.jdt.core/4220953323.index | Bin 0 -> 1092455 bytes .../org.eclipse.jdt.core/4253143033.index | Bin 0 -> 5129 bytes .../org.eclipse.jdt.core/426472251.index | Bin 0 -> 36627 bytes .../org.eclipse.jdt.core/495217312.index | Bin 0 -> 408838 bytes .../org.eclipse.jdt.core/547255395.index | Bin 0 -> 5627 bytes .../org.eclipse.jdt.core/614459109.index | Bin 0 -> 235568 bytes .../org.eclipse.jdt.core/618844005.index | Bin 0 -> 188000 bytes .../org.eclipse.jdt.core/629102043.index | Bin 0 -> 4060 bytes .../org.eclipse.jdt.core/650680804.index | Bin 0 -> 224330 bytes .../org.eclipse.jdt.core/657737655.index | Bin 0 -> 51459 bytes .../org.eclipse.jdt.core/692810719.index | Bin 0 -> 19531 bytes .../org.eclipse.jdt.core/71018339.index | Bin 0 -> 135368 bytes .../org.eclipse.jdt.core/723019874.index | Bin 0 -> 265667 bytes .../org.eclipse.jdt.core/730441272.index | Bin 0 -> 249995 bytes .../org.eclipse.jdt.core/749499245.index | Bin 0 -> 370017 bytes .../org.eclipse.jdt.core/759997126.index | Bin 0 -> 25 bytes .../org.eclipse.jdt.core/795630584.index | Bin 0 -> 83616 bytes .../org.eclipse.jdt.core/840997828.index | Bin 0 -> 162256 bytes .../org.eclipse.jdt.core/896452946.index | Bin 0 -> 784255 bytes .../org.eclipse.jdt.core/94208047.index | Bin 0 -> 50155 bytes .../org.eclipse.jdt.core/959639723.index | Bin 0 -> 245529 bytes .../assumedExternalFilesCache | Bin 0 -> 4 bytes .../org.eclipse.jdt.core/externalFilesCache | Bin 0 -> 10681 bytes .../externalLibsTimeStamps | Bin 0 -> 11084 bytes .../org.eclipse.jdt.core/javaLikeNames.txt | 2 + .../org.eclipse.jdt.core/nonChainingJarsCache | Bin 0 -> 10236 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 111 + .../variablesAndContainers.dat | Bin 0 -> 52952 bytes .../dialog_settings.xml | 7 + .../org.eclipse.jdt.launching/.install.xml | 4 + .../libraryInfos.xml | 22 + .../org.eclipse.jdt.ui/OpenTypeHistory.xml | 8 + .../QualifiedTypeNameHistory.xml | 53 + .../org.eclipse.jdt.ui/dialog_settings.xml | 125 + .../org.eclipse.jdt.ui/jdt-images/0.png | Bin 0 -> 294 bytes .../org.eclipse.jdt.ui/jdt-images/1.png | Bin 0 -> 345 bytes .../org.eclipse.jdt.ui/jdt-images/2.png | Bin 0 -> 635 bytes .../org.eclipse.jdt.ui/jdt-images/3.png | Bin 0 -> 184 bytes .../org.eclipse.jdt.ui/jdt-images/4.png | Bin 0 -> 386 bytes .../2018/3/12/refactorings.history | 3 + .../2018/3/12/refactorings.index | 2 + .../2018/3/11/refactorings.history | 3 + .../2018/3/11/refactorings.index | 4 + .../2018/3/12/refactorings.history | 3 + .../2018/3/12/refactorings.index | 5 + .../2018/3/11/refactorings.history | 3 + .../2018/3/11/refactorings.index | 11 + .../2018/3/11/refactorings.history | 3 + .../2018/3/11/refactorings.index | 4 + .../dialog_settings.xml | 7 + .../dialog_settings.xml | 105 + .../DataSimulator.lifecyclemapping | Bin 0 -> 17977 bytes .../connectionstatistics.lifecyclemapping | Bin 0 -> 19176 bytes .../consolidateddetails.lifecyclemapping | Bin 0 -> 19176 bytes .../mapdataservice.lifecyclemapping | Bin 0 -> 19176 bytes .../05b0fe8524860bd73cbb07ef30fb34cc/_a.cfs | Bin 0 -> 298 bytes .../05b0fe8524860bd73cbb07ef30fb34cc/_a_1.del | Bin 0 -> 9 bytes .../05b0fe8524860bd73cbb07ef30fb34cc/_b.cfs | Bin 0 -> 298 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments_c | Bin 0 -> 88 bytes .../write.lock | 0 .../4e6b7efee1fa80d7f7539d2ae1391e33/_4g.cfs | Bin 0 -> 62392 bytes .../_4g_1.del | Bin 0 -> 25 bytes .../4e6b7efee1fa80d7f7539d2ae1391e33/_4h.cfs | Bin 0 -> 307 bytes .../_4h_1.del | Bin 0 -> 9 bytes .../4e6b7efee1fa80d7f7539d2ae1391e33/_4i.cfs | Bin 0 -> 871 bytes .../4e6b7efee1fa80d7f7539d2ae1391e33/_4j.cfs | Bin 0 -> 307 bytes .../_4j_1.del | Bin 0 -> 9 bytes .../4e6b7efee1fa80d7f7539d2ae1391e33/_4k.cfs | Bin 0 -> 307 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments_46 | Bin 0 -> 183 bytes .../write.lock | 0 .../830bc118332e77292949ed1e6d2fabe0/_a.cfs | Bin 0 -> 1357 bytes .../830bc118332e77292949ed1e6d2fabe0/_a_3.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_b.cfs | Bin 0 -> 274 bytes .../830bc118332e77292949ed1e6d2fabe0/_b_1.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_c.cfs | Bin 0 -> 274 bytes .../830bc118332e77292949ed1e6d2fabe0/_c_1.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_d.cfs | Bin 0 -> 759 bytes .../830bc118332e77292949ed1e6d2fabe0/_e.cfs | Bin 0 -> 404 bytes .../830bc118332e77292949ed1e6d2fabe0/_f.cfs | Bin 0 -> 274 bytes .../830bc118332e77292949ed1e6d2fabe0/_f_1.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_g.cfs | Bin 0 -> 274 bytes .../830bc118332e77292949ed1e6d2fabe0/_g_1.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_h.cfs | Bin 0 -> 274 bytes .../830bc118332e77292949ed1e6d2fabe0/_h_1.del | Bin 0 -> 9 bytes .../830bc118332e77292949ed1e6d2fabe0/_i.cfs | Bin 0 -> 274 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments_j | Bin 0 -> 298 bytes .../write.lock | 0 .../org.eclipse.m2e.core/workspaceState.ser | Bin 0 -> 80986 bytes .../workspacestate.properties | 10 + .../DataSimulator.container | Bin 0 -> 3815 bytes .../connectionstatistics.container | Bin 0 -> 23125 bytes .../consolidateddetails.container | Bin 0 -> 22851 bytes .../mapdataservice.container | Bin 0 -> 22856 bytes .../launches/m2conf951621551597968172.tmp | 44 + .../logback.1.7.0.20160603-1933.xml | 43 + .../org.eclipse.mylyn.github.ui/avatars.ser | Bin 0 -> 175 bytes .../org.eclipse.oomph.setup/workspace.setup | 6 + ...al.core.RSELocalConnectionInitializer.mark | 0 .../FP.local.files_0/node.properties | 57 + .../H.local_16/node.properties | 25 + .../PRF.desktop-bmnrnn0_32638/node.properties | 7 + .../org.eclipse.search/dialog_settings.xml | 114 + .../.executables/data.properties | 6 + .../dialog_settings.xml | 5 + .../org.eclipse.ui.ide/dialog_settings.xml | 120 + .../dialog_settings.xml | 31 + .../dialog_settings.xml | 21 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../org.eclipse.ui/dialog_settings.xml | 3 + .../externalLibsTimeStamps | Bin 0 -> 633 bytes .../libraries/baseBrowserLibrary.js | 5393 +++++++++++++++++ .../libraries/browserWindow.js | 618 ++ .../libraries/dom5.js | 922 +++ .../libraries/system.js | 1458 +++++ .../libraries/xhr.js | 104 + .../variablesAndContainers.dat | Bin 0 -> 12 bytes .../OpenTypeHistory.xml | 2 + .../QualifiedTypeNameHistory.xml | 2 + .../org.eclipse.wst.server.core/servers.xml | 4 + .../task-tags.properties | 3 + .../dialog_settings.xml | 5 + .../default_catalog.xml | 5 + .../system_catalog.xml | 169 + .../.state | 6 + .../metadata/.state | Bin 0 -> 51275 bytes .../properties/.state | Bin 0 -> 1002 bytes .../dialog_settings.xml | 7 + .../dialog_settings.xml | 7 + .../typegraphs/2.0.0.RELEASE | 1 + .../dashboard.feeds.blogs/-549550714.xml | 1475 +++++ .../dashboard.feeds.update/623127801.xml | 40 + .metadata/version.ini | 3 + .../identified-project-coordinates.json | 1 + .recommenders/caches/manual-mappings.json | 1 + .../_a.fdt | Bin 0 -> 5021699 bytes .../_a.fdx | Bin 0 -> 92028 bytes .../_a.fnm | 3 + .../_a.frq | 1109 ++++ .../_a.nrm | 1 + .../_a.prx | Bin 0 -> 129208 bytes .../_a.tii | Bin 0 -> 21142 bytes .../_a.tis | Bin 0 -> 1324039 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments_b | Bin 0 -> 244 bytes .../write.lock | 0 RemoteSystemsTempFiles/.project | 12 + Servers/.project | 11 + .../org.eclipse.wst.server.core.prefs | 3 + .../catalina.policy | 257 + .../catalina.properties | 252 + .../context.xml | 15 + .../jmxremote.access | 2 + .../jmxremote.password | 2 + .../server.xml | 23 + .../tomcat-users.xml | 2 + .../web.xml | 4548 ++++++++++++++ .../ConnectionStatisticsController.java | 27 +- .../smartwater/connection/domain/Data.java | 22 +- .../domain/WaterConsumptionResponseData.java | 33 + .../service/ConnectionStatisticsService.java | 31 +- mysql.sql | 72 + 728 files changed, 76776 insertions(+), 36 deletions(-) create mode 100644 .metadata/.lock create mode 100644 .metadata/.mylyn/.taskListIndex/segments.gen create mode 100644 .metadata/.mylyn/.taskListIndex/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.compare/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/10212bdd762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/60be039f97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/1082bbb3b92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/a07f72be2f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/b028620d512c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/11/3040f116792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/12/300709a8772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/12/a09d9222772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/12/d0fdbf56322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/30b1b55fba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/30da1bbe9a2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/e0b133a0842b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/70f8299afd2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/16/40c44f4aea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/17/20a97b91162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/18/20ca66439f2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/50bb4bac452c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/a0570334eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/306310dbcd2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/d0196520782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1d/007d0662ee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1d/c0725a5beb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1e/a01628d4112900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1f/30f81df4b72d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2/a0cfc4bc2f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/21/70d9ec8f502c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/21/e0f7cda9152900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/24/3013fdffbb2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/25/b0f9f8942f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/60fe7d98772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/101822082e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/1019b3a7842b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2b/d0facc33ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2c/80d2a586eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2c/e0e21d9a9f2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/4074b0b5b92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2e/108e65c6cd2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2e/70d0e89e152900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2e/906184eacd2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/b0dff843992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/807303ce3d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/d07f0370302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/30/f0a34632212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/70589016ed2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/80b9c133772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/c082e327ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/33/80561f88852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/d0acb428792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/36/d0949796fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/302b68a4312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/c0a44eac852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/0077340e792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/306633ab842b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/705d296c312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/a0f864e5472c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/e0fe5e4c502c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/b0974d7b3d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3d/909d2c8a832b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3e/30c7a57dfb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/40ac8e92362c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/e021b9057f2b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/f0e191cfcd2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4/703f75ac0d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/40190c00ba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/60769fbeea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/e0450ebefb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/e051f09ca12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/20051409ec2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/43/60b5c996ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/44/10a0ec10322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/45/20fcfcff0b2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/45/f00c5f55a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/46/10564b2b302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/208012b8b92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/a09f2d9a762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4a/00d376d5eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4d/302c9ed6312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4d/50cf87e2762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4d/f02ad9af0d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4e/20cc2f8c97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4e/f02a8914362c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/80922cfe772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/806fcd8c992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/a02fe5619f2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/d0c8280d782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/e0dc4dee312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/52/4050f512512c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/00503c45162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/30f48cb8a12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/70f070241a2900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/2031fd5deb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/301d03fd122900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/70817ed72e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/a0f93f6efb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5a/f0d9ff82962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5b/808b641c1a2900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5c/709ee84d162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/00cd1088132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/307d7ceb5c2b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/00fdaff4eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/90075c8beb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/c05be952ef2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/f0899e2b212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5f/80159784772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5f/c0f41fe9bb2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/3075cf0eec2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/f0a9d378302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/603e69e5472c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/70500149ba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/b0c27656992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/61/10e924a8762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/61/90897935302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/61/e08c4310132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/20236f03852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/007b2ac5962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/a087c807132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/65/204bc001792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/66/3075d252eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/66/b0dfd9e897260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/67/0019c9923d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/68/80b03c91992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/69/50593dcfeb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/69/806c61b7a12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/69/d014b4effb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6a/f08cc63dee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6b/301ce604792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6c/90830c3d212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6c/b07e6a6ced2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/a02b00ab0d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/a0e1ef5b302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/7081038a962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/e0563813792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/e05fb1bf3d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7/905c66c8ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/70/1042ab6cba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/70/80106135992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/71/70eb50ac452c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/71/70f64820a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/71/80938f18a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/10dab312782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/40f325ae97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/f05627da762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/74/0071ef10b82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/74/90cde18b762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/75/00204218512c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/75/d04a8495ef2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/77/00d0b3ffeb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/9049c63d852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/00642909302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/e074af40162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7b/c0ec7cc9b82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7c/508630c6072d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7c/a0281a89322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7c/e090101f792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/900cf398a12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/f0c0df30212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7e/40ee536ba02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b66bad302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7f/209464310d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7f/402a28c93d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7f/50a9f525782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7f/c00fa836362c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/80/407b7cbab92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/81/10007c129a2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/81/30ce71c497260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/003a791c512c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/85/b0b893d2fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/87/30eb6c1b322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/87/b03749fe762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/88/405583fd97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/88/708b1ccb962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8a/10738b43842b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8c/10a1b575302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8c/403ed463772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/802f981dba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/b0df4118212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8e/40b551002f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8f/804dff1afc2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/90641cc8772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/90/60af6d4d772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/40d2bea0312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/b01bbff9762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/92/70abe09b132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/92/80aa68db0b2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/94/10b64a3e992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/f0370eb6852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/96/309ab2be112d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/100005f1512c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/98/60a607c2762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/98/70a0e2fa7e2b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/99/20016b35ef2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/c0dd6270b82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9c/b02bb314372c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9d/10e326ab842b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/50ea9b89782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/909fb54f322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/b0c8526a312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9f/80943163992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9f/9022780dec2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9f/90d17006ec2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a/a08fe125792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a1/e04b1e291a2900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a2/c0c2ccf397260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a4/4045d230782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a4/500c481a792e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a6/20e5ec89362c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a6/e0f85b953d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a7/50c50232ee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a9/904d1429fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/30896caa832b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/60d8524b162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/90d8caa6ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/20e362e1eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/f06dc1d0302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/af/a03c9c6eba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b/602985ff212c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b/d003c143ba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b0/20b8d7c9f02800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b0/304d65e9312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b0/a05cf6de302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/2048341a772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/60e92c1da02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/607b2e7f3d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/e0152741162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b5/7090a592772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b6/b088a642312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b6/f06e99ea772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ba/4028bdc9112900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/e03516ad772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bd/10ab9178132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/be/e08e3ae89c2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bf/50619183322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bf/c04d285d132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bf/e089d99f772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c/306d09d8fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c/b070abc6eb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/804b6064ee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/b0015062262c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/d0fb66d8f02800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/e0ccbce3762e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/700c2f48322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/b05304f45c2b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c2/f08629062f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/501006b8852b00181358968824499f38 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/e002cc68162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/009c07a42e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/90b4642aba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/d006f6de962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/d0996c46ee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c5/10290991782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c9/e0419a8b132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c9/e0c69bd3ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/20380815b92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/b0b92e19a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/d04afdf72e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cd/90042faba12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cd/b0d7fd49a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/50aa7ee0302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ad08afea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d/f005b88e2f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d1/00aef0189a2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d2/d0de6d17fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d3/30f2fdff97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d4/5026a1b1342c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/100976b6072d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/2003500db82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/6065e46cb82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/70790587322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/907e4f4ea02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d7/50bb6c6dee2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d7/b0648310372c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/4029f615772e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/407c33942e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/00795e15ba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/3012410a782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/908b903f302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/e01cfe3dbe2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/5083184d2e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/906f1d060c2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/a030a94d992d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/a07469f1b92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/d065f83a302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dd/e060a62f322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/de/2047ab7b132900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/de/20a392c5ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/4021f8e8962d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/a077ed350d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/b0740edd2e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e0/90c504c8112d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e0/a0cdc434322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e1/7017dd5d162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/604553e5472c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/d083769c97260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/d0ef6c0f302c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e3/50d10f17a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e3/a012b4efec2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e4/109d1de2ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e5/a019f7812f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e5/c056a9142e2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e5/f053768a162900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e6/b0735490362c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e6/f0f62378ba2d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/502f8390fb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ea/90d6905df22800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ea/b03dde4cf22800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/30ccb80ffc2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/f0071473a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ec/c09cb3cb112d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ec/d03e9c462f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ec/f0cd9d4c212900181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ed/b0ef3d84ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/202fb4f22f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/e0ba93be3d2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/90cffd0398260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/f0add5f9262c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f/8089a64ca02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f/c00163ebeb2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f0/507b5568a02d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f0/b0fe9edbb92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/10c921eeea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/5068a1f9b72d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/d096d17497260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/f03c9a1cb92d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f3/40f13dcfeb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f3/50344cb2ed2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f4/a0791770782e001814c0d2815b26d8fe create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f4/d01cd4380d2d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f5/70bdaee8ec2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f6/d064cd70072d001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f7/308b28b82f2c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f7/70fcf8f697260018180ee1d7e30fe76e create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f8/00493851f22800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f8/8011e3c9ea2800181ac2881b40ece91c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fb/70c72e01322c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fc/40c3b40eb82d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fc/f092a823312c00181665d74572d9d988 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/008716fffb2c001812c6cf03ff4f7112 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/502e31baa12d0018111effc5980105bf create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/af/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/2b/aa/fc/b5/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/ba/aa/fc/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/ba/aa/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/org.eclipse.jdt.core/state.dat create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/e4/b9/22/81/f6/2b/12/22/3c/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/e4/b9/22/81/f6/2b/12/22/9c/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/e4/b9/22/81/f6/2b/12/22/b5/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.markers create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/e4/b9/22/81/f6/2b/12/3c/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/e4/b9/22/81/f6/2b/12/b5/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.markers create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/org.eclipse.jdt.core/state.dat create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.indexes/e4/b9/22/81/f6/2b/12/5c/b5/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/org.eclipse.jdt.core/state.dat create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/9.tree create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 .metadata/.plugins/org.eclipse.core.resources/9.snap create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ajdt.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.debug.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.server.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.ws.service.policy.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.boot.wizard.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.imports.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.configurator.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.frameworks.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.dashboard.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/DataSimulator.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/PopulateData.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics (1).launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails (1).launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice (1).launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/write.lock create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdt create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdx create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fnm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.frq create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.nrm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tii create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tis create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/write.lock create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.fdt create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.fdx create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.fnm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.frq create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.nrm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.tii create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/_0.tis create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/remote-history/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/server-config.json create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/write.lock create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.frq create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/write.lock create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.fdt create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.fdx create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.fnm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.frq create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.nrm create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.tii create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_0.tis create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments_1 create mode 100644 .metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1021361779.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1075874757.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1079038258.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1168908523.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1183045005.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1219017619.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1234405984.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1329982142.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1334412443.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1337243334.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/135737430.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1427570240.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1454368809.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1494953510.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1512413526.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1516196484.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1541055472.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1589171113.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1592057207.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1667173024.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1672833549.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1726734394.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1779725183.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1795848935.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/180256137.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1900061378.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1913127049.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1917620965.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2056129497.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2137645919.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/218129733.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/220872954.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2224137472.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2250313712.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2271440056.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2319252545.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/232615225.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2383619051.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2398967601.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2540007405.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2656071119.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2678142691.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2678862280.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2692185391.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2694812966.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2695614958.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2714627633.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2764745181.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2783619765.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2796011814.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2824089566.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2827973200.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2859019627.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/2922473502.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/293692079.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3002676364.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3040908808.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3058499030.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3064462347.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/306466308.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3068640910.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3072575981.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3160633646.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/318857592.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3258128499.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3260877587.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/326362780.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3277901512.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3300596117.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3315054708.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/335523926.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3361718716.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/336683849.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3423988565.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/342503077.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3470739580.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3609118701.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3701126133.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3710301233.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3778645487.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3789770329.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3859523709.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3879748754.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/3936350590.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4013218907.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4043258483.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/414322597.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4164071572.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4210719947.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4220953323.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/4253143033.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/426472251.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/495217312.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/547255395.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/614459109.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/618844005.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/629102043.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/650680804.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/657737655.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/692810719.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/71018339.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/723019874.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/730441272.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/749499245.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/759997126.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/795630584.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/840997828.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/896452946.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/94208047.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/959639723.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/externalFilesCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat create mode 100644 .metadata/.plugins/org.eclipse.jdt.debug.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.launching/.install.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/1.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/DataSimulator/2018/3/12/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/DataSimulator/2018/3/12/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/connectionstatistics/2018/3/11/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/connectionstatistics/2018/3/11/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/connectionstatistics/2018/3/12/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/connectionstatistics/2018/3/12/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/consolidateddetails/2018/3/11/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/consolidateddetails/2018/3/11/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/mapdataservice/2018/3/11/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/mapdataservice/2018/3/11/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.m2e.core.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/DataSimulator.lifecyclemapping create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/connectionstatistics.lifecyclemapping create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/consolidateddetails.lifecyclemapping create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/mapdataservice.lifecyclemapping create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/_a.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/_a_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/_b.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/segments_c create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/05b0fe8524860bd73cbb07ef30fb34cc/write.lock create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4g.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4g_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4h.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4h_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4i.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4j.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4j_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/_4k.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/segments_46 create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/4e6b7efee1fa80d7f7539d2ae1391e33/write.lock create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_a.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_a_3.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_b.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_b_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_c.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_c_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_d.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_e.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_f.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_f_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_g.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_g_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_h.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_h_1.del create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/_i.cfs create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments_j create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/write.lock create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/workspaceState.ser create mode 100644 .metadata/.plugins/org.eclipse.m2e.core/workspacestate.properties create mode 100644 .metadata/.plugins/org.eclipse.m2e.jdt/DataSimulator.container create mode 100644 .metadata/.plugins/org.eclipse.m2e.jdt/connectionstatistics.container create mode 100644 .metadata/.plugins/org.eclipse.m2e.jdt/consolidateddetails.container create mode 100644 .metadata/.plugins/org.eclipse.m2e.jdt/mapdataservice.container create mode 100644 .metadata/.plugins/org.eclipse.m2e.launching/launches/m2conf951621551597968172.tmp create mode 100644 .metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.7.0.20160603-1933.xml create mode 100644 .metadata/.plugins/org.eclipse.mylyn.github.ui/avatars.ser create mode 100644 .metadata/.plugins/org.eclipse.oomph.setup/workspace.setup create mode 100644 .metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark create mode 100644 .metadata/.plugins/org.eclipse.rse.core/profiles/PRF.desktop-bmnrnn0_32638/FP.local.files_0/node.properties create mode 100644 .metadata/.plugins/org.eclipse.rse.core/profiles/PRF.desktop-bmnrnn0_32638/H.local_16/node.properties create mode 100644 .metadata/.plugins/org.eclipse.rse.core/profiles/PRF.desktop-bmnrnn0_32638/node.properties create mode 100644 .metadata/.plugins/org.eclipse.search/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.tm.terminal.view.ui/.executables/data.properties create mode 100644 .metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 .metadata/.plugins/org.eclipse.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/externalLibsTimeStamps create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/libraries/baseBrowserLibrary.js create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/libraries/browserWindow.js create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/libraries/dom5.js create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/libraries/system.js create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/libraries/xhr.js create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.core/variablesAndContainers.dat create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.ui/OpenTypeHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.jsdt.ui/QualifiedTypeNameHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.server.core/servers.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.sse.core/task-tags.properties create mode 100644 .metadata/.plugins/org.eclipse.wst.sse.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.xml.core/default_catalog.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.xml.core/system_catalog.xml create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.aop.core/.state create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.beans.core.metadata/metadata/.state create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.beans.core.metadata/properties/.state create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.boot.properties.editor.yaml/dialog_settings.xml create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.boot.properties.editor/dialog_settings.xml create mode 100644 .metadata/.plugins/org.springframework.ide.eclipse.boot/typegraphs/2.0.0.RELEASE create mode 100644 .metadata/.plugins/org.springsource.ide.eclipse.dashboard.ui/feeds/dashboard.feeds.blogs/-549550714.xml create mode 100644 .metadata/.plugins/org.springsource.ide.eclipse.dashboard.ui/feeds/dashboard.feeds.update/623127801.xml create mode 100644 .metadata/version.ini create mode 100644 .recommenders/caches/identified-project-coordinates.json create mode 100644 .recommenders/caches/manual-mappings.json create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.fdt create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.fdx create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.fnm create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.frq create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.nrm create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.prx create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.tii create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/_a.tis create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/segments.gen create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/segments_b create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_neon_/write.lock create mode 100644 RemoteSystemsTempFiles/.project create mode 100644 Servers/.project create mode 100644 Servers/.settings/org.eclipse.wst.server.core.prefs create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/catalina.policy create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/catalina.properties create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/context.xml create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/jmxremote.access create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/jmxremote.password create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/server.xml create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/tomcat-users.xml create mode 100644 Servers/Pivotal tc Server Developer Edition v3.2-config/web.xml create mode 100644 connectionstatistics/src/main/java/com/techolution/mauritius/smartwater/connection/domain/WaterConsumptionResponseData.java create mode 100644 mysql.sql diff --git a/.metadata/.lock b/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.mylyn/.taskListIndex/segments.gen b/.metadata/.mylyn/.taskListIndex/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..63a7ec9a3ce3e4c844ffb7c8dd88e6eb3ff32ef5 GIT binary patch literal 20 QcmezW|NlP*2w;TK07=6G{r~^~ literal 0 HcmV?d00001 diff --git a/.metadata/.mylyn/.taskListIndex/segments_1 b/.metadata/.mylyn/.taskListIndex/segments_1 new file mode 100644 index 0000000000000000000000000000000000000000..3a54105a80ea814c92b0f28cf24654974b0eb880 GIT binary patch literal 32 acmezW|NmD82F4`2EuX3x&_LDcs0{$Tya@yV literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.compare/dialog_settings.xml b/.metadata/.plugins/org.eclipse.compare/dialog_settings.xml new file mode 100644 index 0000000..ce15355 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.compare/dialog_settings.xml @@ -0,0 +1,9 @@ + +
+
+ + + + +
+
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/10212bdd762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/0/10212bdd762e001814c0d2815b26d8fe new file mode 100644 index 0000000..f2c33a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/10212bdd762e001814c0d2815b26d8fe @@ -0,0 +1,35 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + private String name; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getSeries() { + return series; + } + + public void setSeries(List series) { + this.series = series; + } + + public List getData() { + return series; + } + + public void setData(List data) { + this.series = data; + } + + private List series; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/60be039f97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/0/60be039f97260018180ee1d7e30fe76e new file mode 100644 index 0000000..831d8f1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/60be039f97260018180ee1d7e30fe76e @@ -0,0 +1,89 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/1082bbb3b92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/1/1082bbb3b92d0018111effc5980105bf new file mode 100644 index 0000000..e31922a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/1082bbb3b92d0018111effc5980105bf @@ -0,0 +1,332 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/a07f72be2f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/a07f72be2f2c00181665d74572d9d988 new file mode 100644 index 0000000..b12b5a5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/a07f72be2f2c00181665d74572d9d988 @@ -0,0 +1,125 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal) + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/b028620d512c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/b028620d512c00181665d74572d9d988 new file mode 100644 index 0000000..aee708d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/b028620d512c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + /*influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/3040f116792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/11/3040f116792e001814c0d2815b26d8fe new file mode 100644 index 0000000..655a822 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/3040f116792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + //Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/12/300709a8772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/12/300709a8772e001814c0d2815b26d8fe new file mode 100644 index 0000000..d54352d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/12/300709a8772e001814c0d2815b26d8fe @@ -0,0 +1,30 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + + private int devid; + private String sensor_locationname; + private Date name; + private double value; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/12/a09d9222772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/12/a09d9222772e001814c0d2815b26d8fe new file mode 100644 index 0000000..234ff11 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/12/a09d9222772e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(CONSUMPTION); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/12/d0fdbf56322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/12/d0fdbf56322c00181665d74572d9d988 new file mode 100644 index 0000000..4af556d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/12/d0fdbf56322c00181665d74572d9d988 @@ -0,0 +1,9 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime,int incrementtime)throws ParseException,InterruptedException; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/30b1b55fba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/13/30b1b55fba2d0018111effc5980105bf new file mode 100644 index 0000000..9d1228d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/30b1b55fba2d0018111effc5980105bf @@ -0,0 +1,374 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/30da1bbe9a2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/13/30da1bbe9a2d0018111effc5980105bf new file mode 100644 index 0000000..26508a2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/30da1bbe9a2d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/e0b133a0842b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/13/e0b133a0842b00181358968824499f38 new file mode 100644 index 0000000..995e8a8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/e0b133a0842b00181358968824499f38 @@ -0,0 +1,55 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + public Long getReading() { + return reading; + } + public void setReading(Long reading) { + this.reading = reading; + } + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/70f8299afd2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/70f8299afd2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..0f5ac05 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/70f8299afd2c001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/40c44f4aea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/16/40c44f4aea2800181ac2881b40ece91c new file mode 100644 index 0000000..1d991a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/40c44f4aea2800181ac2881b40ece91c @@ -0,0 +1,106 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + + log.debug("List size returned is:"+availableConnections.length); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/17/20a97b91162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/17/20a97b91162900181ac2881b40ece91c new file mode 100644 index 0000000..6cb8911 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/17/20a97b91162900181ac2881b40ece91c @@ -0,0 +1,47 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/20ca66439f2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/18/20ca66439f2d0018111effc5980105bf new file mode 100644 index 0000000..dabf4ab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/20ca66439f2d0018111effc5980105bf @@ -0,0 +1,381 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/50bb4bac452c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/50bb4bac452c00181665d74572d9d988 new file mode 100644 index 0000000..54afa1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/50bb4bac452c00181665d74572d9d988 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/a0570334eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/19/a0570334eb2800181ac2881b40ece91c new file mode 100644 index 0000000..1ea352d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/a0570334eb2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + ArrayList availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/306310dbcd2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/306310dbcd2d0018111effc5980105bf new file mode 100644 index 0000000..ba34519 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/306310dbcd2d0018111effc5980105bf @@ -0,0 +1,58 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; + + +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"http://localhost:8585"}, maxAge = 4800, allowCredentials = "false") +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + dfj.setStatus("REQUEST_SUBMITTED"); + data.setDfj(dfj); + return data; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0196520782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0196520782e001814c0d2815b26d8fe new file mode 100644 index 0000000..a20b033 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0196520782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/007d0662ee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/007d0662ee2800181ac2881b40ece91c new file mode 100644 index 0000000..2ba7d82 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/007d0662ee2800181ac2881b40ece91c @@ -0,0 +1,115 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + Object[] returnedobjects = (Object[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + + List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/c0725a5beb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/c0725a5beb2800181ac2881b40ece91c new file mode 100644 index 0000000..b9c0b24 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/c0725a5beb2800181ac2881b40ece91c @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + ArrayList availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a01628d4112900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a01628d4112900181ac2881b40ece91c new file mode 100644 index 0000000..95bc76c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a01628d4112900181ac2881b40ece91c @@ -0,0 +1,5 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +public class ConnectDataController { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1f/30f81df4b72d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/30f81df4b72d0018111effc5980105bf new file mode 100644 index 0000000..03ad329 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/30f81df4b72d0018111effc5980105bf @@ -0,0 +1,299 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0cfc4bc2f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0cfc4bc2f2c00181665d74572d9d988 new file mode 100644 index 0000000..a1d73f7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0cfc4bc2f2c00181665d74572d9d988 @@ -0,0 +1,125 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", value) + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/70d9ec8f502c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/21/70d9ec8f502c00181665d74572d9d988 new file mode 100644 index 0000000..10917d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/70d9ec8f502c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + /*influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/e0f7cda9152900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/21/e0f7cda9152900181ac2881b40ece91c new file mode 100644 index 0000000..7f19597 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/e0f7cda9152900181ac2881b40ece91c @@ -0,0 +1,35 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@RequestMapping String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/24/3013fdffbb2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/24/3013fdffbb2d0018111effc5980105bf new file mode 100644 index 0000000..c5b70a0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/24/3013fdffbb2d0018111effc5980105bf @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.domain; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="connection_details") +public class MeterConnection implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + @Id + private long id; + private long consumer_id; + public long getCurrentbatteryhealth() { + return currentbatteryhealth; + } + public void setCurrentbatteryhealth(long currentbatteryhealth) { + this.currentbatteryhealth = currentbatteryhealth; + } + public long getCurrentstatus() { + return currentstatus; + } + public void setCurrentstatus(long currentstatus) { + this.currentstatus = currentstatus; + } + private long customer_id; + private long house_id; + private long vendor_id; + private long block_id; + private long currentbatteryhealth; + private long currentstatus; + private String house_namenum; + private boolean isprivate; + public long getId() { + return id; + } + public void setId(long id) { + this.id = id; + } + public long getConsumer_id() { + return consumer_id; + } + public void setConsumer_id(long consumer_id) { + this.consumer_id = consumer_id; + } + public long getCustomer_id() { + return customer_id; + } + public void setCustomer_id(long customer_id) { + this.customer_id = customer_id; + } + public long getHouse_id() { + return house_id; + } + public void setHouse_id(long house_id) { + this.house_id = house_id; + } + public long getVendor_id() { + return vendor_id; + } + public void setVendor_id(long vendor_id) { + this.vendor_id = vendor_id; + } + public long getBlock_id() { + return block_id; + } + public void setBlock_id(long block_id) { + this.block_id = block_id; + } + public String getHouse_namenum() { + return house_namenum; + } + public void setHouse_namenum(String house_namenum) { + this.house_namenum = house_namenum; + } + public boolean isIsprivate() { + return isprivate; + } + public void setIsprivate(boolean isprivate) { + this.isprivate = isprivate; + } + + public double getDevice_latitude() { + return device_latitude; + } + public void setDevice_latitude(double device_latitude) { + this.device_latitude = device_latitude; + } + public double getDevice_longitude() { + return device_longitude; + } + public void setDevice_longitude(double device_longitude) { + this.device_longitude = device_longitude; + } + public long getCurrent_usage() { + return current_usage; + } + public void setCurrent_usage(long current_usage) { + this.current_usage = current_usage; + } + private double device_latitude; + private double device_longitude; + private long current_usage; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0f9f8942f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0f9f8942f2c00181665d74572d9d988 new file mode 100644 index 0000000..1ae5a49 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0f9f8942f2c00181665d74572d9d988 @@ -0,0 +1,124 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", value) + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/60fe7d98772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/26/60fe7d98772e001814c0d2815b26d8fe new file mode 100644 index 0000000..3b77f80 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/60fe7d98772e001814c0d2815b26d8fe @@ -0,0 +1,41 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + public Date getEndtime() { + return name; + } + public void setEndtime(Date endtime) { + this.name = endtime; + } + public double getWdata() { + return wdata; + } + public void setWdata(double wdata) { + this.wdata = wdata; + } + private int devid; + private String sensor_locationname; + private Date name; + private double wdata; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/101822082e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/101822082e2c00181665d74572d9d988 new file mode 100644 index 0000000..53a82c8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/101822082e2c00181665d74572d9d988 @@ -0,0 +1,28 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + + org.influxdb + influxdb-java + 2.9 + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/1019b3a7842b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/1019b3a7842b00181358968824499f38 new file mode 100644 index 0000000..ee74544 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/1019b3a7842b00181358968824499f38 @@ -0,0 +1,55 @@ + + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + public Long getReading() { + return reading; + } + public void setReading(Long reading) { + this.reading = reading; + } + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/d0facc33ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/d0facc33ea2800181ac2881b40ece91c new file mode 100644 index 0000000..453e42f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/d0facc33ea2800181ac2881b40ece91c @@ -0,0 +1,106 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] availableConnections = (MeterConnection[])responseEntity.getBody(); + + log.debug("List size returned is:"+availableConnections.length); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/80d2a586eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/80d2a586eb2800181ac2881b40ece91c new file mode 100644 index 0000000..9bbffe2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/80d2a586eb2800181ac2881b40ece91c @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/e0e21d9a9f2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/e0e21d9a9f2d0018111effc5980105bf new file mode 100644 index 0000000..5f3f675 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/e0e21d9a9f2d0018111effc5980105bf @@ -0,0 +1,381 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/4074b0b5b92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/4074b0b5b92d0018111effc5980105bf new file mode 100644 index 0000000..c6a2b24 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/4074b0b5b92d0018111effc5980105bf @@ -0,0 +1,333 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId "; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/108e65c6cd2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/108e65c6cd2d0018111effc5980105bf new file mode 100644 index 0000000..2e0f125 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/108e65c6cd2d0018111effc5980105bf @@ -0,0 +1,55 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + dfj.setStatus("REQUEST_SUBMITTED"); + data.setDfj(dfj); + return data; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/70d0e89e152900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/70d0e89e152900181ac2881b40ece91c new file mode 100644 index 0000000..4971148 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/70d0e89e152900181ac2881b40ece91c @@ -0,0 +1,19 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/906184eacd2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/906184eacd2d0018111effc5980105bf new file mode 100644 index 0000000..c54e75d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/906184eacd2d0018111effc5980105bf @@ -0,0 +1,134 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/b0dff843992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/b0dff843992d0018111effc5980105bf new file mode 100644 index 0000000..d49e0e7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/b0dff843992d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + +public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/807303ce3d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/807303ce3d2c00181665d74572d9d988 new file mode 100644 index 0000000..e51f453 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/807303ce3d2c00181665d74572d9d988 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/d07f0370302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/d07f0370302c00181665d74572d9d988 new file mode 100644 index 0000000..afd5aea --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/d07f0370302c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/f0a34632212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/30/f0a34632212900181ac2881b40ece91c new file mode 100644 index 0000000..7e94b2e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/30/f0a34632212900181ac2881b40ece91c @@ -0,0 +1,52 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + return; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/70589016ed2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/32/70589016ed2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..d6ea3dd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/70589016ed2c001812c6cf03ff4f7112 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/80b9c133772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/32/80b9c133772e001814c0d2815b26d8fe new file mode 100644 index 0000000..fc51bc2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/80b9c133772e001814c0d2815b26d8fe @@ -0,0 +1,138 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(CONSUMPTION); + responseData.setSeries(resultList); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/c082e327ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/32/c082e327ea2800181ac2881b40ece91c new file mode 100644 index 0000000..e628877 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/c082e327ea2800181ac2881b40ece91c @@ -0,0 +1,106 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] availableConnections = (MeterConnection[])responseEntity.getBody(); + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/33/80561f88852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/33/80561f88852b00181358968824499f38 new file mode 100644 index 0000000..b61beda --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/33/80561f88852b00181358968824499f38 @@ -0,0 +1,5 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/d0acb428792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/34/d0acb428792e001814c0d2815b26d8fe new file mode 100644 index 0000000..35b8437 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/d0acb428792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + // SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + //Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + // SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + // Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/36/d0949796fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/36/d0949796fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..eb1ef33 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/36/d0949796fb2c001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD) + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/302b68a4312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/302b68a4312c00181665d74572d9d988 new file mode 100644 index 0000000..d7b7a48 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/302b68a4312c00181665d74572d9d988 @@ -0,0 +1,24 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/c0a44eac852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/c0a44eac852b00181358968824499f38 new file mode 100644 index 0000000..2ecfd05 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/c0a44eac852b00181358968824499f38 @@ -0,0 +1,7 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/0077340e792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/39/0077340e792e001814c0d2815b26d8fe new file mode 100644 index 0000000..f45c2cb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/0077340e792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/306633ab842b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/306633ab842b00181358968824499f38 new file mode 100644 index 0000000..66fabfe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/306633ab842b00181358968824499f38 @@ -0,0 +1,55 @@ +package com.techolution.mauritus.data + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + public Long getReading() { + return reading; + } + public void setReading(Long reading) { + this.reading = reading; + } + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/705d296c312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/705d296c312c00181665d74572d9d988 new file mode 100644 index 0000000..33603a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/705d296c312c00181665d74572d9d988 @@ -0,0 +1,17 @@ +package com.techolution.mauritus.data.simulator; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a0f864e5472c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a0f864e5472c00181665d74572d9d988 new file mode 100644 index 0000000..155ce30 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a0f864e5472c00181665d74572d9d988 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/e0fe5e4c502c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/e0fe5e4c502c00181665d74572d9d988 new file mode 100644 index 0000000..b003070 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/e0fe5e4c502c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + /*influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/b0974d7b3d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/b0974d7b3d2c00181665d74572d9d988 new file mode 100644 index 0000000..6b40563 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/b0974d7b3d2c00181665d74572d9d988 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3d/909d2c8a832b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/3d/909d2c8a832b00181358968824499f38 new file mode 100644 index 0000000..0c68a61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3d/909d2c8a832b00181358968824499f38 @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/30c7a57dfb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/30c7a57dfb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..d8a143c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/30c7a57dfb2c001812c6cf03ff4f7112 @@ -0,0 +1,288 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect("http://52.170.92.62:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40ac8e92362c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40ac8e92362c00181665d74572d9d988 new file mode 100644 index 0000000..a2e107d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40ac8e92362c00181665d74572d9d988 @@ -0,0 +1,154 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/e021b9057f2b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/e021b9057f2b00181358968824499f38 new file mode 100644 index 0000000..b95a825 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/e021b9057f2b00181358968824499f38 @@ -0,0 +1,49 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0e191cfcd2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0e191cfcd2d0018111effc5980105bf new file mode 100644 index 0000000..dfa4420 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0e191cfcd2d0018111effc5980105bf @@ -0,0 +1,57 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; + + +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + dfj.setStatus("REQUEST_SUBMITTED"); + data.setDfj(dfj); + return data; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4/703f75ac0d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/4/703f75ac0d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..21cb36f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4/703f75ac0d2d001812c6cf03ff4f7112 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + System.out.println("Start date millis:"+startDate.getTime()); + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + System.out.println("String value is:"+json.toString()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/40190c00ba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/40/40190c00ba2d0018111effc5980105bf new file mode 100644 index 0000000..89f6bc8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/40190c00ba2d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/60769fbeea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/40/60769fbeea2800181ac2881b40ece91c new file mode 100644 index 0000000..997a118 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/60769fbeea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + Arrays.asList(returnedobjects); + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/e0450ebefb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/40/e0450ebefb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..dcf2d38 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/e0450ebefb2c001812c6cf03ff4f7112 @@ -0,0 +1,293 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/e051f09ca12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/40/e051f09ca12d0018111effc5980105bf new file mode 100644 index 0000000..05e7faf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/e051f09ca12d0018111effc5980105bf @@ -0,0 +1,387 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/20051409ec2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/42/20051409ec2800181ac2881b40ece91c new file mode 100644 index 0000000..93c6337 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/20051409ec2800181ac2881b40ece91c @@ -0,0 +1,115 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=new ArrayList(); + availableConnections.addAll(tempList); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/43/60b5c996ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/43/60b5c996ea2800181ac2881b40ece91c new file mode 100644 index 0000000..3a343e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/43/60b5c996ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/10a0ec10322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/44/10a0ec10322c00181665d74572d9d988 new file mode 100644 index 0000000..c8d012c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/44/10a0ec10322c00181665d74572d9d988 @@ -0,0 +1,30 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/45/20fcfcff0b2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/45/20fcfcff0b2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..ccfb765 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/45/20fcfcff0b2d001812c6cf03ff4f7112 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + System.out.println("String value is:"+json.toString()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/45/f00c5f55a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/45/f00c5f55a02d0018111effc5980105bf new file mode 100644 index 0000000..e8070b7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/45/f00c5f55a02d0018111effc5980105bf @@ -0,0 +1,385 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant = + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + instant= Instant.parse( endTimeReturned); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/46/10564b2b302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/46/10564b2b302c00181665d74572d9d988 new file mode 100644 index 0000000..b0e9cc7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/46/10564b2b302c00181665d74572d9d988 @@ -0,0 +1,131 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/208012b8b92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/48/208012b8b92d0018111effc5980105bf new file mode 100644 index 0000000..c238f70 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/48/208012b8b92d0018111effc5980105bf @@ -0,0 +1,333 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/a09f2d9a762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/48/a09f2d9a762e001814c0d2815b26d8fe new file mode 100644 index 0000000..5c773b6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/48/a09f2d9a762e001814c0d2815b26d8fe @@ -0,0 +1,19 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + private List data; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/00d376d5eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/00d376d5eb2800181ac2881b40ece91c new file mode 100644 index 0000000..f816b95 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/00d376d5eb2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + List availableConnections=(List)Collections.unmodifiableList(Arrays.asList(returnedobjects)); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/302c9ed6312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/302c9ed6312c00181665d74572d9d988 new file mode 100644 index 0000000..53e9714 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/302c9ed6312c00181665d74572d9d988 @@ -0,0 +1,25 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/50cf87e2762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/50cf87e2762e001814c0d2815b26d8fe new file mode 100644 index 0000000..9153fc2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/50cf87e2762e001814c0d2815b26d8fe @@ -0,0 +1,29 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + private String name; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getSeries() { + return series; + } + + public void setSeries(List series) { + this.series = series; + } + + + + private List series; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/f02ad9af0d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/f02ad9af0d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..8b0cbad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/f02ad9af0d2d001812c6cf03ff4f7112 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + System.out.println("Start date millis:"+startDate.getTime()); + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + //System.out.println("String value is:"+json.toString()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4e/20cc2f8c97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/20cc2f8c97260018180ee1d7e30fe76e new file mode 100644 index 0000000..c604167 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/20cc2f8c97260018180ee1d7e30fe76e @@ -0,0 +1,86 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4e/f02a8914362c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/f02a8914362c00181665d74572d9d988 new file mode 100644 index 0000000..61b161a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/f02a8914362c00181665d74572d9d988 @@ -0,0 +1,149 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/80922cfe772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/80922cfe772e001814c0d2815b26d8fe new file mode 100644 index 0000000..a7a18ab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/80922cfe772e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/806fcd8c992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/5/806fcd8c992d0018111effc5980105bf new file mode 100644 index 0000000..80b492f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/806fcd8c992d0018111effc5980105bf @@ -0,0 +1,134 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/a02fe5619f2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/5/a02fe5619f2d0018111effc5980105bf new file mode 100644 index 0000000..884968c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/a02fe5619f2d0018111effc5980105bf @@ -0,0 +1,381 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0c8280d782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0c8280d782e001814c0d2815b26d8fe new file mode 100644 index 0000000..3a36c20 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0c8280d782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0dc4dee312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0dc4dee312c00181665d74572d9d988 new file mode 100644 index 0000000..a77b4c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0dc4dee312c00181665d74572d9d988 @@ -0,0 +1,28 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleeptime=Long.valueOf(sleeptime).longValue(); + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/4050f512512c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/52/4050f512512c00181665d74572d9d988 new file mode 100644 index 0000000..21db07c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/4050f512512c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + /*influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/00503c45162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/55/00503c45162900181ac2881b40ece91c new file mode 100644 index 0000000..b25d26f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/00503c45162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/30f48cb8a12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/55/30f48cb8a12d0018111effc5980105bf new file mode 100644 index 0000000..84fdb2c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/30f48cb8a12d0018111effc5980105bf @@ -0,0 +1,389 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/70f070241a2900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/55/70f070241a2900181ac2881b40ece91c new file mode 100644 index 0000000..a9bf78e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/70f070241a2900181ac2881b40ece91c @@ -0,0 +1,44 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private Long flow; + private Double battery; + private Long flowrate; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public long getFlow() { + return flow; + } + public void setFlow(long flow) { + this.flow = flow; + } + public double getBattery() { + return battery; + } + public void setBattery(double battery) { + this.battery = battery; + } + public long getFlowrate() { + return flowrate; + } + public void setFlowrate(long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/2031fd5deb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/56/2031fd5deb2800181ac2881b40ece91c new file mode 100644 index 0000000..6209c61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/2031fd5deb2800181ac2881b40ece91c @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + ArrayList availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/301d03fd122900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/57/301d03fd122900181ac2881b40ece91c new file mode 100644 index 0000000..5ef19ab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/301d03fd122900181ac2881b40ece91c @@ -0,0 +1,8 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ConnectDataController { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/70817ed72e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/70817ed72e2c00181665d74572d9d988 new file mode 100644 index 0000000..8c6b540 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/70817ed72e2c00181665d74572d9d988 @@ -0,0 +1,114 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://yoururl"); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + httpClient.close(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/a0f93f6efb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/59/a0f93f6efb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..b7dce22 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/a0f93f6efb2c001812c6cf03ff4f7112 @@ -0,0 +1,284 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect("http://52.170.92.62:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0d9ff82962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0d9ff82962d0018111effc5980105bf new file mode 100644 index 0000000..f9d140c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0d9ff82962d0018111effc5980105bf @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5b/808b641c1a2900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/808b641c1a2900181ac2881b40ece91c new file mode 100644 index 0000000..8ee95be --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/808b641c1a2900181ac2881b40ece91c @@ -0,0 +1,44 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private long flow; + private double battery; + private long flowrate; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public long getFlow() { + return flow; + } + public void setFlow(long flow) { + this.flow = flow; + } + public double getBattery() { + return battery; + } + public void setBattery(double battery) { + this.battery = battery; + } + public long getFlowrate() { + return flowrate; + } + public void setFlowrate(long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5c/709ee84d162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5c/709ee84d162900181ac2881b40ece91c new file mode 100644 index 0000000..41bd240 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5c/709ee84d162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public void getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/00cd1088132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/00cd1088132900181ac2881b40ece91c new file mode 100644 index 0000000..9d4101c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/00cd1088132900181ac2881b40ece91c @@ -0,0 +1,12 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; + +public class Telemetry implements Serializable { + + private int meter_id; + private long flow; + private double battery; + private long flowrate; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/307d7ceb5c2b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/307d7ceb5c2b00181358968824499f38 new file mode 100644 index 0000000..01f4051 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/307d7ceb5c2b00181358968824499f38 @@ -0,0 +1,44 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private Long flow; + private Double battery; + private Long flowrate; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Double getBattery() { + return battery; + } + public void setBattery(Double battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/00fdaff4eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/00fdaff4eb2800181ac2881b40ece91c new file mode 100644 index 0000000..c9112d3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/00fdaff4eb2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=new ArrayList(); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/90075c8beb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/90075c8beb2800181ac2881b40ece91c new file mode 100644 index 0000000..1671a61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/90075c8beb2800181ac2881b40ece91c @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach((MeterConnection)meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/c05be952ef2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/c05be952ef2800181ac2881b40ece91c new file mode 100644 index 0000000..d1bba5a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/c05be952ef2800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + ArrayList availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/f0899e2b212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/f0899e2b212900181ac2881b40ece91c new file mode 100644 index 0000000..e3c393a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/f0899e2b212900181ac2881b40ece91c @@ -0,0 +1,50 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + return; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5f/80159784772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/80159784772e001814c0d2815b26d8fe new file mode 100644 index 0000000..0ebd701 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/80159784772e001814c0d2815b26d8fe @@ -0,0 +1,32 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class BatteryReadingResponseData implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + private Dfj dfj; + + public Dfj getDfj() { + return dfj; + } + + public void setDfj(Dfj dfj) { + this.dfj = dfj; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + private List data; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5f/c0f41fe9bb2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/c0f41fe9bb2d0018111effc5980105bf new file mode 100644 index 0000000..3318822 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/c0f41fe9bb2d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.parallelStream().forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + long battery=getBatteryForTodayForMeter(connection.getHouse_id()); + connection.setCurrentbatteryhealth(battery); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/3075cf0eec2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/6/3075cf0eec2800181ac2881b40ece91c new file mode 100644 index 0000000..1e32cdd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/3075cf0eec2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + + availableConnections.addAll(tempList); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0a9d378302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0a9d378302c00181665d74572d9d988 new file mode 100644 index 0000000..1efd516 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0a9d378302c00181665d74572d9d988 @@ -0,0 +1,9 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime,long incrementtime)throws ParseException,InterruptedException; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/603e69e5472c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/603e69e5472c00181665d74572d9d988 new file mode 100644 index 0000000..74adb6a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/603e69e5472c00181665d74572d9d988 @@ -0,0 +1,117 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + log.debug("End date is:"+endDate); + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/70500149ba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/60/70500149ba2d0018111effc5980105bf new file mode 100644 index 0000000..91e1c56 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/70500149ba2d0018111effc5980105bf @@ -0,0 +1,374 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/b0c27656992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/60/b0c27656992d0018111effc5980105bf new file mode 100644 index 0000000..1ec2faa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/b0c27656992d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + +public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/10e924a8762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/61/10e924a8762e001814c0d2815b26d8fe new file mode 100644 index 0000000..86c311f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/10e924a8762e001814c0d2815b26d8fe @@ -0,0 +1,19 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + private String name; + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + private List data; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/90897935302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/61/90897935302c00181665d74572d9d988 new file mode 100644 index 0000000..5a88368 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/90897935302c00181665d74572d9d988 @@ -0,0 +1,131 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")).setTime(startDate); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/e08c4310132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/61/e08c4310132900181ac2881b40ece91c new file mode 100644 index 0000000..a7dd833 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/e08c4310132900181ac2881b40ece91c @@ -0,0 +1,13 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/20236f03852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/62/20236f03852b00181358968824499f38 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/007b2ac5962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/64/007b2ac5962d0018111effc5980105bf new file mode 100644 index 0000000..ecef995 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/007b2ac5962d0018111effc5980105bf @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + int i = 0; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + i++ + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/a087c807132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/64/a087c807132900181ac2881b40ece91c new file mode 100644 index 0000000..5f231a3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/a087c807132900181ac2881b40ece91c @@ -0,0 +1,10 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/204bc001792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/65/204bc001792e001814c0d2815b26d8fe new file mode 100644 index 0000000..64947c1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/65/204bc001792e001814c0d2815b26d8fe @@ -0,0 +1,43 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + + public Date getName() { + return name; + } + public void setName(Date name) { + this.name = name; + } + public double getValue() { + return value; + } + public void setValue(double value) { + this.value = value; + } + + private int devid; + private String sensor_locationname; + private Date name; + private double value; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/66/3075d252eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/66/3075d252eb2800181ac2881b40ece91c new file mode 100644 index 0000000..09d5798 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/66/3075d252eb2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + ArrayList availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/66/b0dfd9e897260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/66/b0dfd9e897260018180ee1d7e30fe76e new file mode 100644 index 0000000..77ccbd1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/66/b0dfd9e897260018180ee1d7e30fe76e @@ -0,0 +1,89 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/67/0019c9923d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/67/0019c9923d2c00181665d74572d9d988 new file mode 100644 index 0000000..bbafa5c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/67/0019c9923d2c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/68/80b03c91992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/68/80b03c91992d0018111effc5980105bf new file mode 100644 index 0000000..18b27a9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/68/80b03c91992d0018111effc5980105bf @@ -0,0 +1,134 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/50593dcfeb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/69/50593dcfeb2800181ac2881b40ece91c new file mode 100644 index 0000000..4d83349 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/69/50593dcfeb2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + List availableConnections=Collections.unmodifiableList(Arrays.asList(returnedobjects)); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/806c61b7a12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/69/806c61b7a12d0018111effc5980105bf new file mode 100644 index 0000000..e1fbefd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/69/806c61b7a12d0018111effc5980105bf @@ -0,0 +1,389 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/d014b4effb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/69/d014b4effb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..19755a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/69/d014b4effb2c001812c6cf03ff4f7112 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/f08cc63dee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/f08cc63dee2800181ac2881b40ece91c new file mode 100644 index 0000000..5cfd9dc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/f08cc63dee2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + Object[] returnedobjects = (Object[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6b/301ce604792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/6b/301ce604792e001814c0d2815b26d8fe new file mode 100644 index 0000000..7b156ff --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6b/301ce604792e001814c0d2815b26d8fe @@ -0,0 +1,43 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public double getValue() { + return value; + } + public void setValue(double value) { + this.value = value; + } + + private int devid; + private String sensor_locationname; + private Date name; + private double value; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6c/90830c3d212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/90830c3d212900181ac2881b40ece91c new file mode 100644 index 0000000..2503941 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/90830c3d212900181ac2881b40ece91c @@ -0,0 +1,53 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + return; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6c/b07e6a6ced2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/b07e6a6ced2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..9c25621 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/b07e6a6ced2c001812c6cf03ff4f7112 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a02b00ab0d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a02b00ab0d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..982a16b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a02b00ab0d2d001812c6cf03ff4f7112 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + System.out.println("Start date millis:"+startDate.getTime()); + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + System.out.println("String value is:"+json.toString()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + // httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a0e1ef5b302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a0e1ef5b302c00181665d74572d9d988 new file mode 100644 index 0000000..3bda505 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/a0e1ef5b302c00181665d74572d9d988 @@ -0,0 +1,132 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/7081038a962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/7081038a962d0018111effc5980105bf new file mode 100644 index 0000000..b86b27a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/7081038a962d0018111effc5980105bf @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + int i =0; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e0563813792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e0563813792e001814c0d2815b26d8fe new file mode 100644 index 0000000..80dc061 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e0563813792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e05fb1bf3d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e05fb1bf3d2c00181665d74572d9d988 new file mode 100644 index 0000000..b7360a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/e05fb1bf3d2c00181665d74572d9d988 @@ -0,0 +1,162 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7/905c66c8ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/7/905c66c8ea2800181ac2881b40ece91c new file mode 100644 index 0000000..4c1ac8a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7/905c66c8ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections = (List)Arrays.asList(returnedobjects); + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/70/1042ab6cba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/70/1042ab6cba2d0018111effc5980105bf new file mode 100644 index 0000000..c428a49 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/70/1042ab6cba2d0018111effc5980105bf @@ -0,0 +1,374 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.parallelStream().forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/70/80106135992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/70/80106135992d0018111effc5980105bf new file mode 100644 index 0000000..2f55c5c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/70/80106135992d0018111effc5980105bf @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/70eb50ac452c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70eb50ac452c00181665d74572d9d988 new file mode 100644 index 0000000..9022d55 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70eb50ac452c00181665d74572d9d988 @@ -0,0 +1,117 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + log.debug("End date is:"+endDate); + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/70f64820a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70f64820a02d0018111effc5980105bf new file mode 100644 index 0000000..b489f1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70f64820a02d0018111effc5980105bf @@ -0,0 +1,382 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dateFormat=new DateTimeFormatter ("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/80938f18a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/71/80938f18a02d0018111effc5980105bf new file mode 100644 index 0000000..b489f1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/80938f18a02d0018111effc5980105bf @@ -0,0 +1,382 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dateFormat=new DateTimeFormatter ("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/10dab312782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/73/10dab312782e001814c0d2815b26d8fe new file mode 100644 index 0000000..87a430c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/10dab312782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/40f325ae97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/73/40f325ae97260018180ee1d7e30fe76e new file mode 100644 index 0000000..b3a192d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/40f325ae97260018180ee1d7e30fe76e @@ -0,0 +1,89 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time ='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/f05627da762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/73/f05627da762e001814c0d2815b26d8fe new file mode 100644 index 0000000..802433f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/f05627da762e001814c0d2815b26d8fe @@ -0,0 +1,27 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + private String name; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getData() { + return series; + } + + public void setData(List data) { + this.series = data; + } + + private List series; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/74/0071ef10b82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/74/0071ef10b82d0018111effc5980105bf new file mode 100644 index 0000000..310a723 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/74/0071ef10b82d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public TotalConsolidatedConsumption getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+ ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/74/90cde18b762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/74/90cde18b762e001814c0d2815b26d8fe new file mode 100644 index 0000000..3153af9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/74/90cde18b762e001814c0d2815b26d8fe @@ -0,0 +1,28 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class WaterConsumptionResponseData implements Serializable { + + private Dfj dfj; + + public Dfj getDfj() { + return dfj; + } + + public void setDfj(Dfj dfj) { + this.dfj = dfj; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + private List data; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/00204218512c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/00204218512c00181665d74572d9d988 new file mode 100644 index 0000000..897c416 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/00204218512c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); + +/* + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); +*/ + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/d04a8495ef2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/75/d04a8495ef2800181ac2881b40ece91c new file mode 100644 index 0000000..4cbe436 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/d04a8495ef2800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/77/00d0b3ffeb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/77/00d0b3ffeb2800181ac2881b40ece91c new file mode 100644 index 0000000..ca9304f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/77/00d0b3ffeb2800181ac2881b40ece91c @@ -0,0 +1,115 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=new ArrayList(); + availableConnections.addAll(tempList); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/9049c63d852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/79/9049c63d852b00181358968824499f38 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/00642909302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/00642909302c00181665d74572d9d988 new file mode 100644 index 0000000..efcc0be --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/00642909302c00181665d74572d9d988 @@ -0,0 +1,126 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e074af40162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e074af40162900181ac2881b40ece91c new file mode 100644 index 0000000..fce325d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e074af40162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@RequestPart String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c0ec7cc9b82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c0ec7cc9b82d0018111effc5980105bf new file mode 100644 index 0000000..504ea8a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c0ec7cc9b82d0018111effc5980105bf @@ -0,0 +1,332 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/508630c6072d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/508630c6072d001812c6cf03ff4f7112 new file mode 100644 index 0000000..4779a8d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/508630c6072d001812c6cf03ff4f7112 @@ -0,0 +1,121 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + log.debug("End date is:"+endDate); + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/a0281a89322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/a0281a89322c00181665d74572d9d988 new file mode 100644 index 0000000..e7c9c75 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/a0281a89322c00181665d74572d9d988 @@ -0,0 +1,35 @@ +package com.techolution.mauritus.data.simulator; + +import java.text.ParseException; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + data.startProcess(meter, starttime, endtime, sleepval, incrementval); + + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/e090101f792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/e090101f792e001814c0d2815b26d8fe new file mode 100644 index 0000000..6c63eec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/e090101f792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + // SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + //Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/900cf398a12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/900cf398a12d0018111effc5980105bf new file mode 100644 index 0000000..8bbaf0c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/900cf398a12d0018111effc5980105bf @@ -0,0 +1,385 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/f0c0df30212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/f0c0df30212900181ac2881b40ece91c new file mode 100644 index 0000000..8a9f9e8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/f0c0df30212900181ac2881b40ece91c @@ -0,0 +1,52 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj + return; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/40ee536ba02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/40ee536ba02d0018111effc5980105bf new file mode 100644 index 0000000..0638ad1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/40ee536ba02d0018111effc5980105bf @@ -0,0 +1,385 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b66bad302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b66bad302c00181665d74572d9d988 new file mode 100644 index 0000000..c3590a1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b66bad302c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,Integer.vincrementtime); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/209464310d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/209464310d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..d69fb17 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/209464310d2d001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/402a28c93d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/402a28c93d2c00181665d74572d9d988 new file mode 100644 index 0000000..7494c33 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/402a28c93d2c00181665d74572d9d988 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/50a9f525782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/50a9f525782e001814c0d2815b26d8fe new file mode 100644 index 0000000..7d941bd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/50a9f525782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/c00fa836362c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/c00fa836362c00181665d74572d9d988 new file mode 100644 index 0000000..ab13f0a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/c00fa836362c00181665d74572d9d988 @@ -0,0 +1,154 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + log.fine("meterid:"+meterId); + log.fine("startTime:"+startTime); + log.fine("endTime:"+endTime); + log.fine("sleepTime:"+sleepTime); + log.fine("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/407b7cbab92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/80/407b7cbab92d0018111effc5980105bf new file mode 100644 index 0000000..f130aa0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/407b7cbab92d0018111effc5980105bf @@ -0,0 +1,333 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/81/10007c129a2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/81/10007c129a2d0018111effc5980105bf new file mode 100644 index 0000000..b8e675b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/81/10007c129a2d0018111effc5980105bf @@ -0,0 +1,134 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/81/30ce71c497260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/81/30ce71c497260018180ee1d7e30fe76e new file mode 100644 index 0000000..84c40e8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/81/30ce71c497260018180ee1d7e30fe76e @@ -0,0 +1,89 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time ='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/003a791c512c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/82/003a791c512c00181665d74572d9d988 new file mode 100644 index 0000000..b911c56 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/82/003a791c512c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); + +/* + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); +*/ + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/85/b0b893d2fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/85/b0b893d2fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..9d24d83 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/85/b0b893d2fb2c001812c6cf03ff4f7112 @@ -0,0 +1,295 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/30eb6c1b322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/87/30eb6c1b322c00181665d74572d9d988 new file mode 100644 index 0000000..a3b7ea4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/30eb6c1b322c00181665d74572d9d988 @@ -0,0 +1,31 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + data.startProcess(meterid, startTime, endTime, sleepval, incrementval); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/b03749fe762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/87/b03749fe762e001814c0d2815b26d8fe new file mode 100644 index 0000000..6489c65 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/b03749fe762e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private Static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(""); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/88/405583fd97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/88/405583fd97260018180ee1d7e30fe76e new file mode 100644 index 0000000..cdf0252 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/88/405583fd97260018180ee1d7e30fe76e @@ -0,0 +1,95 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/88/708b1ccb962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/88/708b1ccb962d0018111effc5980105bf new file mode 100644 index 0000000..059ff07 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/88/708b1ccb962d0018111effc5980105bf @@ -0,0 +1,139 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + int i = 0; + long batteryVal=3200; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + if( i == 10){ + batteryVal = batteryVal -ThreadLocalRandom.current().nextLong(10, 30); + } + + telemetry.setBattery(batteryVal); + + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + i++ + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8a/10738b43842b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/10738b43842b00181358968824499f38 new file mode 100644 index 0000000..8f5cf58 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/10738b43842b00181358968824499f38 @@ -0,0 +1,21 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8c/10a1b575302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/10a1b575302c00181665d74572d9d988 new file mode 100644 index 0000000..9e3f47a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/10a1b575302c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,Integer.vincrementtime); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8c/403ed463772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/403ed463772e001814c0d2815b26d8fe new file mode 100644 index 0000000..5eb06e0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/403ed463772e001814c0d2815b26d8fe @@ -0,0 +1,28 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.List; + +public class BatteryReadingResponseData implements Serializable { + + private Dfj dfj; + + public Dfj getDfj() { + return dfj; + } + + public void setDfj(Dfj dfj) { + this.dfj = dfj; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + private List data; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/802f981dba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/802f981dba2d0018111effc5980105bf new file mode 100644 index 0000000..0b07ded --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/802f981dba2d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0df4118212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0df4118212900181ac2881b40ece91c new file mode 100644 index 0000000..400fa40 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0df4118212900181ac2881b40ece91c @@ -0,0 +1,47 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40b551002f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40b551002f2c00181665d74572d9d988 new file mode 100644 index 0000000..adc7a2c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40b551002f2c00181665d74572d9d988 @@ -0,0 +1,121 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8f/804dff1afc2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/8f/804dff1afc2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..fb96c19 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8f/804dff1afc2c001812c6cf03ff4f7112 @@ -0,0 +1,120 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + log.debug("End date is:"+endDate); + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/90641cc8772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/9/90641cc8772e001814c0d2815b26d8fe new file mode 100644 index 0000000..53d88de --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/90641cc8772e001814c0d2815b26d8fe @@ -0,0 +1,389 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/90/60af6d4d772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/90/60af6d4d772e001814c0d2815b26d8fe new file mode 100644 index 0000000..be33406 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/90/60af6d4d772e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(CONSUMPTION); + responseData.setSeries(resultList); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/40d2bea0312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/91/40d2bea0312c00181665d74572d9d988 new file mode 100644 index 0000000..082ab6d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/40d2bea0312c00181665d74572d9d988 @@ -0,0 +1,18 @@ +package com.techolution.mauritus.data.simulator; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/b01bbff9762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b01bbff9762e001814c0d2815b26d8fe new file mode 100644 index 0000000..30734d1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b01bbff9762e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/70abe09b132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/92/70abe09b132900181ac2881b40ece91c new file mode 100644 index 0000000..773579b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/70abe09b132900181ac2881b40ece91c @@ -0,0 +1,14 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private long flow; + private double battery; + private long flowrate; + private Date date; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/80aa68db0b2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/92/80aa68db0b2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..895d1a2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/80aa68db0b2d001812c6cf03ff4f7112 @@ -0,0 +1,160 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/94/10b64a3e992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/94/10b64a3e992d0018111effc5980105bf new file mode 100644 index 0000000..d58e7c0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/94/10b64a3e992d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + +public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/f0370eb6852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/95/f0370eb6852b00181358968824499f38 new file mode 100644 index 0000000..4a805ac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/f0370eb6852b00181358968824499f38 @@ -0,0 +1,9 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime){ + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/96/309ab2be112d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/96/309ab2be112d001812c6cf03ff4f7112 new file mode 100644 index 0000000..c5499d9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/96/309ab2be112d001812c6cf03ff4f7112 @@ -0,0 +1,39 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + + org.influxdb + influxdb-java + 2.9 + + + + org.apache.httpcomponents + httpclient + 4.5.5 + + + org.json + json + 20180130 + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/100005f1512c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/100005f1512c00181665d74572d9d988 new file mode 100644 index 0000000..7d78885 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/100005f1512c00181665d74572d9d988 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + //influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); + +/* + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); +*/ + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/98/60a607c2762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/98/60a607c2762e001814c0d2815b26d8fe new file mode 100644 index 0000000..0756fb1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/98/60a607c2762e001814c0d2815b26d8fe @@ -0,0 +1,136 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/98/70a0e2fa7e2b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/98/70a0e2fa7e2b00181358968824499f38 new file mode 100644 index 0000000..49b9c7a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/98/70a0e2fa7e2b00181358968824499f38 @@ -0,0 +1,48 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/99/20016b35ef2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/99/20016b35ef2800181ac2881b40ece91c new file mode 100644 index 0000000..7920d1e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/99/20016b35ef2800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0dd6270b82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0dd6270b82d0018111effc5980105bf new file mode 100644 index 0000000..99c8bcc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0dd6270b82d0018111effc5980105bf @@ -0,0 +1,332 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public TotalConsolidatedConsumption getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b02bb314372c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b02bb314372c00181665d74572d9d988 new file mode 100644 index 0000000..4570dde --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b02bb314372c00181665d74572d9d988 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9d/10e326ab842b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/10e326ab842b00181358968824499f38 new file mode 100644 index 0000000..66fabfe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/10e326ab842b00181358968824499f38 @@ -0,0 +1,55 @@ +package com.techolution.mauritus.data + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + public Long getReading() { + return reading; + } + public void setReading(Long reading) { + this.reading = reading; + } + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/50ea9b89782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/50ea9b89782e001814c0d2815b26d8fe new file mode 100644 index 0000000..c20fbfa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/50ea9b89782e001814c0d2815b26d8fe @@ -0,0 +1,141 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(CONSUMPTION); + responseData.setSeries(resultList); + + List waterconumptionData=new ArrayList(1); + waterconumptionData.add(responseData); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return waterconumptionData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/909fb54f322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/909fb54f322c00181665d74572d9d988 new file mode 100644 index 0000000..424bede --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/909fb54f322c00181665d74572d9d988 @@ -0,0 +1,139 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b0c8526a312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b0c8526a312c00181665d74572d9d988 new file mode 100644 index 0000000..a20ee1d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b0c8526a312c00181665d74572d9d988 @@ -0,0 +1,16 @@ +package com.techolution.mauritus.data.simulator; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9f/80943163992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/80943163992d0018111effc5980105bf new file mode 100644 index 0000000..fd042a0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/80943163992d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + +public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9f/9022780dec2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/9022780dec2800181ac2881b40ece91c new file mode 100644 index 0000000..ac427e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/9022780dec2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=new ArrayList(); + availableConnections.addAll(tempList); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9f/90d17006ec2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/90d17006ec2800181ac2881b40ece91c new file mode 100644 index 0000000..76b0dd8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/90d17006ec2800181ac2881b40ece91c @@ -0,0 +1,115 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=new ArrayList(); + availableConnections.addAll(tempList); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a/a08fe125792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/a/a08fe125792e001814c0d2815b26d8fe new file mode 100644 index 0000000..02e8ec5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a/a08fe125792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + // SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + //Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + // SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/e04b1e291a2900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/e04b1e291a2900181ac2881b40ece91c new file mode 100644 index 0000000..439e79f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/e04b1e291a2900181ac2881b40ece91c @@ -0,0 +1,14 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private Long flow; + private Double battery; + private Long flowrate; + private Date date; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a2/c0c2ccf397260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/c0c2ccf397260018180ee1d7e30fe76e new file mode 100644 index 0000000..d679989 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/c0c2ccf397260018180ee1d7e30fe76e @@ -0,0 +1,94 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/4045d230782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/4045d230782e001814c0d2815b26d8fe new file mode 100644 index 0000000..191aa88 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/4045d230782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/500c481a792e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/500c481a792e001814c0d2815b26d8fe new file mode 100644 index 0000000..091e051 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/500c481a792e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + // SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + //Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + // Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(endTimeReturned.split("T")[0]); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a6/20e5ec89362c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/20e5ec89362c00181665d74572d9d988 new file mode 100644 index 0000000..fdb2bd0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/20e5ec89362c00181665d74572d9d988 @@ -0,0 +1,154 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a6/e0f85b953d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/e0f85b953d2c00181665d74572d9d988 new file mode 100644 index 0000000..83ed48c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/e0f85b953d2c00181665d74572d9d988 @@ -0,0 +1,132 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/50c50232ee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/50c50232ee2800181ac2881b40ece91c new file mode 100644 index 0000000..a65ff89 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/50c50232ee2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/904d1429fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/904d1429fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..d91cc25 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/904d1429fb2c001812c6cf03ff4f7112 @@ -0,0 +1,284 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30896caa832b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30896caa832b00181358968824499f38 new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30896caa832b00181358968824499f38 @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/60d8524b162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/60d8524b162900181ac2881b40ece91c new file mode 100644 index 0000000..eefcaf8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/60d8524b162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/90d8caa6ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/90d8caa6ea2800181ac2881b40ece91c new file mode 100644 index 0000000..146b97d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/90d8caa6ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + + List availableConnections =new ArrayList((List)Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20e362e1eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20e362e1eb2800181ac2881b40ece91c new file mode 100644 index 0000000..f7154bd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20e362e1eb2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + //List availableConnections =Arrays.asList(returnedobjects); + List availableConnections=(List)Collections.unmodifiableList(Arrays.asList(returnedobjects)); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f06dc1d0302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f06dc1d0302c00181665d74572d9d988 new file mode 100644 index 0000000..3c3155f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f06dc1d0302c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/af/a03c9c6eba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/af/a03c9c6eba2d0018111effc5980105bf new file mode 100644 index 0000000..b2391ae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/af/a03c9c6eba2d0018111effc5980105bf @@ -0,0 +1,375 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.parallelStream().forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + long battery=getBatteryForTodayForMeter(connection.getHouse_id()); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b/602985ff212c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/b/602985ff212c00181665d74572d9d988 new file mode 100644 index 0000000..880d2a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b/602985ff212c00181665d74572d9d988 @@ -0,0 +1,7 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime); + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b/d003c143ba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/b/d003c143ba2d0018111effc5980105bf new file mode 100644 index 0000000..2166126 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b/d003c143ba2d0018111effc5980105bf @@ -0,0 +1,343 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/20b8d7c9f02800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/20b8d7c9f02800181ac2881b40ece91c new file mode 100644 index 0000000..9827ed0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/20b8d7c9f02800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/304d65e9312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/304d65e9312c00181665d74572d9d988 new file mode 100644 index 0000000..4d3ddeb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/304d65e9312c00181665d74572d9d988 @@ -0,0 +1,27 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a05cf6de302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a05cf6de302c00181665d74572d9d988 new file mode 100644 index 0000000..1418476 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a05cf6de302c00181665d74572d9d988 @@ -0,0 +1,134 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/2048341a772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/2048341a772e001814c0d2815b26d8fe new file mode 100644 index 0000000..d8464df --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/2048341a772e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(ConnectDataController.CONSUMPTION); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60e92c1da02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60e92c1da02d0018111effc5980105bf new file mode 100644 index 0000000..6cdb82c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60e92c1da02d0018111effc5980105bf @@ -0,0 +1,383 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dateFormat=new DateTimeFormatter("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/607b2e7f3d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/607b2e7f3d2c00181665d74572d9d988 new file mode 100644 index 0000000..25b4301 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/607b2e7f3d2c00181665d74572d9d988 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e0152741162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e0152741162900181ac2881b40ece91c new file mode 100644 index 0000000..e3f182c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e0152741162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/7090a592772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/7090a592772e001814c0d2815b26d8fe new file mode 100644 index 0000000..d73a44c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/7090a592772e001814c0d2815b26d8fe @@ -0,0 +1,41 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + public Date getEndtime() { + return endtime; + } + public void setEndtime(Date endtime) { + this.endtime = endtime; + } + public double getWdata() { + return wdata; + } + public void setWdata(double wdata) { + this.wdata = wdata; + } + private int devid; + private String sensor_locationname; + private Date endtime; + private double wdata; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b6/b088a642312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/b088a642312c00181665d74572d9d988 new file mode 100644 index 0000000..05aa73e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/b088a642312c00181665d74572d9d988 @@ -0,0 +1,14 @@ +package com.techolution.mauritus.data.simulator; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f06e99ea772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f06e99ea772e001814c0d2815b26d8fe new file mode 100644 index 0000000..f5d5a64 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f06e99ea772e001814c0d2815b26d8fe @@ -0,0 +1,389 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ba/4028bdc9112900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/4028bdc9112900181ac2881b40ece91c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e03516ad772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e03516ad772e001814c0d2815b26d8fe new file mode 100644 index 0000000..5234eec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e03516ad772e001814c0d2815b26d8fe @@ -0,0 +1,42 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + } + + public Date getName() { + return name; + } + public void setName(Date name) { + this.name = name; + } + public double getValue() { + return value; + } + public void setValue(double value) { + this.value = value; + } + + private int devid; + private String sensor_locationname; + private Date name; + private double value; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/10ab9178132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/10ab9178132900181ac2881b40ece91c new file mode 100644 index 0000000..7caf2ba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/10ab9178132900181ac2881b40ece91c @@ -0,0 +1,7 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; + +public class Telemetry implements Serializable { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/e08e3ae89c2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/be/e08e3ae89c2d0018111effc5980105bf new file mode 100644 index 0000000..640b7de --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/e08e3ae89c2d0018111effc5980105bf @@ -0,0 +1,380 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/50619183322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/50619183322c00181665d74572d9d988 new file mode 100644 index 0000000..fde3455 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/50619183322c00181665d74572d9d988 @@ -0,0 +1,38 @@ +package com.techolution.mauritus.data.simulator; + +import java.text.ParseException; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + try { + data.startProcess(meter, starttime, endtime, sleepval, incrementval); + } catch (ParseException | InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/c04d285d132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/c04d285d132900181ac2881b40ece91c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/e089d99f772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/e089d99f772e001814c0d2815b26d8fe new file mode 100644 index 0000000..92a868e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/e089d99f772e001814c0d2815b26d8fe @@ -0,0 +1,41 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Data implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + public int getDevid() { + return devid; + } + public void setDevid(int devid) { + this.devid = devid; + } + public String getSensor_locationname() { + return sensor_locationname; + } + public void setSensor_locationname(String sensor_locationname) { + this.sensor_locationname = sensor_locationname; + } + public Date getEndtime() { + return name; + } + public void setEndtime(Date endtime) { + this.name = endtime; + } + public double getWdata() { + return value; + } + public void setWdata(double wdata) { + this.value = wdata; + } + private int devid; + private String sensor_locationname; + private Date name; + private double value; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c/306d09d8fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/c/306d09d8fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..f055a5f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c/306d09d8fb2c001812c6cf03ff4f7112 @@ -0,0 +1,298 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c/b070abc6eb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c/b070abc6eb2800181ac2881b40ece91c new file mode 100644 index 0000000..3db735f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c/b070abc6eb2800181ac2881b40ece91c @@ -0,0 +1,111 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List availableConnections =Arrays.asList(returnedobjects); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/804b6064ee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/804b6064ee2800181ac2881b40ece91c new file mode 100644 index 0000000..40f222c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/804b6064ee2800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + Object[] returnedobjects = (Object[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + + log.debug(arg0); + List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0015062262c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0015062262c00181665d74572d9d988 new file mode 100644 index 0000000..66fabfe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0015062262c00181665d74572d9d988 @@ -0,0 +1,55 @@ +package com.techolution.mauritus.data + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + public Long getReading() { + return reading; + } + public void setReading(Long reading) { + this.reading = reading; + } + /** + * + */ + private static final long serialVersionUID = 1L; + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Long reading; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/d0fb66d8f02800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/d0fb66d8f02800181ac2881b40ece91c new file mode 100644 index 0000000..4164655 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/d0fb66d8f02800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/e0ccbce3762e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/e0ccbce3762e001814c0d2815b26d8fe new file mode 100644 index 0000000..cd7cf3f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/e0ccbce3762e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/700c2f48322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/700c2f48322c00181665d74572d9d988 new file mode 100644 index 0000000..0e939fa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/700c2f48322c00181665d74572d9d988 @@ -0,0 +1,134 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b05304f45c2b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b05304f45c2b00181358968824499f38 new file mode 100644 index 0000000..a9f1353 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b05304f45c2b00181358968824499f38 @@ -0,0 +1,44 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Telemetry implements Serializable { + + private int meter_id; + private Long flow; + private Long battery; + private Long flowrate; + private Date date; + public int getMeter_id() { + return meter_id; + } + public void setMeter_id(int meter_id) { + this.meter_id = meter_id; + } + public Long getFlow() { + return flow; + } + public void setFlow(Long flow) { + this.flow = flow; + } + public Long getBattery() { + return battery; + } + public void setBattery(Long battery) { + this.battery = battery; + } + public Long getFlowrate() { + return flowrate; + } + public void setFlowrate(Long flowrate) { + this.flowrate = flowrate; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c2/f08629062f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/c2/f08629062f2c00181665d74572d9d988 new file mode 100644 index 0000000..91754ed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c2/f08629062f2c00181665d74572d9d988 @@ -0,0 +1,122 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + telemetry.setMeter_id(meter_id); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/501006b8852b00181358968824499f38 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/501006b8852b00181358968824499f38 new file mode 100644 index 0000000..9a520c3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/501006b8852b00181358968824499f38 @@ -0,0 +1,7 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime) + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/e002cc68162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/e002cc68162900181ac2881b40ece91c new file mode 100644 index 0000000..0a54536 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/e002cc68162900181ac2881b40ece91c @@ -0,0 +1,37 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/009c07a42e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/009c07a42e2c00181665d74572d9d988 new file mode 100644 index 0000000..2c6f2b1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/009c07a42e2c00181665d74572d9d988 @@ -0,0 +1,34 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + + org.influxdb + influxdb-java + 2.9 + + + + org.apache.httpcomponents + httpclient + 4.5.5 + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/90b4642aba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/90b4642aba2d0018111effc5980105bf new file mode 100644 index 0000000..a2038dc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/90b4642aba2d0018111effc5980105bf @@ -0,0 +1,342 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d006f6de962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d006f6de962d0018111effc5980105bf new file mode 100644 index 0000000..94f76a4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d006f6de962d0018111effc5980105bf @@ -0,0 +1,140 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + int i = 0; + long batteryVal=3200; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + if( i == 10){ + batteryVal = batteryVal -ThreadLocalRandom.current().nextLong(10, 30); + i = 0; + } + + telemetry.setBattery(batteryVal); + + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + i++ + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d0996c46ee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d0996c46ee2800181ac2881b40ece91c new file mode 100644 index 0000000..710c194 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/d0996c46ee2800181ac2881b40ece91c @@ -0,0 +1,115 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + Object[] returnedobjects = (Object[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + + List availableConnections =Arrays.asList(returnedobjects); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c5/10290991782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/10290991782e001814c0d2815b26d8fe new file mode 100644 index 0000000..6c60f31 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/10290991782e001814c0d2815b26d8fe @@ -0,0 +1,141 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(CONSUMPTION); + responseData.setSeries(resultList); + + List waterconumptionData=new ArrayList(1); + waterconumptionData.add(responseData); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return waterconumptionData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody List getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0419a8b132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0419a8b132900181ac2881b40ece91c new file mode 100644 index 0000000..03262ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0419a8b132900181ac2881b40ece91c @@ -0,0 +1,13 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; + +public class Telemetry implements Serializable { + + private int meter_id; + private long flow; + private double battery; + private long flowrate; + private Date date; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0c69bd3ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0c69bd3ea2800181ac2881b40ece91c new file mode 100644 index 0000000..010fa95 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/e0c69bd3ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =(List)Arrays.asList(returnedobjects); +// List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/20380815b92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/20380815b92d0018111effc5980105bf new file mode 100644 index 0000000..e784f59 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/20380815b92d0018111effc5980105bf @@ -0,0 +1,99 @@ +package com.techolution.mauritius.smartwater.domain; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="connection_details") +public class MeterConnection implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + @Id + private long id; + private long consumer_id; + private long customer_id; + private long house_id; + private long vendor_id; + private long block_id; + private long currentbatteryhealth; + private long currentbatteryhealth; + private String house_namenum; + private boolean isprivate; + public long getId() { + return id; + } + public void setId(long id) { + this.id = id; + } + public long getConsumer_id() { + return consumer_id; + } + public void setConsumer_id(long consumer_id) { + this.consumer_id = consumer_id; + } + public long getCustomer_id() { + return customer_id; + } + public void setCustomer_id(long customer_id) { + this.customer_id = customer_id; + } + public long getHouse_id() { + return house_id; + } + public void setHouse_id(long house_id) { + this.house_id = house_id; + } + public long getVendor_id() { + return vendor_id; + } + public void setVendor_id(long vendor_id) { + this.vendor_id = vendor_id; + } + public long getBlock_id() { + return block_id; + } + public void setBlock_id(long block_id) { + this.block_id = block_id; + } + public String getHouse_namenum() { + return house_namenum; + } + public void setHouse_namenum(String house_namenum) { + this.house_namenum = house_namenum; + } + public boolean isIsprivate() { + return isprivate; + } + public void setIsprivate(boolean isprivate) { + this.isprivate = isprivate; + } + + public double getDevice_latitude() { + return device_latitude; + } + public void setDevice_latitude(double device_latitude) { + this.device_latitude = device_latitude; + } + public double getDevice_longitude() { + return device_longitude; + } + public void setDevice_longitude(double device_longitude) { + this.device_longitude = device_longitude; + } + public long getCurrent_usage() { + return current_usage; + } + public void setCurrent_usage(long current_usage) { + this.current_usage = current_usage; + } + private double device_latitude; + private double device_longitude; + private long current_usage; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/b0b92e19a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/b0b92e19a02d0018111effc5980105bf new file mode 100644 index 0000000..2c51381 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/b0b92e19a02d0018111effc5980105bf @@ -0,0 +1,383 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dateFormat=new DateTimeFormatter ("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d04afdf72e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d04afdf72e2c00181665d74572d9d988 new file mode 100644 index 0000000..b88dd02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d04afdf72e2c00181665d74572d9d988 @@ -0,0 +1,121 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://yoururl"); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cd/90042faba12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/90042faba12d0018111effc5980105bf new file mode 100644 index 0000000..fd5800a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/90042faba12d0018111effc5980105bf @@ -0,0 +1,387 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cd/b0d7fd49a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/b0d7fd49a02d0018111effc5980105bf new file mode 100644 index 0000000..3778640 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/b0d7fd49a02d0018111effc5980105bf @@ -0,0 +1,382 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/50aa7ee0302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/50aa7ee0302c00181665d74572d9d988 new file mode 100644 index 0000000..eb3caaf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/50aa7ee0302c00181665d74572d9d988 @@ -0,0 +1,134 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) throws ParseException, InterruptedException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ad08afea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ad08afea2800181ac2881b40ece91c new file mode 100644 index 0000000..3a343e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ad08afea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d/f005b88e2f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/d/f005b88e2f2c00181665d74572d9d988 new file mode 100644 index 0000000..1f04517 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d/f005b88e2f2c00181665d74572d9d988 @@ -0,0 +1,123 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/00aef0189a2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/00aef0189a2d0018111effc5980105bf new file mode 100644 index 0000000..80dde33 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/00aef0189a2d0018111effc5980105bf @@ -0,0 +1,134 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.get(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/d0de6d17fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/d0de6d17fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..52c3df2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/d0de6d17fb2c001812c6cf03ff4f7112 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d3/30f2fdff97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/30f2fdff97260018180ee1d7e30fe76e new file mode 100644 index 0000000..992055f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/30f2fdff97260018180ee1d7e30fe76e @@ -0,0 +1,96 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResult); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/5026a1b1342c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/5026a1b1342c00181665d74572d9d988 new file mode 100644 index 0000000..e11ee14 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/5026a1b1342c00181665d74572d9d988 @@ -0,0 +1,139 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/100976b6072d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/100976b6072d001812c6cf03ff4f7112 new file mode 100644 index 0000000..2a83e92 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/100976b6072d001812c6cf03ff4f7112 @@ -0,0 +1,160 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d6/2003500db82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/2003500db82d0018111effc5980105bf new file mode 100644 index 0000000..5d6f639 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/2003500db82d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public TotalConsolidatedConsumption getConsumptionForTodayForMeter() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d6/6065e46cb82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/6065e46cb82d0018111effc5980105bf new file mode 100644 index 0000000..66a02a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/6065e46cb82d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public TotalConsolidatedConsumption getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d6/70790587322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/70790587322c00181665d74572d9d988 new file mode 100644 index 0000000..baf891f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/70790587322c00181665d74572d9d988 @@ -0,0 +1,35 @@ +package com.techolution.mauritus.data.simulator; + +import java.text.ParseException; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + data.startProcess(meter, starttime, endtime, sleepval, incrementval); + + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d6/907e4f4ea02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/907e4f4ea02d0018111effc5980105bf new file mode 100644 index 0000000..86e514c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/907e4f4ea02d0018111effc5980105bf @@ -0,0 +1,384 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant = + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + instant= Instant.parse( endTimeReturned); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/50bb6c6dee2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/50bb6c6dee2800181ac2881b40ece91c new file mode 100644 index 0000000..04d5882 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/50bb6c6dee2800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + Object[] returnedobjects = (Object[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/b0648310372c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/b0648310372c00181665d74572d9d988 new file mode 100644 index 0000000..4bf7a73 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/b0648310372c00181665d74572d9d988 @@ -0,0 +1,154 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/4029f615772e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/da/4029f615772e001814c0d2815b26d8fe new file mode 100644 index 0000000..d61bc21 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/4029f615772e001814c0d2815b26d8fe @@ -0,0 +1,137 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.WaterConsumptionResponseData; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping(value="/read") + +public class ConnectionStatisticsController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectionStatisticsController.class); + + private static String CONSUMPTION ="Consumption"; + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/r/GetData") + public @ResponseBody List getConsumptionDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getConsumptionDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.getData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + WaterConsumptionResponseData responseData=new WaterConsumptionResponseData(); + responseData.setName(""); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + + + /** + * Taking as string as Senseworx api doesnot take json key confirming to java bean format. + * If name in json and class does not match, object is not getting populated. + * Hence taking as STring and creating objects manually + * @param data + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/battery/GetData") + public @ResponseBody ResponseData getBatteryDetails(@RequestBody String data) throws ParseException, JSONException + + { + log.info("Entering ConnectionStatisticsController.getBatteryDetails "); + log.info("Request String is:"+data); + JSONObject object=new JSONObject(data); + RequestData requestData =new RequestData(); + requestData.setHouse_ID(object.getInt("House_ID")); + requestData.setBlock_ID(object.getInt("Block_ID")); + requestData.setCustomer_ID(object.getInt("Customer_ID")); + requestData.setEnd_Time(object.getString("End_Time")); + requestData.setStart_Time(object.getString("Start_Time")); + requestData.setSample_Distance(object.getString("Sample_Distance")); + requestData.setSample_Distance_value(object.getInt("Sample_Distance_value")); + requestData.setVendor_ID(object.getInt("Vendor_ID")); + + log.info("Input RequestData is not null"); + log.info("Input RequestData houseID:"+requestData.getHouse_ID()); + /*log.info("Input RequestData start time:"+requestData.getStart_Time()); + log.info("Input RequestData End time:"+requestData.getEnd_Time());*/ + + //Gson gsonObj = new Gson(); + // converts object to json string + //String jsonStr = gsonObj.toJson(requestData); + log.info(requestData.toString()); + + + + List resultList=connectionStatisticsService.geBatterytData(requestData); + Dfj dfj=new Dfj(); + dfj.setStatus("Success"); + + ResponseData responseData=new ResponseData(); + responseData.setData(resultList); + responseData.setDfj(dfj); + + log.info("Exiting ConnectionStatisticsController.getConsumptionDetails "); + return responseData; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/407c33942e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/da/407c33942e2c00181665d74572d9d988 new file mode 100644 index 0000000..974873d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/407c33942e2c00181665d74572d9d988 @@ -0,0 +1,110 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://yoururl"); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + httpClient.close(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/00795e15ba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/00795e15ba2d0018111effc5980105bf new file mode 100644 index 0000000..14590a3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/00795e15ba2d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/3012410a782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/3012410a782e001814c0d2815b26d8fe new file mode 100644 index 0000000..cf74e4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/3012410a782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/908b903f302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/908b903f302c00181665d74572d9d988 new file mode 100644 index 0000000..ec53af3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/908b903f302c00181665d74572d9d988 @@ -0,0 +1,9 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime,long incrementtime)throws ParseException; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/e01cfe3dbe2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/e01cfe3dbe2d0018111effc5980105bf new file mode 100644 index 0000000..1cf3411 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/e01cfe3dbe2d0018111effc5980105bf @@ -0,0 +1,365 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/5083184d2e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/5083184d2e2c00181665d74572d9d988 new file mode 100644 index 0000000..82f8c55 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/5083184d2e2c00181665d74572d9d988 @@ -0,0 +1,92 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/906f1d060c2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/906f1d060c2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..21cb36f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/906f1d060c2d001812c6cf03ff4f7112 @@ -0,0 +1,161 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id="+meterId+"";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + System.out.println("Start date millis:"+startDate.getTime()); + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + System.out.println("String value is:"+json.toString()); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a030a94d992d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a030a94d992d0018111effc5980105bf new file mode 100644 index 0000000..1ec2faa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a030a94d992d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + +public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a07469f1b92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a07469f1b92d0018111effc5980105bf new file mode 100644 index 0000000..e7024f9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a07469f1b92d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.forEach(connection ->{ + + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/d065f83a302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/d065f83a302c00181665d74572d9d988 new file mode 100644 index 0000000..2b09bdf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/d065f83a302c00181665d74572d9d988 @@ -0,0 +1,132 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/e060a62f322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/e060a62f322c00181665d74572d9d988 new file mode 100644 index 0000000..1ba7fac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/e060a62f322c00181665d74572d9d988 @@ -0,0 +1,31 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + data.startProcess(meterid, starttime, endtime, sleepval, incrementval); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/2047ab7b132900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/de/2047ab7b132900181ac2881b40ece91c new file mode 100644 index 0000000..820bd34 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/de/2047ab7b132900181ac2881b40ece91c @@ -0,0 +1,12 @@ +package com.techolution.mauritius.smartwater.connection.domain; + +import java.io.Serializable; + +public class Telemetry implements Serializable { + + private int meter_id; + private long flow; + private double battery; + private long flow; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/20a392c5ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/de/20a392c5ea2800181ac2881b40ece91c new file mode 100644 index 0000000..3dd38cd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/de/20a392c5ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + (List)Arrays.asList(returnedobjects); + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/4021f8e8962d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/df/4021f8e8962d0018111effc5980105bf new file mode 100644 index 0000000..d8d8461 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/4021f8e8962d0018111effc5980105bf @@ -0,0 +1,143 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + int i = 0; + long batteryVal=3200; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + if( i == 10){ + batteryVal = batteryVal -ThreadLocalRandom.current().nextLong(10, 30); + i = 0; + } + + telemetry.setBattery(batteryVal); + + if(batteryVal < 2000){ + batteryVal = 3000; + } + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + i++ + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/a077ed350d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/a077ed350d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..33e89b6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/a077ed350d2d001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0740edd2e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0740edd2e2c00181665d74572d9d988 new file mode 100644 index 0000000..4305d4b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0740edd2e2c00181665d74572d9d988 @@ -0,0 +1,115 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://yoururl"); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + httpClient.close(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/90c504c8112d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/90c504c8112d001812c6cf03ff4f7112 new file mode 100644 index 0000000..339ead2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/90c504c8112d001812c6cf03ff4f7112 @@ -0,0 +1,58 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + + org.influxdb + influxdb-java + 2.9 + + + + org.apache.httpcomponents + httpclient + 4.5.5 + + + org.json + json + 20180130 + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + uber-${artifactId}-${version} + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/a0cdc434322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/a0cdc434322c00181665d74572d9d988 new file mode 100644 index 0000000..fb1658e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/a0cdc434322c00181665d74572d9d988 @@ -0,0 +1,31 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + data.startProcess(meter, starttime, endtime, sleepval, incrementval); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/7017dd5d162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/7017dd5d162900181ac2881b40ece91c new file mode 100644 index 0000000..eefcaf8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/7017dd5d162900181ac2881b40ece91c @@ -0,0 +1,36 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/604553e5472c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/604553e5472c00181665d74572d9d988 new file mode 100644 index 0000000..e885e41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/604553e5472c00181665d74572d9d988 @@ -0,0 +1,293 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:8086/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d083769c97260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d083769c97260018180ee1d7e30fe76e new file mode 100644 index 0000000..0e7b015 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d083769c97260018180ee1d7e30fe76e @@ -0,0 +1,87 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d0ef6c0f302c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d0ef6c0f302c00181665d74572d9d988 new file mode 100644 index 0000000..b9b7267 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/d0ef6c0f302c00181665d74572d9d988 @@ -0,0 +1,130 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/50d10f17a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/50d10f17a02d0018111effc5980105bf new file mode 100644 index 0000000..3778640 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/50d10f17a02d0018111effc5980105bf @@ -0,0 +1,382 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a012b4efec2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a012b4efec2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..54afa1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a012b4efec2c001812c6cf03ff4f7112 @@ -0,0 +1,155 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e4/109d1de2ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/e4/109d1de2ea2800181ac2881b40ece91c new file mode 100644 index 0000000..d74ea7b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e4/109d1de2ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); +// List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e5/a019f7812f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/a019f7812f2c00181665d74572d9d988 new file mode 100644 index 0000000..3e37e35 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/a019f7812f2c00181665d74572d9d988 @@ -0,0 +1,122 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e5/c056a9142e2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/c056a9142e2c00181665d74572d9d988 new file mode 100644 index 0000000..b17dd97 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/c056a9142e2c00181665d74572d9d988 @@ -0,0 +1,88 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e5/f053768a162900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/f053768a162900181ac2881b40ece91c new file mode 100644 index 0000000..4e5d663 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/f053768a162900181ac2881b40ece91c @@ -0,0 +1,39 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable String meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/b0735490362c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/b0735490362c00181665d74572d9d988 new file mode 100644 index 0000000..a369c29 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/b0735490362c00181665d74572d9d988 @@ -0,0 +1,154 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/f0f62378ba2d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/f0f62378ba2d0018111effc5980105bf new file mode 100644 index 0000000..992d798 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/f0f62378ba2d0018111effc5980105bf @@ -0,0 +1,376 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + returnList.parallelStream().forEach(connection ->{ + try { + long consumption=getConsumptionForTodayForMeter(connection.getHouse_id()); + connection.setCurrent_usage(consumption); + long battery=getBatteryForTodayForMeter(connection.getHouse_id()); + + } catch (IOException | JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }); + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + public long getBatteryForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from batterylevel where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/502f8390fb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/502f8390fb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..74bebc7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/502f8390fb2c001812c6cf03ff4f7112 @@ -0,0 +1,288 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/90d6905df22800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/90d6905df22800181ac2881b40ece91c new file mode 100644 index 0000000..60c1bca --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/90d6905df22800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/b03dde4cf22800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/b03dde4cf22800181ac2881b40ece91c new file mode 100644 index 0000000..8d13fd4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/b03dde4cf22800181ac2881b40ece91c @@ -0,0 +1,116 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30ccb80ffc2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30ccb80ffc2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..9022d55 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30ccb80ffc2c001812c6cf03ff4f7112 @@ -0,0 +1,117 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + log.debug("End date is:"+endDate); + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/f0071473a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/f0071473a02d0018111effc5980105bf new file mode 100644 index 0000000..f456c87 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/f0071473a02d0018111effc5980105bf @@ -0,0 +1,385 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ec/c09cb3cb112d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/c09cb3cb112d001812c6cf03ff4f7112 new file mode 100644 index 0000000..e5d774d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/c09cb3cb112d001812c6cf03ff4f7112 @@ -0,0 +1,59 @@ + + 4.0.0 + DataSimulator + DataSimulator + 0.0.1-SNAPSHOT + DataSimulator + Simulates Data + + src + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + uber-${artifactId}-${version} + + + + + + + org.influxdb + influxdb-java + 2.9 + + + + org.apache.httpcomponents + httpclient + 4.5.5 + + + org.json + json + 20180130 + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ec/d03e9c462f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/d03e9c462f2c00181665d74572d9d988 new file mode 100644 index 0000000..47c1ab2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/d03e9c462f2c00181665d74572d9d988 @@ -0,0 +1,122 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setFlowrate(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry){ + + JSONObject json = new JSONObject(); + json.put("someKey", "someValue"); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ec/f0cd9d4c212900181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/f0cd9d4c212900181ac2881b40ece91c new file mode 100644 index 0000000..331f782 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/f0cd9d4c212900181ac2881b40ece91c @@ -0,0 +1,54 @@ +package com.techolution.mauritius.smartwater.connection.controller; + +import java.text.ParseException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.techolution.mauritius.smartwater.connection.domain.Dfj; +import com.techolution.mauritius.smartwater.connection.domain.ResponseData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; +import com.techolution.mauritius.smartwater.connection.service.ConnectionStatisticsService; + +@RestController +@RequestMapping(value="/insert") +public class ConnectDataController { + + @Autowired + private ConnectionStatisticsService connectionStatisticsService; + private Log log = LogFactory.getLog(ConnectDataController.class); + + /** + * Not using meter_id from telemetery as the meter-id should be identified in url + * @param telemetry + * @param meter_id + * @return + * @throws ParseException + * @throws JSONException + */ + @PostMapping("/telemetry/data/{meter_id}") + public @ResponseBody ResponseData getConsumptionDetails(@RequestBody Telemetry telemetry,@PathVariable int meter_id) throws ParseException, JSONException + + { + log.info("Entering ConnectDataController.getConsumptionDetails"); + + telemetry.setMeter_id(meter_id); + connectionStatisticsService.insertData(telemetry); + log.info("Exiting ConnectDataController.getConsumptionDetails"); + ResponseData data=new ResponseData(); + Dfj dfj=new Dfj(); + dfj.setStatus("REQUEST_SUBMITTED"); + return; + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/b0ef3d84ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/b0ef3d84ea2800181ac2881b40ece91c new file mode 100644 index 0000000..14bbe8d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/b0ef3d84ea2800181ac2881b40ece91c @@ -0,0 +1,108 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + + List availableConnections =new ArrayList(); + + log.debug("List size returned is:"+availableConnections.length); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/202fb4f22f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/202fb4f22f2c00181665d74572d9d988 new file mode 100644 index 0000000..f1378c9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/202fb4f22f2c00181665d74572d9d988 @@ -0,0 +1,125 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/e0ba93be3d2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/e0ba93be3d2c00181665d74572d9d988 new file mode 100644 index 0000000..f248822 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/e0ba93be3d2c00181665d74572d9d988 @@ -0,0 +1,132 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/90cffd0398260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/90cffd0398260018180ee1d7e30fe76e new file mode 100644 index 0000000..0295f26 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/90cffd0398260018180ee1d7e30fe76e @@ -0,0 +1,96 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/f0add5f9262c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/f0add5f9262c00181665d74572d9d988 new file mode 100644 index 0000000..1bac4f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/f0add5f9262c00181665d74572d9d988 @@ -0,0 +1,7 @@ +package com.techolution.mauritius.data.simulator.service; + +public interface IStubData { + + public void startProcess(int meterId,String startTime,String endTime,long sleepTime,long incrementtime); + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/8089a64ca02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/f/8089a64ca02d0018111effc5980105bf new file mode 100644 index 0000000..9a6d3fc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f/8089a64ca02d0018111effc5980105bf @@ -0,0 +1,384 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant = + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + instant= Instant.parse( "2010-10-02T12:23:23Z" ); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/c00163ebeb2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/f/c00163ebeb2800181ac2881b40ece91c new file mode 100644 index 0000000..36f112c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f/c00163ebeb2800181ac2881b40ece91c @@ -0,0 +1,114 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + // ArrayList availableConnections =Arrays.asList(returnedobjects); + List tempList =Arrays.asList(returnedobjects); + List availableConnections=(List)Collections.unmodifiableList(Arrays.asList(returnedobjects)); + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507b5568a02d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507b5568a02d0018111effc5980105bf new file mode 100644 index 0000000..ac7c5c2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507b5568a02d0018111effc5980105bf @@ -0,0 +1,385 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]); + instant= Instant.parse( endTimeReturned); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f0/b0fe9edbb92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/b0fe9edbb92d0018111effc5980105bf new file mode 100644 index 0000000..5d4d01f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/b0fe9edbb92d0018111effc5980105bf @@ -0,0 +1,333 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public long getConsumptionForTodayForMeter(int meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + //String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"' and meter_id="+meterId ; + + //String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+meterId ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + + return consumption.longValue(); + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/10c921eeea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/10c921eeea2800181ac2881b40ece91c new file mode 100644 index 0000000..537b589 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/10c921eeea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + ArrayList availableConnections =Arrays.asList(returnedobjects); +// List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/5068a1f9b72d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/5068a1f9b72d0018111effc5980105bf new file mode 100644 index 0000000..23191f7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/5068a1f9b72d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForTodayForMeter() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d096d17497260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d096d17497260018180ee1d7e30fe76e new file mode 100644 index 0000000..65ef88c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d096d17497260018180ee1d7e30fe76e @@ -0,0 +1,81 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/f03c9a1cb92d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/f03c9a1cb92d0018111effc5980105bf new file mode 100644 index 0000000..89c168d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/f03c9a1cb92d0018111effc5980105bf @@ -0,0 +1,99 @@ +package com.techolution.mauritius.smartwater.domain; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="connection_details") +public class MeterConnection implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + @Id + private long id; + private long consumer_id; + private long customer_id; + private long house_id; + private long vendor_id; + private long block_id; + private long currentbatteryhealth; + private long currentstatus; + private String house_namenum; + private boolean isprivate; + public long getId() { + return id; + } + public void setId(long id) { + this.id = id; + } + public long getConsumer_id() { + return consumer_id; + } + public void setConsumer_id(long consumer_id) { + this.consumer_id = consumer_id; + } + public long getCustomer_id() { + return customer_id; + } + public void setCustomer_id(long customer_id) { + this.customer_id = customer_id; + } + public long getHouse_id() { + return house_id; + } + public void setHouse_id(long house_id) { + this.house_id = house_id; + } + public long getVendor_id() { + return vendor_id; + } + public void setVendor_id(long vendor_id) { + this.vendor_id = vendor_id; + } + public long getBlock_id() { + return block_id; + } + public void setBlock_id(long block_id) { + this.block_id = block_id; + } + public String getHouse_namenum() { + return house_namenum; + } + public void setHouse_namenum(String house_namenum) { + this.house_namenum = house_namenum; + } + public boolean isIsprivate() { + return isprivate; + } + public void setIsprivate(boolean isprivate) { + this.isprivate = isprivate; + } + + public double getDevice_latitude() { + return device_latitude; + } + public void setDevice_latitude(double device_latitude) { + this.device_latitude = device_latitude; + } + public double getDevice_longitude() { + return device_longitude; + } + public void setDevice_longitude(double device_longitude) { + this.device_longitude = device_longitude; + } + public long getCurrent_usage() { + return current_usage; + } + public void setCurrent_usage(long current_usage) { + this.current_usage = current_usage; + } + private double device_latitude; + private double device_longitude; + private long current_usage; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/40f13dcfeb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/40f13dcfeb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..de09918 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/40f13dcfeb2c001812c6cf03ff4f7112 @@ -0,0 +1,34 @@ +package com.techolution.mauritus.data.simulator; + +import java.text.ParseException; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + int incrementval=Integer.valueOf(incrementtime).intValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + data.startProcess(meter, starttime, endtime, sleepval, incrementval); + + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/50344cb2ed2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/50344cb2ed2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..ab8e8c5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/50344cb2ed2c001812c6cf03ff4f7112 @@ -0,0 +1,283 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + //influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f4/a0791770782e001814c0d2815b26d8fe b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/a0791770782e001814c0d2815b26d8fe new file mode 100644 index 0000000..5612180 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/a0791770782e001814c0d2815b26d8fe @@ -0,0 +1,390 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + //Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + // instant= Instant.parse( endTimeReturned); + //Date date=java.util.Date.from(instant); + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + // instant= Instant.parse( endTimeReturned); + // Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + Date date=dateFormat.parse(endTimeReturned.split("T")[0]); + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setName(date); + + resultData.setValue(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f4/d01cd4380d2d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/d01cd4380d2d001812c6cf03ff4f7112 new file mode 100644 index 0000000..be090ef --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/d01cd4380d2d001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f5/70bdaee8ec2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/f5/70bdaee8ec2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..9b2d241 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f5/70bdaee8ec2c001812c6cf03ff4f7112 @@ -0,0 +1,133 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class BatteryDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(BatteryDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + + telemetry.setBattery(new Long(3200)); + + telemetry.setMeter_id(meterId); + sendBattery(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + + + private void sendBattery(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("battery", telemetry.getBattery()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/d064cd70072d001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/d064cd70072d001812c6cf03ff4f7112 new file mode 100644 index 0000000..75441bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/d064cd70072d001812c6cf03ff4f7112 @@ -0,0 +1,289 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"' group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + Date date=dateFormat.parse(endTimeReturned); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f7/308b28b82f2c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/308b28b82f2c00181665d74572d9d988 new file mode 100644 index 0000000..ec6308c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/308b28b82f2c00181665d74572d9d988 @@ -0,0 +1,124 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, long incrementtime) throws ParseException { + // TODO Auto-generated method stub + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() < 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + startDate=myFormat.parse(startTime); + } + + if(endTime.length()<2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.MINUTE,30); + endDate=enddateCal.getTime(); + + }else{ + endDate=myFormat.parse(endTime); + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + telemetry.setReading(baseReadingValue+flow); + telemetry.setMeter_id(meterId); + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", value) + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8083/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f7/70fcf8f697260018180ee1d7e30fe76e b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/70fcf8f697260018180ee1d7e30fe76e new file mode 100644 index 0000000..97ba87f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/70fcf8f697260018180ee1d7e30fe76e @@ -0,0 +1,95 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static final String INFLUX_ENDPOINT="http://localhost:32768/query?db=mauritius_smartwater&q="; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query, dbName)); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, 0.00); + return consolidatedConsumption; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00493851f22800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00493851f22800181ac2881b40ece91c new file mode 100644 index 0000000..b00d936 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00493851f22800181ac2881b40ece91c @@ -0,0 +1,118 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",MeterConnection[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =Arrays.asList(returnedobjects); + + //log.debug(arg0); + // List availableConnections =new ArrayList(); + + + //availableConnections. + + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+meterConnection.getHouse_id()+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse((endDate.split("Z"))[0]); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }else{ + meterconsumption.setWdata(consumption); + } + + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/8011e3c9ea2800181ac2881b40ece91c b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/8011e3c9ea2800181ac2881b40ece91c new file mode 100644 index 0000000..ef0810c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/8011e3c9ea2800181ac2881b40ece91c @@ -0,0 +1,110 @@ +package com.techolution.mauritius.smartwater.map.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.assertj.core.util.Arrays; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.MeterConsumption; +import com.techolution.mauritius.smartwater.domain.RequestData; + +@Component +public class MapDataService { + + private Log log = LogFactory.getLog(MapDataService.class); + + //RestTemplate restTemplate; + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + + public List getDataForAllConnections(RequestData data){ + + + log.info("Entering MapDataService.getDataForAllConnections "); + + + ResponseEntity responseEntity = restTemplate().getForEntity("http://localhost:8082/consolidateddata/connections",Object[].class); +// List availableConnections=restTemplate().getForObject("http://localhost:8082/consolidateddata/connections", ArrayList.class); + + MeterConnection[] returnedobjects = (MeterConnection[])responseEntity.getBody(); + List availableConnections =(List)Arrays.asList(returnedobjects); + List availableConnections =new ArrayList(Arrays.asList(returnedobjects)); + //availableConnections. + + log.debug("List size returned is:"+availableConnections.size()); + //For each of the returned value call influx and resturn + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + String startTime = data.getStart_Time(); + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + String locationName= "TEST"; + + List resultList=new ArrayList(); + + availableConnections.parallelStream().forEach(meterConnection -> { + String query = "select sum(value) from flow where time >='"+startTime+"' and time<'"+endTime+"' and meter_id='"+deviceId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List resultlist=queryResult.getResults(); + double consumption=0.0; + String endDate=null; + if(resultlist != null && resultlist.size()>0 ){ + Result result = resultlist.get(0); + if(result .getSeries() != null && result.getSeries().size()>0){ + Series series=result.getSeries().get(0); + endDate=(String)series.getValues().get(0).get(0); + consumption=((Double)series.getValues().get(0).get(1)).doubleValue(); + + } + + } + MeterConsumption meterconsumption=new MeterConsumption(meterConnection); + if(endDate!=null){ + try { + Date date=myFormat.parse(endDate); + meterconsumption.setEndTime(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + meterconsumption.setWdata(consumption); + resultList.add(meterconsumption); + }); + + influxDB.close(); + log.info("Exiting MapDataService.getDataForAllConnections "); + return resultList; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fb/70c72e01322c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/70c72e01322c00181665d74572d9d988 new file mode 100644 index 0000000..d6fedb6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/70c72e01322c00181665d74572d9d988 @@ -0,0 +1,29 @@ +package com.techolution.mauritus.data.simulator; + +import com.techolution.mauritius.data.simulator.service.FlowDataSimiulator; +import com.techolution.mauritius.data.simulator.service.IStubData; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + String kpi=args[0]; + String meterid=args[1]; + String starttime=args[2]; + String endtime=args[3]; + String sleeptime=args[4]; + String incrementtime=args[5]; + + int meter=Integer.valueOf(meterid).intValue(); + long sleepval=Long.valueOf(sleeptime).longValue(); + + + IStubData data=null; + if("flow".equalsIgnoreCase(kpi)){ + data=new FlowDataSimiulator(); + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/40c3b40eb82d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/40c3b40eb82d0018111effc5980105bf new file mode 100644 index 0000000..82881d8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/40c3b40eb82d0018111effc5980105bf @@ -0,0 +1,337 @@ +package com.techolution.mauritius.smartwater.service; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.client.ClientProtocolException; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.domain.MeterConnection; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedConsumption; +import com.techolution.mauritius.smartwater.domain.TotalConsolidatedDeviceStatus; +import com.techolution.mauritius.smartwater.repository.ConnectionDetailsRepository; + +@Component +public class ConsolidatedDataService { + private Log log = LogFactory.getLog(ConsolidatedDataService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + @Autowired + private ConnectionDetailsRepository connectionDetailsRepository; + + + + public List getAllConnections(){ + + log.info("Entering ConsolidatedDataService.getAllConnections "); + List returnList= (List)connectionDetailsRepository.findAll(); + log.info("Exiting ConsolidatedDataService.getAllConnections "); + if(returnList == null) { + log.debug("returnList size is null"); + }else{ + log.debug("List size is:"+returnList.size()); + } + + return returnList; + } + + public TotalConsolidatedConsumption getConsumptionForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + +public TotalConsolidatedConsumption getConsumptionForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"'" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + + } + + + public TotalConsolidatedConsumption getConsumptionForTodayForMeter(long meterId) throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + //calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select sum(value) from flow where time >='"+reformattedStr+"'"; + + String query_previousbucket="select sum(value) from flow where time >='"+reformattedStrlastmonth+"' and time <= '"+reformattedStr+"' and meter_id="+ ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + Double consumption = getConsumption(queryResult); + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + Double previousconsumption = getConsumption(queryResultPreviousBucket); + log.debug("consumption:"+consumption); + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(consumption, 100.00, 0.00, previousconsumption); + return consolidatedConsumption; + +} + + + public TotalConsolidatedDeviceStatus getDeviceStatusForThisMonth() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.set(Calendar.DAY_OF_MONTH, 1); + calendarlastmonth.add(Calendar.MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + + public TotalConsolidatedDeviceStatus getDeviceStatusForToday() throws ClientProtocolException, IOException, JSONException{ + + + Calendar calendar=Calendar.getInstance(); + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = null; + reformattedStr = myFormat.format(calendar.getTime()); + + Calendar calendarlastmonth=Calendar.getInstance(); + calendarlastmonth.add(Calendar.DAY_OF_MONTH, -1); + String reformattedStrlastmonth = myFormat.format(calendarlastmonth.getTime()); + + //String query=INFLUX_ENDPOINT+"select sum(value) from flow where time >='"+reformattedStr+"'"; + String query="select last(value) from devicestatus where time >='"+reformattedStr+"' group by meter_id"; + + String query_previousbucket="select last(value) from devicestatus where time >='"+reformattedStrlastmonth+"' and time < '"+reformattedStr+"' group by meter_id" ; + + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + List results=queryResult.getResults(); + + int totalDevices=results.size(); + int workingdevicescount =0; + int notworkingdevicescount = 0; + + for(Result result:results){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + else + totalDevices=seriesvalues.size(); + for(Series series:seriesvalues){ + List> values=series.getValues(); + Double value=(Double)(values.get(0).get(1)); + if(value.intValue() == 1){ + workingdevicescount++; + }else{ + notworkingdevicescount++; + } + } + } + + + QueryResult queryResultPreviousBucket = influxDB.query(new Query(query_previousbucket, dbName)); + + + int notworkingdevicescountpreviousbucket = 0; + + for(Result result:queryResultPreviousBucket.getResults()){ + + List seriesvalues=result.getSeries(); + if(seriesvalues == null) + break; + for(Series series:seriesvalues){ + List> values=series.getValues(); + Integer value=(Integer)(values.get(0).get(1)); + if(value.intValue() == 0){ + notworkingdevicescountpreviousbucket++; + } + } + } + + + + //TotalConsolidatedConsumption consolidatedConsumption=new TotalConsolidatedConsumption(Long.valueOf(consumption).longValue(), 100.00, 0.00, 0.00); + TotalConsolidatedDeviceStatus consolidatedDeviceStatus=new TotalConsolidatedDeviceStatus(totalDevices, workingdevicescount,notworkingdevicescount, notworkingdevicescountpreviousbucket); + return consolidatedDeviceStatus; + + } + + private Double getConsumption(QueryResult queryResult) { + List results=queryResult.getResults(); + Result valueobj=results.get(0); + if(valueobj != null && valueobj.getSeries()!=null && valueobj.getSeries().size()>0){ + List> values=valueobj.getSeries().get(0).getValues(); +// String consumption=(String)(values.get(0).get(1)); + Double consumption=(Double)(values.get(0).get(1)); + return consumption; + }else{ + return new Double(0.0); + } + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/f092a823312c00181665d74572d9d988 b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/f092a823312c00181665d74572d9d988 new file mode 100644 index 0000000..086e713 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/f092a823312c00181665d74572d9d988 @@ -0,0 +1,10 @@ +package com.techolution.mauritus.data.simulator; + +public class PopulateData { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/008716fffb2c001812c6cf03ff4f7112 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/008716fffb2c001812c6cf03ff4f7112 new file mode 100644 index 0000000..3db4bc3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/008716fffb2c001812c6cf03ff4f7112 @@ -0,0 +1,159 @@ +package com.techolution.mauritius.data.simulator.service; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.ThreadLocalRandom; +import java.util.logging.Logger; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.json.JSONObject; + +import com.techolution.mauritus.data.Telemetry; + +public class FlowDataSimiulator implements IStubData { + + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + Logger log=Logger.getLogger(FlowDataSimiulator.class.getName()); + @Override + public void startProcess(int meterId, String startTime, String endTime, long sleepTime, int incrementtime) { + // TODO Auto-generated method stub + + System.out.println("meterid:"+meterId); + System.out.println("startTime:"+startTime); + System.out.println("endTime:"+endTime); + System.out.println("sleepTime:"+sleepTime); + System.out.println("incrementtime:"+incrementtime); + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + myFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + long baseReadingValue = 20000; + Date startDate=null; + Date endDate=null; + if(startTime.length() <= 2){ + startDate=Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime(); + + }else{ + try { + startDate=myFormat.parse(startTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if(endTime.length()<=2){ + Calendar enddateCal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + enddateCal.add(Calendar.DATE,1); + endDate=enddateCal.getTime(); + + }else{ + try { + endDate=myFormat.parse(endTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + String query = "select last(value) from meterreading where time <='"+startTime+"' and meter_id='"+meterId+"'";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.fine("Query is:"+query); + + + InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32768", "root", "root"); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + + List results=queryResult.getResults(); + if(results != null && results.size()>0){ + Result result = results.get(0); + + List serieslist=result.getSeries(); + if(serieslist !=null && serieslist.size()>0){ + Series series=serieslist.get(0); + List> objects=series.getValues(); + List resultvals=objects.get(0); + Double double1=(Double)resultvals.get(1); + baseReadingValue=double1.longValue(); + } + + + } + boolean loop=true; + while(startDate.before( endDate)){ + + + try { + Telemetry telemetry=new Telemetry(); + telemetry.setDate(startDate); + long flow=ThreadLocalRandom.current().nextLong(200, 300); + telemetry.setFlow(flow); + baseReadingValue=baseReadingValue+flow; + telemetry.setReading(baseReadingValue); + telemetry.setMeter_id(meterId); + sendRequest(telemetry,startDate); + + if(sleepTime > 100){ + Thread.sleep(sleepTime); + } + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendar.setTime(startDate); + calendar.add(Calendar.MILLISECOND,incrementtime); + startDate=calendar.getTime(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + } + + private void sendRequest(Telemetry telemetry,Date date){ + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String dateVal=myFormat.format(date); + JSONObject json = new JSONObject(); + json.put("flow", telemetry.getFlow()); + json.put("reading", telemetry.getReading()); + json.put("date", dateVal); + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + try { + HttpPost request = new HttpPost("http://localhost:8085/insert/telemetry/data/"+telemetry.getMeter_id()); + StringEntity params = new StringEntity(json.toString()); + request.addHeader("content-type", "application/json"); + request.setEntity(params); + httpClient.execute(request); + // handle response here... + } catch (Exception ex) { + // handle exception here + } finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/502e31baa12d0018111effc5980105bf b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/502e31baa12d0018111effc5980105bf new file mode 100644 index 0000000..287eec8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/502e31baa12d0018111effc5980105bf @@ -0,0 +1,389 @@ +package com.techolution.mauritius.smartwater.connection.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.influxdb.BatchOptions; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDB.ConsistencyLevel; +import org.influxdb.InfluxDBFactory; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.influxdb.dto.QueryResult.Result; +import org.influxdb.dto.QueryResult.Series; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.techolution.mauritius.smartwater.connection.domain.Data; +import com.techolution.mauritius.smartwater.connection.domain.RequestData; +import com.techolution.mauritius.smartwater.connection.domain.Telemetry; + + +@Component +public class ConnectionStatisticsService { + + private Log log = LogFactory.getLog(ConnectionStatisticsService.class); + + private static String INFLUX_CONNECTION_STRING="http://52.170.92.62:8086"; + private static String INFLUX_USERNAME="root"; + private static String INFLUX_PWD="root"; + + public List getData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select sum(value) from flow where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+") fill(0)";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + int recordSize=0; + List retlist=new ArrayList(); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-ddTHH:mm:ssZ"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + /*log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + log.debug("Date2 is:"+(endTimeReturned.split("T"))[1]);*/ + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + + + } + + } + influxDB.close(); + return retlist; + } + + public List geBatterytData(RequestData data) throws ParseException{ + + + SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + + /*String startTime = myFormat.format(data.getStart_Time().getTime()); + String endTime = myFormat.format(data.getEnd_Time().getTime());*/ + String startTime = data.getStart_Time(); + //String startTime = "2018-03-01"; + + String endTime = data.getEnd_Time(); + //String endTime = "2018-03-15"; + + int distanceValue=data.getSample_Distance_value(); + //int distanceValue=30; + String disVal=String.valueOf(distanceValue); + + String code="d"; + String groupVal=null; + log.debug("Sample Distance:"+data.getSample_Distance()); + log.debug("distanceValue:"+distanceValue); + //String groupVal="1d"; + if(data.getSample_Distance().equalsIgnoreCase("Day")){ + code="d"; + groupVal=disVal+code; + } + else if(data.getSample_Distance().equalsIgnoreCase("Hour")){ + code="h"; + groupVal=disVal+code; + }else if(data.getSample_Distance().equalsIgnoreCase("Month")){ + int monthgroupval=distanceValue*30; + groupVal=String.valueOf(monthgroupval)+"d"; + + }else{ + code="d"; + groupVal=disVal+code; + } + + + int deviceId=data.getHouse_ID(); + //int deviceId=123; + String query = "select last(value) from batterylevel where time >='"+startTime+"' and time<='"+endTime+"' and meter_id="+deviceId+" group by time("+groupVal+")";// now() - 10d and meter_id = '124' group by time(1d) fill(0) + log.debug("Query is:"+query); + + + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB = InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + QueryResult queryResult = influxDB.query(new Query(query, dbName)); + String locationName= "TEST"; + + List resultlist=queryResult.getResults(); + // int recordSize=0; + List retlist=new ArrayList(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + //Date date1=new SimpleDateFormat("yyyy-MM-DDTHH:mm:ssz").parse(sDate1); + Data resultData=null; + + Instant instant=null; + for(Result result:resultlist){ + List serieslist=result.getSeries(); + if(serieslist == null){ + break; + } + for(Series series:serieslist){ + List> valuelist=series.getValues(); + for(List results:valuelist){ + String endTimeReturned=(String)results.get(0); + //log.debug("Date is:"+(endTimeReturned.split("T"))[0]); + instant= Instant.parse( endTimeReturned); + Date date=java.util.Date.from(instant); + // Date date=dateFormat.parse(endTimeReturned); + if(results.get(1)!=null){ + + + resultData=new Data(); + resultData.setDevid(deviceId); + resultData.setEndtime(date); + + resultData.setWdata(((Double)results.get(1)).doubleValue()); + resultData.setSensor_locationname(locationName); + retlist.add(resultData); + } + } + + + } + + } + influxDB.close(); + return retlist; + } + + /** + * + * @param telemetry + */ + @Async + public void insertData(Telemetry telemetry){ + + log.info("Entering ConnectionStatisticsService.insertData"); + if(telemetry.getDate()==null){ + log.info("Date is null.Setting defaule date"); + Calendar date=Calendar.getInstance(TimeZone.getTimeZone("UTC")); + telemetry.setDate(date.getTime()); + }else{ + log.info("Time to set is:"+telemetry.getDate().getTime()); + } + //InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:32770", "root", "root"); + InfluxDB influxDB =InfluxDBFactory.connect(INFLUX_CONNECTION_STRING, INFLUX_USERNAME, INFLUX_PWD); + String dbName = "mauritius_smartwater"; + influxDB.setDatabase(dbName); + influxDB.enableBatch(BatchOptions.DEFAULTS); + String rpName = "aRetentionPolicy"; + influxDB.createRetentionPolicy(rpName, dbName, "365d", "30m", 2, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) +// .tag("async", "true") + .retentionPolicy(rpName) + .consistency(ConsistencyLevel.ALL) + .build(); + + + if(telemetry.getFlow()!=null){ + insertFlow(telemetry,influxDB,batchPoints); + }else{ + log.info("No flow data. Not inserting"); + } + + + if(telemetry.getBattery()!=null){ + insertBattery(telemetry,batchPoints); + }else{ + log.info("No battery data. Not inserting"); + } + + if(telemetry.getFlowrate()!=null){ + insertFlowrate(telemetry,batchPoints); + }else{ + log.info("No flowrate data. Not inserting"); + } + + if(telemetry.getReading()!=null){ + insertMeterReading(telemetry,batchPoints); + }else{ + log.info("No meterreading data. Not inserting"); + } + + //influxDB.flush(); + influxDB.write(batchPoints); + + influxDB.close(); + + log.info("Exiting ConnectionStatisticsService.insertData"); + + } + + private void insertFlow(Telemetry telemetry,InfluxDB influxDB ,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlow"); + + /* + influxDB.write(Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build()); +*/ + + Point point1 = Point.measurement("flow") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlow()) + .build(); + + batchPoints.point(point1); + + + log.debug("Inserted flow into db"); + log.info("Exiting ConnectionStatisticsService.insertFlow"); + + } + private void insertBattery(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertBattery"); + + /*influxDB.write(Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build()); + */ + + Point point1 = Point.measurement("batterylevel") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getBattery()) + .build(); + + batchPoints.point(point1); + + log.debug("Inserted battery into db"); + + log.info("Exiting ConnectionStatisticsService.insertBattery"); + + } + + private void insertFlowrate(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build(); + batchPoints.point(point1); + log.debug("Inserted Flowrate into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + private void insertMeterReading(Telemetry telemetry,BatchPoints batchPoints){ + + log.info("Entering ConnectionStatisticsService.insertFlowrate"); + + /*influxDB.write(Point.measurement("flowrate") + .time(telemetry.getDate().getTime(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getFlowrate()) + .build());*/ + + Point point1 = Point.measurement("meterreading") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("meter_id", telemetry.getMeter_id()) + .addField("value", telemetry.getReading()) + .build(); + batchPoints.point(point1); + log.debug("Inserted meterreading into db"); + + log.info("Exiting ConnectionStatisticsService.insertFlowrate"); + + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/af/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/af/history.index new file mode 100644 index 0000000000000000000000000000000000000000..34c6a238a0e0914b8cea6337e3b8a02b84968f81 GIT binary patch literal 94 zcmZQ#U|?WmP}SEfPAw_P%u6rU&o4^XOHIznEGSOZ%StKHOU^G!)hj4UO)F+#GU&`% k)vV1RAsjKSL&bBxh55NHc1es33=`(+bRmnM+y)T`09!{M9smFU literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/2b/aa/fc/b5/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/2b/aa/fc/b5/history.index new file mode 100644 index 0000000000000000000000000000000000000000..b8f9da933b0e9dd71671becf9ea4a005fec17586 GIT binary patch literal 2170 zcmbW%ZA?>F7zgl!j4o{0R_IvSL<>41baIJKG;?StT3)N&9NiM#w6tC5M%UUmWEfsF zDvU)N=F3c$P$MQoVPXVE&{154rE|`^EY5T;}$YwQx?8p~_nAa+<9la2CDGZg!eo4$i1|>N$tm;;Pm=t#-~~ zvb)U&6IZg`>8jj3`z-f8y<1P7;%9uiRWA~Gs_FI?dobACn3-8v8ApiF`QzR^@b%{v z)IF`9jp$>4-Q7g<-M6N*Aa5=5Q{SC^Fq#1#m+IdT%WI{gfrCmSPkHM^^YW7RbqR^g zg|*^-ba&uunjh}i+J#>6>s9KFx~0wNqDdchPswNj`l)}Jlk)k^OMi`VrCO% z^IM=Ww7r`N_p7M7M(>?B-Kj)>r%)5Wh;|{P&$O&FpxRS_|M{mYQx9v%u`0jdf zY{0gSt}gT+{LH;davnWAGfeXyYq}^2>S%8(U7G0b ze-iS4{PQMtayT{mV0KXdpR?>Jb6(aPMlXDIvM6?bZ*p(=9^?zpUZx+QH)0$wf`Ok& z>87r|T-LP(d}@z|dXMswY%O?)ZqAJdr0C-GQkqwF9cjylyi3fy$MJ>-{lT9lG_M%H z*Mgq!FQPsy`8*%pb5~7W$Z3(GYi<-!*Jho*_!9J$<>gZMwD)bpAN1QtE2-O(xMK83 zU^%OEu6_)EP`8h{cjx^(=z&V+g5@fY9{g|_t;6@f-;JIkW{W|3y3d6^7|LMzhIkwL zsFAt%_wWw%fsffD;Z2d3(S@qH1=CWy2HldyT&gQmqK{aYvcBPJ3HnYob7IU+L|0r| zLh}l)cY=dCFMKLrqd0y*^0rXcii)o#n>BuqkpO-Ng5(bW- z-{7BTebc6z(7!Bujyk{LGc|hYSvhs#P__uYy`H(M?=^zHzL+^*Iy03E_x=0iv+SHs z@o(r&4(7I|`rGL12A`pM)xOoo(2s^vsA~_%HRy+HlBo~tI%VkgP6>6Qo!WdKWu5b3&(z`c0;=eC|cQH}PT$QsTfL`$e^RZnQ zeduS>=X~&!A@qHcy|n&VWXEyz3y*5p%+msG=!$ygyX$fr(9=xJdroTV(07I0w9bDa Cc@Mh) literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/ba/aa/fc/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/81/f6/ba/aa/fc/history.index new file mode 100644 index 0000000000000000000000000000000000000000..6973a23d4ae6c208c91f177ced1a0745045797e1 GIT binary patch literal 527 zcmZQ#U|?Wmu+uLtO4d)#&($wUP0q;ADJ{v&&(qIMEG^0`DJ|AdNi0d!FV4&@%}FfD zFVYXlF95MpU4X)RS&3zd48jf{ZO^~fVUQ3ycAojaf1%Kv75dIej0_A5G^9F>fZ}4Q z*IkQl-t3q#3nE@n$=Z%AF4Y1N4@jKYj4b}DUKe7{*&`;%;=f`c;tvv*=_8BZyr~0L zZ}2)t8d+RyDnwjh!5aZ&@yogp@q*)ejL72KHfn>-d2q+~ogtF@yC*`#4SZ8yB8$Hh zgNp0SyM`>DdsY+T9_@@J$l@2bLc|>|?OT8>emO=1tiB*tGY47RCJ-XN;Y3gtviLb4 zb+Gyk9m|}M#f_WPz~Ub!tx!f5Z!g6P7c6-6s}4#0;hXKY zAopwtX896>Brd-dB5qJy^BP%P>A*8RkopJSa+*?_3=&d@I;0)myp&;B2oW#%P@sY= z9+LwRZ|F{uK^E7&up4Yn!RiOIg^|q3OofO)aGceREbiq85ob6n(19$z^v^D^ISTHp gtC7V$UqHkKR!^)z7FRKah#&CPh(#7x)`f@z0IdX|r~m)} literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/e4/history.index new file mode 100644 index 0000000000000000000000000000000000000000..95a978fd2f1d96a6a8973046fc64f848c12f6452 GIT binary patch literal 412 zcmZQ#U|?Wm5Y{g)O4bia%}LEoEh(zh%StRuWDpQ|thTyEn?XW2Vp@la=X{GvvU}{3 z7#SD@BsVWd7FT(*8!Y}{qwxY{aYf_l5OKwwto2Cd2z{6a7B5)v=vN(*_`^5bZ9(R5 z2xj>bgCs7$6(Vj>Tk{%OT_)wsNEFO~s z5pU>DkwF&My|5c>PQmI2vxSk&$xMZaKX9DYjV$iv2N7pDE6{-~zVy#7usI6utE-X4 dJzqe?1y)b2Ko(aqg@_;U)rdtFSJs7y0|3CMh2{VN literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/history.index new file mode 100644 index 0000000000000000000000000000000000000000..8dcf91b0465f6f0f59ccb56e61c313686d358fcf GIT binary patch literal 161 zcmZQ#U|?Wm;LtC~&(*8Q&0%0WFlX~=L0tw3p=0Nn|N9pTmF;-uk;KTrFySc631sp9 zYKXYOtWEon#l2L-oI&at=CCi((_xShOTF$|bn|9Mgo+SYTtGsJ16lk}&rUm#dV%6@ X=N4@S3E_xo9V(vlEnXLG1&ad!{2Vgr literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..7e361405ccac7ea1136426b54f5b1d61ee46b45e GIT binary patch literal 86 zcmWm3Ar62r39IP$i fEm!Vt1rnUhuhFyMh#W|+-_wdG(1u#0rDT5rD{vdt literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers new file mode 100644 index 0000000000000000000000000000000000000000..1ff12bb99ab11a296edf00da60733ca5aae39a35 GIT binary patch literal 4568 zcmd6rO^ee&7{@2gYTI?is_QGFK@{;|VnIPxJ-Bv@l|@&(H$|8xW1HQi6DE^xdlWs0 z2;M{lKY&*+UOWkc;73sLD89eHUz}-cO=3F9mMs`4?X;Q6|MxsI^Pi^x02!Rq3XsCG zX?qr=m}oB1H67a;MS2Ze9yM`Yv!O>!YI?3_uzNN4@6CubOdV;HkWxfi-I2`BQ0g3P zKmfoPd$CJ;p8{Jjsj5h~Ovgp)oIzC`6Qnu>S1e?MEXcU1f!L#3Dc*rKu}5@NGGrhh zFU*3hUW24eA));D#~{tyQ+0#4UVtnlRnJCs>dGLOpWshdnSM*1HeCu*rjg14=@LlW z$aP^A$za!P4JoGWU_zDP-HPcdbuLBmTx5Vz%dDdlo?StNKPm%8bx2ValUAwy>?RXi znVzxOZ~T%zNbUE<@uc#8o>VcwvmrmhLub~{TVB(ssHOIY!ekVd>cficB&J&(NB40c zx|sl-6`O6iQeac0=TPX*vyEKn zFe3&SWBWguGE54YL$N6O9B1TW8&3h!eV?ann>|@LsT}br-cv<&M3_$)ij8Ou8;VQ4 z3dlIb#D6U=WGza_Nxt*UF(VWUP0J#o>FtSyGF#JYO2xuD3yx6ezOK-bw$lOWM{zt$LiE9L zd3SETP85l>FlFgsr0f8X#IZ-8GF_o>5(&-j5~VC#974*9A)#**3C%eop}A{A5ZVd} zeV0h+_$`sp@q0rMdNU;SB^L@7S;DNG_Z!Me9I)8s`3VbSr>h+t_Lr2 zuTa)tJ2te~SH$E-#hTb@J13@*6^tI~o4%R+DpA~*jf&#FYBO=7x8|S04zKT#KWe-xW|#D2pr{=TM6LWkM(tSh{e>>$Q_dKB WB$KX)mWFhD2up+g&%)e@3H=SV3G{&g literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/.syncinfo.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/org.eclipse.jdt.core/state.dat b/.metadata/.plugins/org.eclipse.core.resources/.projects/DataSimulator/org.eclipse.jdt.core/state.dat new file mode 100644 index 0000000000000000000000000000000000000000..0a4c9a6e9d59a4ce71c3bba5113d9374422b05d4 GIT binary patch literal 164185 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.syncinfo.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/Servers/.syncinfo.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/e4/b9/22/81/f6/2b/12/22/3c/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/e4/b9/22/81/f6/2b/12/22/3c/history.index new file mode 100644 index 0000000000000000000000000000000000000000..c340a74e50ccc4c39024495ef7dc8d70e9ae8a91 GIT binary patch literal 1060 zcmZQ#U|?WjNYyVcO4iR!%*@lzN-Rs%PtMQPFG)?#$j>P)$;{6K%9IvmmSmO|>lf!H z7L}AImZTN|73JlnCWGZu^1*tY5=(#*l|iYADVcfcL8-+B`FX{uE{P?HdLUyNm>NW< zx0LHKNQfM`)EKRH*p3 z;C%a|G9;(1e#!-Qnt-DAU1agk7a`&w!qjgei??=hLe#%hS%ECRP7fl!V7~4wWO4C} z9ANbm&OYo$7WbS55oZXYj@Ls{b5e6tONuHXQNa5^aVKlNHiLw4#Iz0-&-oTYAEw!X zqM%^GqhEDM;t$_!w*`rB2xj>bgCs7$6(Vj>Tk{%OT_)wsNEFO~s5pU>DkwF&My|5c>PQmI2vxSk&$xMZaKX9DYjV$iv2N7pD zE6{-~zVy#7usI6utE-X4Jzqe?1y)b2Ko(aqg@_;U)rdtFSJs7yGx$>{J`lNq-9Y9U zOC?g0d-g#BoFo*y4=^H&dsqm7#UGf8twqiyy5bOV19r|8$l~7~@R1GUG2EWApmYj`BbOmQ7$wenF)JAKj~>+S&bh>oo_o7|eqYZ0{?5@LgfvLz zJZ_Pb1s7kmOIx?~R9#dep&izSy+nRwk2mb@O$BMWZq7qH!}gq%*hNao5XcDo!7 zMeF`*3l^~C!IJ1vOdXpt$0LR@ZVX;DA-yg>bFI}dxB7LSZ9bcYP}6c>7j%ANGjTpD z+x#HkSwg+z+1LT-fk+<7hX?MILyvf=mmRGtf`0fkb&K&Q3q3xviJTKVbZpfJ{+s(i z_2SXr&<$GZsj255p^H_ywEv@=ap=`U!?w)6y~2&<EuA;4kOYRjR%S?Up{T)%c=KX&#Q%A`d&x#4;%JF z@19XTzF>wPiK*Td+6z5VNjNskFey$-w zd;UrevS6C+o23wRTkTVt@2O+9fP7^(_3+Kf9O&OihDqLBvTh|GX5jRrNH z$#Pmcoy}oswJww9HR?27MmEpsw2qT(1IKgOM%tLk8u(n6*BBf_TCGM+&W##F4yV@8 z;r~d*vpi?yIkiy*XR_rmrLg3A=ugThPq#+{XO3-sw|J#`eQc6|qCz7Ez8#0iBK8DbIDjOFcCLVRz~paQSTMJ?!01;HC_=13TAt znRLu6=~nCo@!+3ZxF!GGsnW@@mfw3m_2w6mMhg7yh60uP;1oxonD184H%(y+(Q zltRZPF%G+P54gEdc?kQqPH@wO<|yosZ-85e7WQLLsV*UX{d}YZyRZoS__)*uyMhC^ z-j{h{-=P6FU8?ZJK7SOPd9&67yTq@U+-n>2scS&*=T^sg;uiWNi+%9xIpUI+DdE_a zr*oiF9`v~$b$DeOarwxmhjqvqZ6a|~Wq`UC`S3yw;#>|M45GH;Q$L}OPpf?Ge> z!?E+Hz(wr`La;Z5fty5ZAojAM-pJ+ew%>bjm#bqR@w3-XOUf*9`BQL9?qneL>1J?A zWpV)a&9hgbll)5Wj5_mqNyPPb|GEX~|92Oi4IiLt+E j2Dkbpxng(Cnk60m@Rte(-AlE9CvICzh{E1*?E&#WMUg4g literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..7e361405ccac7ea1136426b54f5b1d61ee46b45e GIT binary patch literal 86 zcmWm3Ar62r39IP$i fEm!Vt1rnUhuhFyMh#W|+-_wdG(1u#0rDT5rD{vdt literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.markers b/.metadata/.plugins/org.eclipse.core.resources/.projects/connectionstatistics/.markers new file mode 100644 index 0000000000000000000000000000000000000000..802aa8f27acf8d44fd05fbba418190c2b5020565 GIT binary patch literal 5151 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/e4/b9/22/81/f6/2b/12/b5/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/e4/b9/22/81/f6/2b/12/b5/history.index new file mode 100644 index 0000000000000000000000000000000000000000..9df3abc4d803622e73db8ebf78358298f411f28a GIT binary patch literal 817 zcmZQ#U|?Wmh|n)CO4iR!%*@lzN-Rs%PtMQPFG)?#$j>P)$;{6K%9IvmmSmO|>lf!H z7L}AImZTQx7pE4LWhSTUJLl&W=jUXm00mQA5=#<;A>w)(vCvN+3AGqCv=m=8K5i>KQ`#3yV?(Lxsg^vV>hzCnM6 zEVB55Ef8^r$~aME@kbgEaR*5r24wLcCrlvzD#`q~6Uo0?RuJ(G|K{CB7SB#J2CH|d zuGxhwZWIU+S7;F0fh<175vsmq!&YSR6DAOGfu`M?k;P}5>VnNb@TTVE4kY)ieyar$ zznfHmEPmt~L_8t&Ne;4jdyNKIJwxGp0c7#!T!^^C;Vpc~;u$FraRuf8US#p}kJZ8E z1Y|7yxgE(p$M!?S4SvXeK^ABK66OI)R|dJ9H-76dNC+J}&-~xNQ0VG;i1>yblP@8Q q3wS}qAGq@ELlzfby4x9KPJ(OjQ+J>_VyV|%i*DZRC=gx?76$-U*cvqe literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..7e361405ccac7ea1136426b54f5b1d61ee46b45e GIT binary patch literal 86 zcmWm3Ar62r39IP$i fEm!Vt1rnUhuhFyMh#W|+-_wdG(1u#0rDT5rD{vdt literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.markers b/.metadata/.plugins/org.eclipse.core.resources/.projects/consolidateddetails/.markers new file mode 100644 index 0000000000000000000000000000000000000000..9cfb92bf4db235407cc1f0fd3022672f4f9517fe GIT binary patch literal 2571 zcmdUw-)ba96vj__Oy*B^WiRwX3{vQY;JQ5~Za~8lSaxy|S%bJyQIKp+)tQ;fR#!Du z)w7v^2;zm_`V{*jK7-HVh2W{48B;xGvlwz?!$5aWSDpHP=c}&(paolfVU4$1Nghy2 z3|wj7FKv;Z6&e6C`o-&62KTHR=P0x)J?6y@=E6F<;Zrm_UpPC|SmZQNTP~FuLk~J0 zr|49e#YxtnD<<4M3ETyGZa;)>aNKx>CaeK$qEx}UlZi5+1#cJJ@G;60i6t6|M$Aqu z&E=FtXpfz(%0t2HoWeJk`p-MjFSs)OxFGtX=m!)NtE)iWpnocIm8yK-7u4A2lsLmfc$7hd~50ELD-GQ~A6Sf~7Pmn3{s|)OsAxwE@;`U*cM+qxfUxOYw z701@i4x`24EV}IR^!K~9xghICm(iB{Z_3Ua%6@4myOSz=nW*Cj4+POJmnYP)GGNHNm zEFH(BMe>6UOi}=Ihm12HD60e;DZ}+*{MYli`s#2%uTe{8M=VenF>PZYH}h&^mHBrI z4;_KNDdr?=ss#2QC1*?o|78At$-lL5?d|LEZ{JP%w|5)-&Bw`pj6QttVz0%=2b3*& zk}Y(cEwUxQ$d-JbE&1n2K|@juikL(Dt8*Rf*Zp0C?2Sf$V+TARVVLc)*lav29UVLI zU|BY(-XaE3dR7@a&crj6j85j|0TgU}q64U4bX%`{bv3K~y}#PupBDZ7aY1|YI<(jS zOlhzG)u8?E&MRnN5PFahI;z!E;Bn^o^V+dF*?)wN4u0}IDITMt9U|s#uH_%>Ge5Bv inS6+>%3Vfn$UK-{_xh>fij#0L9cgZLX2^9cx@&r79FOD8CgYj0W5;7pJQF)kCK*>(z1>~i z)m7!H>Y47WST@30#G(kT5E3BJvXPKLqCsBk|=*511IPtN0Vskmb_Y&CY8onB+Bd97J| zX51WZl;cLL+Z>I`NpwU!Qrt6*I4no~-C+xF^RbU0{tHE;XchgUSB&ttTXc$c(JaPA ziT`c<9pkQp=Oe@$6+^^r6g%!&4_8CPV7guRhSv?`_yVYKfG3BZ?CSLUO9es^~7ppYgjhAowdfa zk}F%yA#(WO58nIJ-$gb*K{!@yfz)dVo-91V&;8S={7>dFfB$n=P272T_K-{8vAde*qe-5*xC1mnKdMQu*odh5jLM;fxckKb zrS+pY56y_v0d*9LVX^KwCQa?@eD92uBa~A*u@Mg4sbY7WIBg&fIT`qx2THx=xDmIE=3QD(a<3DW z_Su=GjZi~&$tGwFe7Q}f*($D2x@k^c*K5^bXCIJX(4cuY|_D@6<3>f(0||69fOq4L-UMMF1cQ2X%e zUv5^NMF&SsKfi{0>rrD?>Qt)rNI5IzUh!ga9KWH|dEBO+I6P4MjKEvnV{{Mo$}=UG zYBiPbc>L0{eLikl|FjNN&VBx*g}Mvp-MEjWysl4?mZkg4sQ5^Y4QWmNTgnMF5Ix$Y zH00tk4JDsa8`>=8Q9h;CqV%XW0zK*Iu1D!O#v1777^7#5RO&*GTwGDYxpdmZfA$ic zR*z9}S-CMPay%V zam(ozpa#LYpQ9V~t#m!E>sA+g52*uB^|-c|a9pqOxQp!MczJW^f1=6^=b zs#s&9Ajdx&8LRi74eMT3mxkk7yn@SfPgB(fzkRB-%*V5BS(lnR)xMLabzq+g~kX#e3@LX9X;sC%ZA5RW;rMCSX^Jj;XRnzwc6`5+%R%&IXpdAZP~ zRHZe~qcF;_1*!iB9_1;_rAVb{@su13Y1@>MNNXp;m0X#AB^9U5OI=-Bj{MsCl<%Xo zod#obI%eyYk}73(;;!GCun+R)tzZMbF{%N_H2%0+S;MlzCz!g8w0d{bf=Sej-4Ik<#mQFjHS#q zNMwk`(V4Mx>*#x@c~xUwElw0yi<42Fk1P~>;9});wMS>9ZxrX8E_eof*)J}FTU;@F zTVbfx!!vX6c7nRJ56(x zTS!ftsh6KRYOAfxT&RtB$<-rapzVPQZPdkfVNqyIR}T&FT<>s%K7Ac?A;+*(YYh3O zF=)x+o{QIU^=@AnE7Mf1WF`+|Wg0WDXWuieXBxk1+qkPXuC@r&)8K6bl-5}Lc&IjC z@?ziVjU%jsX~iIaa;=n7?=@oXN^=FQZIod|OH*BQT9Vh@L|di#KT(wKGY`=eN65JK|8QgP(u4FqmnQNWEW1a4f3fg4u<+_(bZ#+3xPu~e)c z1obhV!ad%E)!3!=cKXkPPl&aE}HCL{5Q}FmARR+=IP? zTp>tCCiXB%ECO5ze9S>Ew8171Two3c_lP%xw2?Z`HG_M2)1Ux4WH!){1$mo77WC#! z45yHMv~enqkppf>Dua7?(1bQ8kDyGp++xn)9yGmk8&(XQA~|}boW(JNdw3bsdfy1M zNF6{V<+a`xHMj>iF}PI{Z`HTJPlJ0jU}h6YiNQUnHwQ3=j9hxAjAbaqt(rs(?qP6` z0CF+72ftp5KW3?#Kjjl3j?`k-O4A5%L;7ZZv$QT%TBgB01Y#DOP7Ur6Y zX(G9~l&Qg2>%_BDa+}299@OE|51wWLII8f9S+T2m8{EU-9t4I_Gps^es6F#-ZVS`k z9vcqK;`b*ACaK$q4clJAVS{@Z+@rt;KWWdqnDjORIsERI28=^^%I`H&^-!)q%} z>RN*qYIE#S6nZUcNRI$;4WGdo(j(ZMW#rNJsXW?(pOX-$LTx(q%SG@pI%NubHKa%U zS;p*rTETKiyBX3Wl_vdhlf2DYs5I{+W{Q&0bFw-1h#eW}QDYWfBb91x)t;5okRFEg zNO2i5`st6L<6U=i>>-E^bL^opJvlqP)|z8E3g``yIYWAIJkr=vene%CJ;IJ~a38|; zN7XHeAw3M~;hl?6FEYm--U*WbbWvPROZZf{EVEkP0f#yE z&>zxjJwdpvoplID^OCCLR*@&#%Bf2*#~#!?sxAWJwSDZAp$b!QOgV2(XR=QYP3 z`wKeAFvlL;GdIT`8UvOhQHUi74nfSZM;$889DBql19R-rfJo5RL&1zM z=-308jfIgO0kg4GoHz*9qZObY@BQg-LUA*v9-Jg)d7!tI^v5U?M{lp_IOf!Y93VK& z&T!%Oh(SFJ>JguGLlX~W!k``;b?pq7F!N}`lsWYXoY8Z#K|KuWVQ09AQ;hscEHr4? z87}ch=`nb~&Txsj5uAwF87{#U$N)N;d|)4DBE20Kb5V@*4WzO&T(}`r6nSR^0fZsz z>HOweh?fUzNNPL7rQYd=@JP$8n5VSmB6W?R_0hUC=F}rS>sUBtXSl>CXlbW=!lN7z zLS$B3*=D6kC3o?ZVxW~WHT-#2nKX5qQxAI3uR7kC<))(wt(XYMHknHMobtJq+&A#PN#WIOdI@goGK~!=Gm)OGs^A zH@HWbcMR^~Php`yB!3iZ;EgtI&+^YL;^)KwzYtA4-Zs-dxMKdr>2?7rC7?7&dn&uv@ir~b;2s9|5Irqy#L`e1 zz{z`RMX1L$*&da?Zg3CbNPw=?efgtjqiVXUuY~-@r-pDyOBmdv>c>QYD(2ZE_`}iu zIr3&`y-pEH)hVmenwRe|%B(~GqG!Ll8B5B^r4X~ZNV}fvW~DT^2dy)0XbS`g2i|K- zpK#Fo#Ms0P5T~hHz-9qB4DKOPdZ&|kT0uI_;<}EjEv)b8*D|z3h$ZJ~1RzIUL3%OXl z1Npk(W=X%VHmsF2JHsW0DAMl=H4AT<&|_7Y>mHcSn=&I(_uR$j<(xnLP6I!>;0PE} zg+877s1WH6`KB?_V2a`DSs;j=bgZo##Y!98LigYZdj=;RM1v4dQK0bTf} zN0mI^^l>bb(hhRr_Zxa_)v%H-l*m~QVRh`;o3(b3OHt@;o>aBAgIqe$0rsKXHL(ow zP>pS;6Rf$veWep<)9Nh1hQU3!7$hLoynC2;j~MEZ({lBE8pk&89x*opOvKW^vuW4AX>#HW+ECWV?&T$TUS%pnS=ByzM8JOfo^aQ>QwvAfyN7xAxYF&cUD*=I#!_+i0Ny>y zy>X-2YL%nW^4hS|-YA#9bSgkU{`lXRrw@aEz<_0*KDc?TH#7y@Asg%l{SZS@9+n_{ zGU$gl3FWzD2fM^yA=tq#VTqwls^;k*u|h92K|WP3t{mbMh%00#9zA9 zbHkt?VrXw*Yi5kq5Iw8d!7f9r3VB4QdHSF{81%#U3;nrD08q&4FAtolOC`onN&WbN zKpO`Am<4B-ZD$SV5Kim)ARjl(ss{b=V`1<|V$cuq4q~1@Vo%Wq{Wu3W-aKCl4_CHR z4f^4?>h<^S2K_MThe1CYfDaHvK(OVS^Gc<`7NXNUR~c1ir#p)evxfNf@a;N?f3`pth-}62-%cC1a6Eh5mVL)Q5i2fi_JK8V| zNYD`t10rrj_yI$F!hvBx?6enJn&mVWbN?Y|%u(@?>nTHUhwjLDP9Hx_rTe)KEGBU; z(jNcoQtA_N?ofMjG3r8Q`}=BR&`0JF?pm}TajhN1Ikpg=4sM3-!}>n1d_BSlsU1AU zX~QZy#MZl9acpz{5p%;ZAcg_q>PL?c;Zy~~fEWfOoCi{e=8*ZoFd%}b@GBjDj!Qfl zKd23Jlb*>WMT|R(Q5X8_6Nz2jd(S(BF${=DFNF~;MsjEu9$GsQPUlma`wy?#Rpl@* z-Evk8ohJ?E_Jzfq>q-krY^}ZO6?Hyt_4Jwi2C-G=A8@VxXqfx#$O;EryH1eZsoKJ33RgaVc*pR%m@k`#upZ7>ieX^Ov zG~fq6N~oS4W9Pouxi4Dxtb=bD@S`YFPF;5+F3lna{4n50%mD*_81N%#LRyO#6OcLo zFy|lC!x{G78Zbyq{>&Z&e#9o-Jdbja3RxTI`CIy7E=B4>X7QA%>DPcCoC%5|KL&d6 z!=|%(v|+C^;78Sdtk=FGwYiN5JNG5tqKvHrcJ7O4qz3#j;D-S}4EW)<$;pRziZit* zsXRH|xL)jp8UudByMGT%xtD?t_z6=VdcTKIYlnLQERd!$;D-S}!W!`?c3NKGe#=sE zeXPHE=6t_ z?t|!ou3IH@g|h>xMC$ZpX}wRJPg}K7Et1L{ei-h9R?7_~cVq0E zQ3`p+uh`}^N=`fTkT~Y>gO)V?>3oc<5I*Ui8OJc(#}=ef<|{k&CB~X*8#i4fw45u; zDrzJ}M(Vj|R?5BN#o{=AL%-Kn{AyZiS9H?3cnVtJwVN0H`6@pvG>0EmG=n+(pl+4J zrlmc@a3Ap)8n|H&Kg7yzhrR>}3Hz(&@WUK_n8T08)E-h@Q)_KV_IeHX5nDR)JPM;s zaKa($Aw7Q!S92*0_u)TW6drkehVW5;0j1-l7!FCJEq$}on8Ochpu#!BeVD_KAPwg5 zqX(2^;K%2&iq|d)ytMdl!CKhU_VHsGdJUF=7HkPjxnH~I{nR0Ht~=%StM=Wk%Y z{bE#)>JGcaphFj0`CG+ebXSi*s^(NjXZYY<=)8cE`PCF{x2Y?lM=KmkojANP{brf= zo56(Vq4ka*ItP#BV*a#C@jvJLx_Ui0w;XXWp{>#8@FVSAX$xz<8ScYyAEG<^BVM`V z6T2FGXxbA~R0}aM`)+4)grjmx{1O)v#)^6rjo0A+KX>>6=*EF?9}2p0aDN|L>wCj- zz54R;Ou81I8*X!n&N zuIyL{6=|M5^*Z61PHHUgd3d)vM(- zkH-+%)_ZUHxQ6@C_=A9-$@$#S9L@XOU=CgbrJfW6+Nc` z@vsHGi*2}%_=_GH|1|H+--kb>qYk-Y{yxm#hu#e_e;+;P6V7lS^dUw4aUJ^14iHjZ zx8e%AO)58r`v@E`+y{}VdVetNugc2Yuip0{V?nC4-!Iu8l-XUcnB;BnoFVb@yNn@T zejP8VpHXZ6YAN~D{<{X+wrM+#EmrfX;ZX(T%4PA4-o^8vz)Z5_YK63KA2tg|K zI&L22#KUr*CZyMgmq~j04#sdFF$!C_qmPrRN^4%e!zg38k9;4c?UZ&_FMX*ERjlQCuxf;#vK!V08yMq;C}Qo_*cUZgsai&cXbB zh(>DuKFr^T`TH<`ALj2PXy*Y@AZRD*p1bgc%~JyWzGee!IvxidQUxqmieL!q9YM{c zG0fjb^%xt&eR%w$=-lEtux@?-3H^OUz>THiD+l!V(e1aI-Ll;rH>c2#_wW0CD98r= zh)oxIF{OU^V#MbQ|W zR0Ngi6R`C-Ju9WT{BV}!%Hbiw2?-T{9&AVFTs%N2<+a`-6~Kn{0zJFRTLP46rY4v^ zEMe33HkTjNA97l5%Bir`Z%4hv2b~1S2;s1V)9ym*g2ZXvAfIxCEm*F5IL?Sv>$Ogt zjvMD|uCIjHX&(r!C1&stS8wU)oaHoDZt3{LDTJQKriLMY7BDZ>05o!QUVl`kx99SC z(A5zEI8yGcno%o@HM#n@-rZ3@%2$I)`AK9SJdImUw?Not)nE>xQ`fC7wn0C<12%(x zP!3@KdFa1I%Zw4RWUYtRpa zew@Kfb{QHhA%Nntp$@cCb+f<}qvCD10!;0h=JLZ_esDv%-c?Bz1Z6Hi%;iT|AzyMU zP=kJi^|V1hsD1Z*JDv4%!|CEnu%mtwzKyMt# z9tu|$1(5+IY1Mno%dqrz3>}U zes`Ci9b({*svjghs^s~mAsjLu8Tf;nvwEw;n_gux-gVzi4Wg|RZA8+sXK&pKyhFHe z;12<92uHNfTX}2Xk0ItnZYI)L6c#gjyJQv!!~A}j-w!=Y&Q^{z+wxGV#InBNa> zVg#T_)j(q44{zY1L4*FY({IT2_z<>bb!-EF82E$RWCR--_``!j^S}nbrr^gv1d`EX zZqWJkOeO}z7;qMAh@em{hxVH^$c7R@VZ z5k3A&dINtL_(PwNky}USAPL@k#u<3=5KkT=X^%K9oBEP`IUVv0vCZ#CtJt1cF5{6~ zw%G#j4Ezx!DSv*8NS>Yd;w|Apo(%j^?PCW1F!0BQgW>rP>G!bO2tCHYA646ifj>?< z&yC_oa?h=~^v6iS^NZ-#0_~95>Hi@3|)hd2Wrynsl%;`rCEfVj+hWSeG&Ba^{d6?4=(F5}P)!`f$ ziKmf|VwDN;@+Y=PYCG?RT9$B4e}y7E(sG-RD>gGpli%Oh`J2-ZB0miG(Ez%I2!|5; zq&z#_a39jg4EG_N@QyjEPB!uwC~@OK=dktPYv{bw?=|uxnB?pc&Q*Hyvyo55zjRjH zcCyZOs(e`@qo)4mLFmivL)THi)dQaQg2Y>`^6FsNzt(A& zL&JZdXBqxOobubDFS2&iuGzPo%k`k^YHOyvo%i((&tUfmqi|SB$Wwm>n~%%$p?P3O ziF`EvG2Y+Er>&k%tk=Z(R8{MZ_L7kINg-U+b;`#zzaQ1_F7?h{o^R&&!}q1|MOx@f z+K!|>d6?f1?oW9uEyp9C9?fs^>$o>?`^SE~$?;l`l!Duk5kT9(k)cZinJ` zKRMl-72J!&kVAu7#cSX@{p&F=JM@M4EaE=+Rg>XAM2?=W$k9dj#PA=6|1kVV3);2l z_SZ0Sl*x|lz0=F3VezTncc04Rld-y1Eg=DYY^bF2F8$nLv%9@~&|!+^*PVi=Hkf5b2# zoD1yi7msfYm<;j87t6|nYNsiW<=DYE)`hJtMoH;?v3xpO=yu#}5r2icNQom@IXUZW zMq{I%kK+=9g)7YVX&(rPoq*5~4O8Qob=Zjyi??LegrcgAa?f44t%XNaJoS7reZ!of-Y_t5W|3!7^6LY zCCJ6`>7J_~UsA*Z(H&f`@%+{}2j9;O1Cn}xF$_q20@)?V3^fZ{unhxZ7?59L3<$s* z2gQKI;Eh9}KL*>a(dw$9KMehW^_uL&82Ur(4Tk=pw~?IxR=wuVBRYhOhW_wh2IaX# ztONb782ZD|A0DM4{YKlW=HWOb)e~wra9%3_rUh!ga9KXR1 zpl$h8EC<*AJPBd(6y^a$^fB=dGK7{&OSL|4O7Cps<1&q%0F!bm?Dm@nkQgx$&?bid zF!YCvLSdKHf5+ItXw<`aZXQ6)1BiJ5F%KXzPRRbdod9DVKx9oi3(sNb58+Zc+r>_R z(MSxxS6t_x!aRV81U+Bbji>(!^8n(pJ^Iv|Gtgdn7L9-E@9HEhoE0D_2l4MAoHq|3 zp2vp%AO@1Cg(3FS__u*`ZQj9IR2Q6`)uTOzwP)QJ`oqv44af~;hr0psS2u?KF!aZj zZfEUExi`K74HGm^TcbNZaHea*}T?lY_+#nS5B`Szq)#2wXroU z8_1x63>rV^4Aw`6{D6LBem`XGZpaVO=M4E_$d7=C$|E=Wz(aGE=J&BY>6q4VkstlF zOg_CKKX|T!NA{ZEk9cp~kRNhN3{O9fzZv|DLbr@CcXMBx-z9{;HxG-@biPmG@6rwV z5uY7aMQ;R-8S=wpg;Fd*IE^MfEhhZ}QEL{0*N}Nb<0|E?AwN8VCG>H6j+*k%{SPUB zaES6ff0kSQ-k89c7r}#5DHkR$m(|O_fD6k)z+XND0hI=6?vDE?alNy#3&f79v}zU= zudZ=A7lgLI@@ddE5tij{e`5n;HG{e&W*vRoKN0%AH;2B~X5*v&sDYB#nyqd5zuf9J zN25-wvAS|%J@(sD?mTYJDHo?g=_2uNB6|5zybYo8V+%W7Jh!6`?Vid@I9-~Jt;^1V4!w)#8h+WXg= z`;Dzpzc*-(H{HduyE=iH{dl-Xakvix^Tq!z#k@7Am|i(<>~wmac6rTbH`;*?g}R=M zZjt@Tkon4gk<91SAht9C1B=hB+t;zqA_dr4JihP3eMFH``3}(XvYON z67gy>G;B48MRDYVKU`k=P08}@1+w&`y!$&DZru<+eE@RR_6hvO|&+x^FIgVFlr%F8RO>d~@$6dLoZ z(@}C>V{&NO>9@9_kIR2w2xe|@Ts?!p@L4G4>}6riyt+_k*7nEc+HSkO@2-~pCAqzN zJbL2z52e93@7hEAZ~s#%WZt-3SIBa6qwI|_v8F}2=amA#`LCtGdEJc6>#uEiqU zMOPAHt`K3A1#LPFFJFOwdbGh(s13f@LK^>$kL&P4sU&{F4P-Osv zKWt)kriz(7)FplHgp@Q-0NfO|y+1;Au+SU2VaN+LilLx!IP?!tgp#sfe@+Vd;hgGl zbiLMWwmUt3Lr@NT&2D3(-{0t#(7M{gey6?6Vj5IQPaI!8xw?A%^omb_{uISn&c&EC z;&)H{&zD+4(I-&6+^oooR#tOv;!$s=^0W85uS?O3aC~p4>qeu=f9cuKL>loUh$xkl zX_xzrpGhIVGl%1@Sr=TuFSncH=JM8{Ib+ThB}SrxGB(9z(Lbf|TWr2}S?-9VvPdk=pF6aoii1jp>!| z^)EsTTRpY%T8D$8eg~Nf??S=lG&g|murbd{PZr$pOR&SuUa7F9h zObhS{;fF;>E_63js5z10CQt!G%kCsmu168PE88<@F%zZ;*=CHk16f`4(w6>?<#b!Rey~PaUGbl^*1HMMU0}; z9@7B*JJ2Df5752%V6+_UI3qWFuU14X6Vr|7lbC_F{_hEG^SYjw`SGyX8#P;zQ7L*d zk$JHxC2znMS)D+}$A2aTU!T*AxtX7{whU=9gF6X&QD*S;trMo{+o?Ex{5Phv%we_= zDs)U3KZ6!&8tNMvdVcSZg)j3OB*&MDsjWZU$S~UD` zVW)(pJG;i@#;p_9I=wb%dKptf`WQ6e@suk+fAVij*&luKvg1LVE6v)m{qDP%;{xgmFkSL!x6T&$lTxU$`dJ%^w==_~Q#mPUq66z!P6oBoyY|q}&;27Qc@ZJ-s!f26OjI4tv1%bLQyHgK z^f`ziGO7o!K*2EhYi`ollHHr<>5&L=C5 zJ0ho`54`LP<5cNxLs9$xRTw;PHw0C2OSx9RUA87Gy%EMT-eI?RRX@VgX?i-*+QUEn zjj7uD`T{j_hG_Q(mgv(kMo%{WcHU#f_(myV-j0;wT7SFKNA~ywK_#1bO`%mya%~F0T10i9 zHi?iw0R=6008bmX$^j=Mzd@OKlU8i+pZkhU{@zwx84X*FohCMLIJ>aBHO6IYv)|oy zwvCqShmlV*E+5864cyXdXl=~0qYsm!51<9_nWXaC+IvXAp@m*ZxqJ32EMbURS#FqZp#Up+*=6Q-P7-|~69 zefT^sQ11nu#JNmq`o`h&d$$~6z8IC~z(P;l)k9>~nlhj5GNBEmHkmD+sFwNuAqt3K zs-b{$zKPx~1;Xkp@LlHbHuM%3TVy&F)oROM#;)%~YF*}^QlDUj_)6WGk_wn zXI1*cCI8&Bq$qAHzOhjMU5wEfB90YrER^9Q1A-fIzP?a)3p5mRySX^MP;L|A;!c3n zHx}m>N_R!st`#!6p;(MPb=;0b4Y}P?ys{8kliZRq2N@hK4m2BJ;6tLN z;;n^BZB56EnS%*(ys3Ee5IIgex*nX6AGb|zc9gd84ayF#j!u0D6~*lnU#%VZ@9M&n z&=2r`4OgX0;m>?7iaUyT@#G`;4JzS}XbfMjJcDNw`Lz-6#%X?gxcdyw5Fa9D+oc&G z&ItMX?_c)u{${*qS^oQ$CgK)|K~4&Nw;?vqo?`x8=c~w{wZS%~C$U|mVU8VKG3BlJ z%jY~_={o-V)0WA}wySXyF?)y?*ZT%M>*Lw1`riY;wQHywX&K{s7k>xt?v9atNd+W_}wfr%Ma3jyg&^h{>A2gKuO~`+MKu)v0kKu|Evg1l3XOAIu zALkBlAT__BbMo$mrmc7by7^ZZBD&F zONygtV{({sbd!^B_G6K&*U_p(``zedq>1v_N)J!!lIttJlsq@sCVl);;_pUTK{C$Z zntpyr6>|{o+<`mxa4(HLNKglqa;#zBxL@VLR$<V~=58)e(`s zgq-vxvaIvClX3V>mzq+gQ?gf)Lyy&RsErtG2aW-wT3RXHL;N-&W$`F+4)kz_)1&)s zpn`J1F`cr=p3RYmElR4%&#{x&8!$5Y+2QiEE>3wsT`5}}uceM0htFc%;4^;t=w}+q zc?nPHC(+A>|04bj?v6Sc+I4-f+H=k!H`bo<>TEfqPVm2ES;~HkeZ_&Tm75JjqOT#xGlP)#BfgNI(lxJ%u?Z=eU@Xn zACYcx++v+5Pr}37QM)t62gOy);IHBD1vislF23$cj_+6xN({#buUAk8eLwQDFV~t+ zHzj-{9n@b)Ll|kW#={flzv0S|G0E#x@q8K6A?-z->qZ3r96`7NVF}^rB;cQV&UgHg zxQx#q-t!&vx(VSJ0^iAf{LX9d;T-`ROv4|^S7^8u&vNwLhUamfv{%ag9k~7sf|SpD z=5Z&&T?lt0+=Fm00_&MRXFl;W<|FsHeD1^h_&LGkpG9~8A-J*^QfB&2%8Z{&8S+fZ;C)=iC_a5c7)9Vm|Z!IKnDInwHPmw?rmR;QAy2=av@{zJw6-J$)aS z6Tgegk>@due3s+WOL#84U_U!ODIfn7FPQ(!2#ot>gjW!L6@fgJ`}o~g@I1c%waLA- z$5)g4ui>6$Ft0NRuOgg9kUZp>l*jvAn=y}blXNWWJi==TOegm-e?|7$UtUM3d&gNJ zR~}{L4Fu-RpICm_rhFc^HJ`nSKswXs@w0E>{aXmEzr^FSTz+x9cM#_y0_)3kyqA1= z{Y`{-5hP!E7T25ddkNt(!nY9OGUIoWFUKHx9_J%@yodMiC;7zh;(X+}(8s*_jB!W@ z`|`IDK0sic_*oj~J9wWy`)-u(Jg&JBF8NUYuTJjCyAKhX2*OL=3thZkLlD||-$H03 z#Bum6jZ@+o>6S7WhtJk)o^Rl}a z&*OS0x$i~yY=?ew|GngX5Z$x9kD_~~A0pg_;E2727x;-g5Gze$Sy2v}R6H1u&sh;x zlJTiz@IB*69KPp|5ELK>-wkUnY}9NnmSkVeu#5J-JQ}QVH`>1dS*I5EsOJ>B(zl=am2q917`V|CDwruK@AU2s0#5hdP_?&<_>5@nx?5nu` z8Upj+k1&HwxRFG%7W|PHtch@m+##2QFeyMX%@KDF@r5{6j`@>YBwC0%i|bbrNcb6q z9C0_1I3`LvFB34a5GPF$civeYmW8u(u#>PekYIL{ClQ`PpcwFnt?)Gj((o(-TZnRd z9)ZtTKAA;2$-FlZUPIt}sdTQx&g!JEBkdCir0eSlq=|GqgFt4IQ7oG@KaW6~*xJho zxqfhr#F0THj70LDM6)0kz>dVu%0l?VO1z2i4FslRXNxO&0rz~*&d1J4Vo2262yY=U z9q;+W@+dh>e=`f_P!$uw1k8|$-$A&D@J)nw5m*}%b_wA!!nY9KLtqQAfEy9sNBB0v z2MFIm_$)$9>=oQIPv*@$nK$!ce$00Tft6rB%$sE%Lm<)2lX)}W?;%l0UJCmjuBC6p1+k1<`G>un3F3l8{-4Hk{@jB=dAkpR zV=4^tntB!ueGRfG=_nh0wMErd1#Tkt^y$}l;{7Ag@a z66*-BA+Uv>L)bvrMCc$;OkPJ2k=w%cHbNJHjM+ixA@mUj2p=K5g1~&p5b}U^e;$GK zl5Xb7w4{kG&w8@nwj+7@OF6dRT&7qcy;HX$sVL2ITWy(tyb=P&es`Fx%)zw>aUgb)eIXH2|? z(X-lerj)g^jK-j6%$%mgptG2@hVt1P3$Hb6EhfgKXL<8E*39v2;NSd-*E=Hx0#5mC#F_U{XPJDdwuv$WhEoUZaYSVvzr2?0GoQtum8{7BK z^{U<4?}ujl1kRty4-C`{FKeN03@e*6kylI%rOfrhC!uI!BS}o^s#%dS5?Wc?08Wmi zAH!Z<1@2G`9>tz8<)=Ho$>P8`+SySDE_3?b*khbt=(8$sj-kFL;yra&K`0OV&V9Yq zWs9IP$i fEm!Vt1rnUhuhFyMh#W|+-_wdG(1u#0rDT5rD{vdt literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers b/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers new file mode 100644 index 0000000000000000000000000000000000000000..92e93dac0d12c942dbf0673a732a0facd60297be GIT binary patch literal 4056 zcmcInO>Y}T7#`cDaXtzW;xnyaM4@Q`ubYrmU{OM-jYyS`LPHKsD>L35+mr0hEHkqv z0dZ?Vh$|N)j@&u*gv5b+Pau8(Qhx&ngv2}Rbu+u!IBk^fDc;Q2^SsaV&a()i5_-NG zkkBKVC@Oo*rPWXb&Q9PX^UwGxOchZ@$c{r@pM{D#!7O!LA>j|wqkQ(76fK_y4ovg~ z@fh!*F;rHxMB(vczxm%I{s(VU2c#O+e2t99s#AQT)HRA|I(*5IDm>JKyq zo3b`>wV5>*5B1H)Xe6LY!A>P~u^xp!bBTtt<79gbTPh|vo^$4%dE6EfTXV;J#_4Jl zw5T)y=g@fAXJLIegat={3xfurw=Qh|cP=6FG=PO?I6LKuV_;{(u)}!Uk9NG4O-T8b zG$E%3gDP93M=VZehH*0Myc08$o}3|NVK^z%2`OhDij?1ufs`rGh|?xYQwaihwurl} z1dpYhqUf(QMU%)9QA5PWlsF`)Ck}kYrylTo;1z=T8 z-LCK>4Vs1jMBqIZsj3P<{$CJ)T=hgeVTHnvD}t*i2+d&N0Sa$S8b5_Mi|CB)_AO8M z-JU2Mjb_bVRw9xvHU27Ht*@uej+!>NNT5+7J5gYaT0&3H)UwAxMdlSTLZ4YIZ?AVL zhW^Be&%PwkY_RJSrEqpG_5@X!3ynSKRYX!uu+m^_7q=NFezL|!-`Sro)!{YuJuKQ- zgKx1fOz%ot`w27#je&NA++8vq1>J~EeP92AZX91xKB1pSROvb>Y*3FANj=V*!axUo zG}dnoVf~qznyI-1TJfDL#D^|RWX$^{D%`esf5Y(3psz}e_s_r#xHerLM~Zq`-cDqB z+lhI*d+&CF>(wLS+D+m5Hl?OX8y8SX^Ds^4VltzLP{X9qv4|)j1jBQi~DG%uw#plojC`vXU z6&SMvuhxxToKJ`-{B9}r<@L4t8eWXFsB|c&63Xe}fad@~K3d zchKf>dRjpuQPeiI(Fi<+i$@a6*ESL8yOda-G-BD?Fi$O=1J$xO?{UcGWWHSP>wi$| z80d!lS{;Pf6%rb{ulKWTww1nbST7!?zo-5kroYLlht?n58*Uf3eBpxThw2Z~cA-`I z`}=yV4pexnh@9*l?9o=#i4iSB_WVFnvK45+hsL+_he9s;KEx+ZU6Y>Fd8^l6K-2blOxLr{#5iOTGdJSq zD+r$W8)ncW?U9hAp3Pkeoy~pS4`?RCtdan}KNcR9c_$4$mg5h9{*=h^y`yxi(N()v zqZ_GiH8xZ8sQKJn@&=vCuFRb2R6XKHG|p!5155<@tw$gOn*2AI9N*cH_wo`*BinZ3 q8{2Z(!ckz2PuQ@=Ur51%CTtFBgkcJi2kq^{pxFxygSU1dy#E0?!_jB} literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/.syncinfo.snap new file mode 100644 index 0000000000000000000000000000000000000000..1253ec8ad8c6db053a75de6169f668d2efcd4ee5 GIT binary patch literal 48 bcmZ?R*xjhShe1S2b=vdAllRFv5a0s<=in4O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/org.eclipse.jdt.core/state.dat b/.metadata/.plugins/org.eclipse.core.resources/.projects/mapdataservice/org.eclipse.jdt.core/state.dat new file mode 100644 index 0000000000000000000000000000000000000000..88f4e2b6cf794df9d1c77ae1a3bb47ed2460a2fd GIT binary patch literal 175878 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 0000000..25cb955 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..4ecd6b7dbe92f98ebe59f57d61f4413200236bd0 GIT binary patch literal 282 zcmaKmJqyAx7=$kYM+Zeg{R=|0^@BP}aS+7C;@-v=t=Oa_Z_%G`sY@Mny5a7*I{`pI z%+QgTSa(&VA9?9XY3oQi^0soCJbKz1Cc|;6Z*=062_h6V3=G>=k{9GTElPBQWwZ*H z>%}4pR&$9#yZwIQW&!;=%ycH_b8C)Ok&%N8Hxi?-xMy|uH{f;0};PJgS7^J?y25gehdIrQXIno literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/9.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/9.tree new file mode 100644 index 0000000000000000000000000000000000000000..a280ab6d0e974d16dab7fe2af44f4977bbbbae6f GIT binary patch literal 22136 zcmc&+3v^snx!z}Tl9|jDN*{qvD@~yVGiU~Ar3F-kl)f|xr4Lj<$|N~Sr_3aAW|B4v zA}>W+)T^SXSI~Rab-hbLTNP0Wh`~7?W`<#6qGYQCA zcdymG&vd^3->-lFud^q1T`VSKN$pjwu4B{qsZOK^N_| ztOGdPo9lMe1heKCqM40v{L!>?X&~jnQog^hx0EY7>jz2~Wb-|ayV|tK3>bSP<6V>~ zSd{WWA>Wg$I6Xa1C6_O}?KO$yHNGW@Bz?Op63J|w3t}C7kR|N8M7*JXLMqu9vmkL+ zLr_lfzxEV-(RIq!_5Y>LMtnKilzJAaxJYKZ3%PQ6FjrYC0Jm_o2>!iqF#IgEeB9z6 z7b2kr&IG%>&jh%R30Dizm@PY%3IwH0XgalEebeX`MyygT)$!FaG2N7KeJ;_R(<{l{ zkzK~*=)mm^BlD5F$16m>{ufOCF|@R5DDktwsVm=4pWAqpTSxf2m8z9Ej5t0xP|R*9 z7J#+Yke0r%SI_yQ#Ej{Nz_VQHHfO$dn7>=0TB_qKEm4QFY~Z#pIFfPa8Mrl;NL8Hf zwF8AAQVl-*Y{suK@aM-wV=*^W%2)D3=KAj#J(|&uf$qh0aJF&=TMyW40Q)S_Saubm zx2-!y-_30M4D?z{#LG@;IN$B~IB#O?S_7M}6Vuyrm5NguVQrgN>Q*XNkn?)CpK<)T ziY&1o?IG&9@oPdHwzx2`z9#L`2cA2QX|F?jk$OJp$3h&uY-MGri--f=EzF)bU%}#e zw0v~pFXAky<@K%Z_62hoe7j85Huq!4GUgZ>=qEji2xC5CaWwPy=8XdAst4^<_1xGfL_;N4>T@cz zi+n`3e&r(!#p%-}es&C?Hoz}XnbFs&GVRrwu3X=G5 z4aH)=7!#?E(>j+eUbJ#mwuA78sPospeAAB@k4@3aD)DC_>ZNfd&M~=y;Jl5Ie>6D% z$%@dMA&Ng46n~DQP*X)8+qn;nK$pZz*jUmWFxP`lsghT#<4#~Jle~nMl}X|iY?r5O zSTkd?w=#C0fqfNZtVHxM_I;aiPpX#c#Bak&#Kr$B<9}=5e-~6DF8Vu+{+)q-$`ErG zNaqYC@sw)i^V2~k5<)+1pr7$85f^*C!X%zCu)nVpGoqD<6iSkX)1)l4FE6w({mW?e zqW?vRX%Si^K)m#U*P594d9(-dGj?I3r$z!a3$y$7Fzyd%F%T*Vm}Q?HacB2k`MpT| zUbR#wo{d`I?km(U&E#m8)t`PPo+(E*? zf-X8x!#t-#s;#c(liJykTQ`7^kENKBjCTH;n{F9Z{aBB9{aBA;-q}9LO zVv@A!txN$IiKy5UXl~jxovGMJN-Eg=X?`l7750daXJU2|Br&!pBIYrc^hUt=oX}XK zVxH!vYZf!>`&27g-*5X92{LdlIpu+&5(GFH`7}3;?qDVlqhZ*ET!gpSpPwHI893L|{K7px0Y}TWT$x62v za6?3J^dc+9+GdWqotX&5Do|u@kFd}1h+Tb8;1oBr%Qt|A0-EmAm z&5W?tx>&oRV4(Cl^<^y9NgrO%@Ly^$7VA-4!YieLLcur8lRk`)hzgwzU988DVBld= z+=EA^)Pv*bvg78Z`xQ~c6tt{Q;uz>`Zj-wK6_(E!O5pv2$+B~I^M7nsfLD|44IfcB2eA4=>^7^M}? zCx_sOMfA|}$PrrVo&@>`Nh9j|gqXC#DGwqM7Zp0rzH%QQ&lpkbajk^)^gK}(1Y1S4 zr+i}`GjEs*60))=aU7Fm$r&6d=aFlbP6kW&$=CBKu%IP$v3>;-GRVFhL-Wa}wkd=K z6{m~!ge7K0Z6kR|pbxBG``4QwlvJn_i=}@82GQuMX+ut%HZsEcxuTMkw^?E$tebll zM$FvN!W(XUNnx#DqhzB-2na%|MFVeB1XNqMN2r!1>U--B z)lzNUSwppGb$yqCzq_hx`G`VUI}P-%>Z(Pc=dk!=H>H;lOHlI*bHnn&c+ z(Q_Nb(CPvmTZLqYroxCiYb7#zI-32=IeDhf`07MPPvXdnOhdBR$j?wQ{^ZA!1D9^*?~Ye3)ycVG+169NbPMC>8u)oZ*>=(7E}$gmsa8I} zFC^O``1=g_2{Cch7_zN0^CSzLvgq1=q2iD{1+8AP(=ZV1q+vJRj@eyFvL%w^oFB5A zE*$Qwf~ZzLFNld5JkEgK3Cv?b(>;hZoIyrC^Yu|U)nEh*YFJKp z%%sL zkNxK4$sR8G{u&3IO>*-62L1z84>+6752qkIg291$whR3qzjD9Sg0(+%K^P?T=~ zAzyB3_Ow|H=E3SRa7VZ(A&v}dGZ(*{adQm(Q9*4MLLY6Q-yPCsA$W@c&(zEKH+TiZ z@WfpwT*Y?jD}J<}>B-MyJ18JZE$7xph2oic z`(IQLdmUOn33dT`67zCOo~_U;$x(7g+d{pPp8(+u#Uz%k9gb&C*x19}<-R9>#c1zR&x!A%--t{B4!l0V5KXtts+B32 z-trXAjx5+ieal2(cLJFLgSlQrqIy>-Q(ypR5rWGR5$XvMoGi1srDjeI^`!Af8Tg~C zswa(pw}Eb{uAVeJW5AEGM2opod_&AoPf>{im=Vp4BYVjb);p9aNRNDLi2K9AbIY;y z5w{(H-M|RFW%Tj5$V5T=@E#81Q}?-SMe6>liGtxh9K)m@Fz^qC69wSRsx*afbxG~P zzC|Vq47~QrK$LoDtV99mx)k@+L%J8xJzOhMFuaF!AWG_CRICf>I%mXtQb>U4ftri44_@(6&CGK;5xkXRURcNZ@pr7giNp7Z;Iigs--%GcWp=F zNO4*r!t@5>miFOYdM$T=UiW&ZkQrBZ_yOA+W^#-gL+TEL3G}I9eBEJBVCc=Nr8;#B zWz8dk`Qcp)7>yCRqq`e{QqcN_ht$E8q}KJkc8(R$5AQmc$QhTtP?IZgW;?)?I0 zgC1QrFgCMm8{jaXVdg{ekDkT7Aq(s-?m-N{MYU9?kZv~O|F8uPcS^R3D9JkNPIvoF zu-oHA2}Lier8>3E5{H|L-88}B-q>+VVOnl)(5jRAoPMW7H-}sKYO66$eH3|eGc!hB|&t5 z9ufM`#rgtrDC(UyWfsgUh#24x6wLaZhGRmXw?va7fbt*2{h3nhU}31we0@26#_E+! z3HG{JS5Y!t(fF1Po)i`9D%Hy8jc{RloZj3}0XKZYG}kXtSZk9(b9GD{(p_?Bd*r>I zY(c*G;GFNw^cBmP=*tGtzrefC_YV$LqDZF2TbKkeU97J_oM@dFhQ>8x^(w}1)M(6W z6AYi8OBK3v$ReRwSF2V&f3fC#rq6JRzGx7Asn&ebSL7Ac0!$YR%TXnbmLB=O-uihO zjusi}kolXWzE5$sk3OZg*D!w?zg^KuJYHM-UoX2Sda^>L*!h=eyblY!UJk)ovLqZY zuIL?*Yd^x~ZW8XQP*TLYi@_Wp<)+RE1&!E*?&zYv*xz{Q2-lX>S7N>CD6dM zji|=kh;<2*96F`CD1U1N16N! zXthv4t-Rf9GMU_-zcEKBFqh-kFgE`+8AEOc6am%tU}ORfyZChlB7iRTCw&e$C(tsv z`}iEw_wER=iT-Oc7{D8flU>prF@SO?fo1?J25=~pKr?_kpaR|=@${Io;RenK-))5N z(Z855@a&(^FzkzidMw2KvxHN{z9gi_T)5t_OEnnGFRL?MScW>+KF8dyHK5-NRzrmQ*B>SCuVl|^tuuH>%@?j z=QTV2O_AE#N)ijqG%_=pS*zd7+1DvDs_pA7aVUBWgfluT#HqyX6aT14Z1POg>bd@2 zzyIsX!tsp7+1ACr22Kcf6P>VQ?XeA$mefFC#rBz zv@DNEB3ap=icD1Ti~UU3g(oO1DP4Cb(OV!N`^F)%gU^IJi}dHrCJHy7sdxYn28I8vNxBIFmI;v45#r`TQuh7GXyC(hKnHD%;?ui~X1t<^HwFK+qt0 zOcS8H$7`gqF#cHzYCn!v`**+gSy4U~z`lpEPZ(IJ$m;i9TA$t6$25DutYPadf8VcYY%IBcbwNkQ zytm2y+}4?6>{F_x+J4%?TQX&BwHXX{^6bV=CVU#L4mDl~*}>3!?p9<}+dHeq)Cde_ zDxl4pMG}13GeR!o;~2L~wGwwvjkBoj{yhdBS0AgKMU7@NF1hcneipTJKv6Ik`##SI zxr5fY`!ouxala+zR28Vmup7F9XKglSOV7PjZM&7KamaH88 zHxwQkQ=j3Zw?z10WEJRBx0}1>Pb{5vH7|l&=u*8uJhth|bJSYMi{OW;=Qs}BY=}B* z8t)2}A^tREk57Bg)YlZPya?XLJQqQqV~D}L2FCi%tU#T4jxlE=ZyS-z_YXO9;=1e9 zFy(9XgVb|9bm&;G(P`QouAKPek10CQjrJ(@Ot+jllaHB3zWDZ7c!7)f1ju;@=*73z z8{kp%1+BLWOV9dCoQFfc-hZg)IGl+(#rQi*7PFJjx%h2*Jzf*RA9#JKico%;6Si_cJ-L3=LVRL>JGa-$G)SMeL=z*TQ!SJ(Ew ztcc~V*7Gx%|37Wc+Fo;W*!jd=eHP{_x;#RbjlX#Srz^MuF~8W3!Pbk|>Y@X(mYD-; z_ICHFIYevl8Y z9Y;Q(625$#mkWrI`Vm6rq$xUILH1p*7+fX8&iVS)p5=05QfH3qa)H-t>+ZD|Dsubd zMz80Ju`d_+m>?ZO#XcLA9y)vrc1e80o+pvQK2x<++bhh-)W`VW6{=wpT0S=9Hb!4A z@F=mGlnp?!$=TFHIxjL%^vJLrKb2IXVKQ3X;nZx>aLc zF7WlXMRq1^ERWk;S0G*_7c8g*<}=+Y)lzM*uAu}LFn+axKdY(|IFZq38R(BzR{|RT zQ3L+5xAKbBSdx~*uHnwlN6SJ8orot3F_iz$-w~bqqZ)y~MV91|BwbI2RuBtmYDs+b z#d`8@RndRCe~Jnp440+GACkgAIKo@<`k}9@&gCDH;(;_CUBy{(f8~d0%KS@2V91tX z$!nka2{U}rTam<{wE4ss{fiR*kC0uXbyEQ;xKs8DCGip}K4poQJ-g<^J|v+cvCqK1 zqHGkp{bv@p)*slRAt*z!2Zs!QB~(OVTm`Lj{=C=fGn z2Ay^qr%5Ns@iEe)tR-~^MmZ%Uf76NWrILg(*WQ#Nbq7ZG@b~0oXe=yf(9H#nJ~Ib? z!m3L;`kDqa7>61#Q$FMUJ*6R`2QDk{a8EIYd#Z9}IKuJ5w(5|>Ek`Zygy{{ zK5d-8hV(JIgBhJ_Fluw1mO9^$9espsl;w{d^};U1n?Cn`q!0ZU?gp>wUsu-~0!D z?C7IHtU#42TYF$ZbqGUe29q|HYEN4zknHp znD{IFfQ~FQGpVOt=*>Ol+oJ4e47!>*9nt&KjIymv>A;Bu|v{II(9qaq%L_f zD5Jr}A(;Zj2Nlh=x}hBQ&02;jtBtdmax7`o%kk?9X?I0Dtct1*s=1C=_B|JAsiq_j zC?mp7C_L2Zp!f-9H2mlbV^h-R(S~xG`W~ON^PVlSI5KloVvVN(^%~JkwelR#_iLW- zYPHJAdw`kHJ0KOSD@Nr(v!t9EPI~P_+Urd5$obL}%vWv6390+q8B%NFnA$Rmn8><4 z@4fXuva-{^zIZr&X%xZ9O#E{<_D%S5g-_>5(L9kgkac2 zhG4LgEDccx1yvi_e8P*G<@n_knOToxGzIOS%u&{^XplBJ9Uh^Ih1|d?2WYKOkifm7 zas;AOj6jsK#1#7}_r9|u1brvuq=N08cdPNS#z_F7pIw9T3Hhd-t3kEcT`*ELe^PwS n&YDg2@4t;SbLVUcKFZ&7Wd#MO@;8>O=5=PSH2r@423NiV-he_z literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/9.snap b/.metadata/.plugins/org.eclipse.core.resources/9.snap new file mode 100644 index 0000000000000000000000000000000000000000..0e9b01ec2fb1d1bfe896a1e9842f2ccedf182ffb GIT binary patch literal 2290 zcmcIl%}*0S6rbHK1-29l1!MdmB674x;z_AM6>+Py81Uw}9d*fWcioxt5fc+HMx!?q z{{ZzLFkVO`ii!Fc7-NiHjERZfBzn<Ic#`LY4FA==TvOnuD5&3b%VlCR%PmuenMIjpQcXb`^-T~l2U}$> z7w{tHuT9qhkzmBU=GqkwgJq|KE56073PHiAsfY}~)`eCh4j=9!%lpzvQEJ_m)BFtYin++=Y!W8}cWROn#& zwII>YfRz298wj;Ic#-hZO+Z0s$TD_3n|qr!p;}zqDnT8UN`zs{ra<5A!7k5tJ>oNq zP_Td^3!kM0UPPMI3y=a1S$6EYyb-jU(nB0@db^K8q6_H)abl>ie(u<%1-ra&g7 zegWXy>qHfeR1c!s>Dd~?L1wwT*`Pm+)w|u&+;NbhyC+dyPuEwTiuOw@yj(yHTe*R| zkeYuaxlhz^k0W%X>SfEB&`k7B5{=amO;k%aj`W~(n}I(iFk1thM5uG(%0i}Lx3PNX zyW9=&N4dx$)LS6eD}=IEHUO28D2OaVokFOuZZ0(#E2J*olrV@Rf;FQb5KRw8!`2lJ&fxAESdDnHW5rvGV)&5^Gzl54>7nBb^rhX literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ajdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ajdt.ui.prefs new file mode 100644 index 0000000..402ee3d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ajdt.ui.prefs @@ -0,0 +1,2 @@ +ajde.version.at.previous.startup=2.2.4.201612122115 +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..a7fb09f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +description.autobuilding=false +eclipse.preferences.version=1 +version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..bd062f4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +prefWatchExpressions=\r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..c6d0612 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.BreakpointView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=\r\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n\r\n\r\n +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +preferredTargets=default\:default| diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs new file mode 100644 index 0000000..c186df8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +resetSendMode=KEEP +resetSendModeOn=0 +sendMode=NOTIFY diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..226e86b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.classpathVariable.JRE_LIB=C\:/Program Files/Java/jdk1.8.0_121/jre/lib/rt.jar +org.eclipse.jdt.core.classpathVariable.JRE_SRC=C\:/Program Files/Java/jdk1.8.0_121/src.zip +org.eclipse.jdt.core.classpathVariable.JRE_SRCROOT= +org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.debug.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.debug.ui.prefs new file mode 100644 index 0000000..536506b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.debug.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.VariableView.org.eclipse.jdt.debug.ui.show_null_entries=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs new file mode 100644 index 0000000..c0117d1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.launching.PREF_VM_XML=\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..8a612ce --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,21 @@ +content_assist_disabled_computers=org.eclipse.jdt.ui.textProposalCategory\u0000org.eclipse.recommenders.calls.rcp.proposalCategory.templates\u0000org.eclipse.mylyn.java.ui.javaAllProposalCategory\u0000org.eclipse.jdt.ui.javaAllProposalCategory\u0000org.eclipse.jdt.ui.javaTypeProposalCategory\u0000org.eclipse.jdt.ui.javaNoTypeProposalCategory\u0000org.eclipse.recommenders.chain.rcp.proposalCategory.chain\u0000 +content_assist_favorite_static_members=org.assertj.core.api.Assertions.*;org.mockito.Matchers.*;org.mockito.Mockito.*;org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*;org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.*;org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*;org.springframework.test.web.client.match.MockRestRequestMatchers.*;org.springframework.test.web.client.response.MockRestResponseCreators.*;org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;org.hamcrest.CoreMatchers.*;org.junit.Assert.* +content_assist_lru_history= +content_assist_number_of_computers=28 +content_assist_proposals_background=255,255,255 +content_assist_proposals_foreground=0,0,0 +eclipse.preferences.version=1 +fontPropagated=true +org.eclipse.jdt.ui.editor.tab.width= +org.eclipse.jdt.ui.formatterprofiles.version=12 +org.eclipse.jdt.ui.javadoclocations.migrated=true +org.eclipse.jdt.ui.text.code_templates_migrated=true +org.eclipse.jdt.ui.text.custom_code_templates= +org.eclipse.jdt.ui.text.custom_templates= +org.eclipse.jdt.ui.text.templates_migrated=true +org.eclipse.jface.textfont=1|Consolas|10.0|0|WINDOWS|1|0|0|0|0|0|0|0|0|1|0|0|0|0|Consolas; +proposalOrderMigrated=true +spelling_locale_initialized=true +tabWidthPropagated=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs new file mode 100644 index 0000000..67b1d96 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.m2e.discovery.pref.projects= diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs new file mode 100644 index 0000000..43e97e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +mylyn.attention.migrated=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs new file mode 100644 index 0000000..2a6fe50 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.java.ui.run.count.3_10_0=1 +org.eclipse.mylyn.java.ui.run.count.3_1_0=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs new file mode 100644 index 0000000..8d462a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs new file mode 100644 index 0000000..2b60c21 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +migrated.task.repositories.secure.store=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true +org.eclipse.mylyn.tasks.ui.welcome.message=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs new file mode 100644 index 0000000..d2ed603 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +knownEEFragments= diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs new file mode 100644 index 0000000..b9bd711 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs @@ -0,0 +1,2 @@ +completion_tips_seen=org.eclipse.recommenders.completion.rcp.tips.discovery\:org.eclipse.recommenders.completion.rcp.tips.types +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs new file mode 100644 index 0000000..0c91c4b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs @@ -0,0 +1,4 @@ +activeuserprofiles=DESKTOP-BMNRNN0;Team +eclipse.preferences.version=1 +org.eclipse.rse.systemtype.local.systemType.defaultUserId=Lenovo +useridperkey=DESKTOP-BMNRNN0.Local\=Lenovo; diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs new file mode 100644 index 0000000..9cc196c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.rse.preferences.order.connections=DESKTOP-BMNRNN0.Local diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs new file mode 100644 index 0000000..cec65c4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.search.defaultPerspective=org.eclipse.search.defaultPerspective.none diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs new file mode 100644 index 0000000..56cd496 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.team.ui.first_time=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 0000000..61f3bb8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 0000000..6ec8357 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1485246338150 +quickStart=false +tipsAndTricks=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 0000000..08076f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..6e3143d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +//org.eclipse.ui.commands/state/org.eclipse.wst.xml.views.XPathView.processor.xpathprocessor/org.eclipse.ui.commands.radioState=xpath10 +PLUGINS_NOT_ACTIVATED_ON_STARTUP=org.eclipse.m2e.discovery; +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs new file mode 100644 index 0000000..a092597 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +fontPropagated=true +org.eclipse.jface.textfont=1|Consolas|10.0|0|WINDOWS|1|0|0|0|0|0|0|0|0|1|0|0|0|0|Consolas; +org.eclipse.wst.jsdt.ui.editor.tab.width= +org.eclipse.wst.jsdt.ui.formatterprofiles.version=11 +org.eclipse.wst.jsdt.ui.javadoclocations.migrated=true +proposalOrderMigrated=true +tabWidthPropagated=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.server.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.server.core.prefs new file mode 100644 index 0000000..8444bcc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.server.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +runtimes=\r\n\r\n \r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs new file mode 100644 index 0000000..076a420 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs @@ -0,0 +1,4 @@ +content_assist_number_of_computers=20 +eclipse.preferences.version=1 +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.ws.service.policy.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.ws.service.policy.prefs new file mode 100644 index 0000000..6696959 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.ws.service.policy.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.wst.ws.service.policy.ui.servicepols.wsiprofilecomp.wsiap.defaultProtocol=http\://schemas.xmlsoap.org/wsdl/soap/ +org.eclipse.wst.ws.service.policy.ui.servicepols.wsiprofilecomp.wsissbp.defaultProtocol=http\://schemas.xmlsoap.org/wsdl/soap/ diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.boot.wizard.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.boot.wizard.prefs new file mode 100644 index 0000000..e996ae7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.boot.wizard.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.springframework.ide.eclipse.boot.wizard.PopularityTracker.data-jpa=1 +org.springframework.ide.eclipse.boot.wizard.PopularityTracker.mysql=3 +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.artifactId=mapdataservice +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.bootVersion=2.0.0.RELEASE +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.description=Service to give Details per connection +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.groupId=com.example +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.javaVersion=1.8 +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.language=java +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.name=mapdataservice +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.packageName=com.techolution.mauritius.smartwater.map +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.packaging=jar +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.type=MAVEN +org.springframework.ide.eclipse.boot.wizard.PreferredSelections.version=0.0.1-SNAPSHOT diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.imports.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.imports.prefs new file mode 100644 index 0000000..5c2463f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springframework.ide.eclipse.imports.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.springframework.ide.eclipse.imports.importStaticsInstanceScope=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.configurator.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.configurator.prefs new file mode 100644 index 0000000..f441393 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.configurator.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.springsource.ide.eclipse.commons.configurator.processed=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.core.prefs new file mode 100644 index 0000000..48364d2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.core.prefs @@ -0,0 +1,2 @@ +dashboard.feeds.blogs=https\://spring.io/blog.atom +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.frameworks.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.frameworks.core.prefs new file mode 100644 index 0000000..c5bb0d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.commons.frameworks.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.springsource.ide.eclipse.commons.frameworks.ui.legacyconversion.done=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.dashboard.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.dashboard.ui.prefs new file mode 100644 index 0000000..020f32d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.springsource.ide.eclipse.dashboard.ui.prefs @@ -0,0 +1,2 @@ +dashboard.feed.springio.migration=true +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/DataSimulator.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/DataSimulator.launch new file mode 100644 index 0000000..3ec6326 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/DataSimulator.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/PopulateData.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/PopulateData.launch new file mode 100644 index 0000000..d9dce7b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/PopulateData.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics (1).launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics (1).launch new file mode 100644 index 0000000..b9e0da2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics (1).launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics.launch new file mode 100644 index 0000000..ed21d01 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/connectionstatistics.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails (1).launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails (1).launch new file mode 100644 index 0000000..c59b94e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails (1).launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails.launch new file mode 100644 index 0000000..7f5dcaf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/consolidateddetails.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice (1).launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice (1).launch new file mode 100644 index 0000000..c895642 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice (1).launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice.launch new file mode 100644 index 0000000..8fa5e10 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/mapdataservice.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 0000000..6a5f908 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,23 @@ + +
+
+ + + + + +
+
+ + + + + + +
+
+ + + +
+
diff --git a/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 0000000..58af585 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..2f495f4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,3933 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:ajrefactoring + persp.actionSet:org.eclipse.contribution.xref.ui.XRefActionSet + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.rse.core.search.searchActionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wst.jsdt.chromium.debug.ui.actionSets + persp.actionSet:org.springframework.ide.eclipse.aop.ui.ActionSet + persp.actionSet:org.springframework.ide.eclipse.aop.ui.matcher.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.ui.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.search.actionSet + persp.actionSet:org.springsource.ide.eclipse.quicksearch.actionSet + persp.actionSet:org.springsource.ide.eclipse.commons.launch.actionSet + persp.actionSet:com.springsource.sts.ide.ui.actionSet.workbench + persp.actionSet:com.mountainminds.eclemma.ui.CoverageActionSet + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:ajelementCreation + persp.viewSC:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.jdt.ui.TypeHierarchy + persp.viewSC:org.eclipse.jdt.ui.SourceView + persp.viewSC:org.eclipse.jdt.ui.JavadocView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.ui.views.AllMarkersView + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.views.ProgressView + persp.viewSC:org.eclipse.ui.texteditor.TemplatesView + persp.viewSC:com.springsource.sts.ide.metadata.ui.RequestMappingView + persp.viewSC:org.springframework.ide.eclipse.aop.ui.navigator.aopReferenceModelNavigator + persp.viewSC:com.springsource.sts.roo.ui.rooShellView + persp.viewSC:org.springframework.ide.eclipse.aop.ui.tracing.eventTraceView + persp.viewSC:org.eclipse.contribution.xref.ui.views.XReferenceView + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.viewSC:org.eclipse.wst.server.ui.ServersView + persp.newWizSC:ajaspectwizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewPackageCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewClassCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewEnumCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard + persp.newWizSC:org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard + persp.newWizSC:org.springframework.ide.eclipse.beans.ui.wizards.newBeansConfig + persp.newWizSC:org.springframework.ide.eclipse.webflow.ui.wizard.newWebflowConfigWizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.newWizSC:org.eclipse.ui.editors.wizards.UntitledTextFileWizard + persp.newWizSC:com.springsource.sts.roo.ui.wizard.newRooProjectWizard + persp.newWizSC:org.springsource.ide.eclipse.commons.gettingstarted.wizard.boot.NewSpringBootWizard + persp.newWizSC:org.springsource.ide.eclipse.gettingstarted.wizards.import.generic.newalias + persp.newWizSC:com.springsource.sts.wizard.template + persp.newWizSC:org.eclipse.jdt.ui.wizards.JavaProjectWizard + persp.newWizSC:org.grails.ide.eclipse.ui.wizard.newGrailsProjectWizard + persp.newWizSC:org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard + persp.newWizSC:org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard + persp.perspSC:org.eclipse.jdt.ui.JavaPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.jdt.ui.JavaHierarchyPerspective + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.perspSC:org.grails.ide.eclipse.perspective + persp.showIn:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.newWizSC:org.eclipse.m2e.core.wizards.Maven2ProjectWizard + persp.actionSet:org.eclipse.wst.server.ui.internal.webbrowser.actionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + persp.actionSet:ajrefactoring + persp.actionSet:org.eclipse.contribution.xref.ui.XRefActionSet + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.rse.core.search.searchActionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wst.jsdt.chromium.debug.ui.actionSets + persp.actionSet:org.springframework.ide.eclipse.aop.ui.ActionSet + persp.actionSet:org.springframework.ide.eclipse.aop.ui.matcher.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.ui.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.search.actionSet + persp.actionSet:org.springsource.ide.eclipse.quicksearch.actionSet + persp.actionSet:org.springsource.ide.eclipse.commons.launch.actionSet + persp.actionSet:com.springsource.sts.ide.ui.actionSet.workbench + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.actionSet:com.mountainminds.eclemma.ui.CoverageActionSet + persp.showIn:com.mountainminds.eclemma.ui.CoverageView + persp.viewSC:org.eclipse.ant.ui.views.AntView + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.viewSC:org.eclipse.jdt.debug.ui.DisplayView + persp.perspSC:org.eclipse.jdt.ui.JavaPerspective + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.showIn:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.perspSC:org.eclipse.wst.jsdt.ui.JavaPerspective + persp.showIn:org.eclipse.wst.jsdt.ui.PackageExplorer + persp.perspSC:org.eclipse.wst.xml.ui.perspective + + + + + org.eclipse.e4.primaryNavigationStack + + + + + + + + + + + + + + + + + org.eclipse.e4.secondaryNavigationStack + + + + + + + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + + + persp.actionSet:ajrefactoring + persp.actionSet:org.eclipse.contribution.xref.ui.XRefActionSet + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.rse.core.search.searchActionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wst.jsdt.chromium.debug.ui.actionSets + persp.actionSet:org.springframework.ide.eclipse.aop.ui.ActionSet + persp.actionSet:org.springframework.ide.eclipse.aop.ui.matcher.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.ui.actionSet + persp.actionSet:org.springframework.ide.eclipse.beans.search.actionSet + persp.actionSet:org.springsource.ide.eclipse.quicksearch.actionSet + persp.actionSet:org.springsource.ide.eclipse.commons.launch.actionSet + persp.actionSet:com.springsource.sts.ide.ui.actionSet.workbench + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.jdt.ui.TypeHierarchy + persp.viewSC:org.eclipse.jdt.ui.SourceView + persp.viewSC:org.eclipse.jdt.ui.JavadocView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:org.eclipse.ui.views.ProgressView + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.texteditor.TemplatesView + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.newWizSC:org.eclipse.jdt.ui.wizards.JavaProjectWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewPackageCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewClassCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewEnumCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.newWizSC:org.eclipse.ui.editors.wizards.UntitledTextFileWizard + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.actionSet:com.mountainminds.eclemma.ui.CoverageActionSet + persp.showIn:com.mountainminds.eclemma.ui.CoverageView + persp.actionSet:ajelementCreation + persp.newWizSC:ajaspectwizard + persp.newWizSC:ajprojectwizard + persp.perspSC:org.eclipse.ajdt.ui.visualiser.AspectVisualizationPerspective + persp.viewSC:org.eclipse.ant.ui.views.AntView + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.newWizSC:org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard + persp.actionSet:org.eclipse.jdt.junit.JUnitActionSet + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.showIn:org.eclipse.team.ui.GenericHistoryView + persp.showIn:org.eclipse.ui.views.ResourceNavigator + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task + persp.viewSC:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.showIn:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.perspSC:org.eclipse.wst.jsdt.ui.JavaPerspective + persp.viewSC:org.springframework.ide.eclipse.aop.ui.navigator.aopReferenceModelNavigator + persp.viewSC:org.springframework.ide.eclipse.aop.ui.tracing.eventTraceView + persp.newWizSC:org.springframework.ide.eclipse.beans.ui.wizards.newBeansConfig + persp.newWizSC:org.springsource.ide.eclipse.commons.gettingstarted.wizard.boot.NewSpringBootWizard + persp.newWizSC:org.springsource.ide.eclipse.gettingstarted.wizards.import.generic.newalias + persp.newWizSC:org.eclipse.m2e.core.wizards.Maven2ProjectWizard + persp.showIn:org.springframework.ide.eclipse.ui.navigator.springExplorer + persp.viewSC:org.springframework.ide.eclipse.ui.navigator.springExplorer + persp.newWizSC:org.springframework.ide.eclipse.webflow.ui.wizard.newWebflowConfigWizard + persp.newWizSC:com.springsource.sts.wizard.template + + + + org.eclipse.e4.primaryNavigationStack + active + noFocus + + + + + + + + + + + + + + + + + + + + + + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + + + + + + + + + + + + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + org.eclipse.e4.primaryDataStack + EditorStack + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.m2e.editor.MavenPomEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.m2e.editor.MavenPomEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.springframework.ide.eclipse.boot.properties.editor.yaml.SpringYamlEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.ClassFileEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.ClassFileEditor + removeOnHide + + + + Editor + org.springsource.ide.eclipse.commons.gettingstarted.dashboard.WelcomeDashboard + removeOnHide + + + + Editor + org.springframework.ide.eclipse.boot.properties.editor.yaml.SpringYamlEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.ClassFileEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.m2e.editor.MavenPomEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + + + + + View + categoryTag:Java + active + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.jdt.ui.PackageExplorer + + + menuContribution:popup + popup:org.eclipse.jdt.ui.PackageExplorer + + + + + + + + View + categoryTag:Java + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:Server + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.wst.server.ui.ServersView + + + + + + + + View + categoryTag:Spring + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.springframework.ide.eclipse.ui.navigator.springExplorer + + + menuContribution:popup + popup:org.springframework.ide.eclipse.ui.navigator.springExplorer + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.m2e.core.pomFile.source.OutlineContext + popup:org.eclipse.m2e.editor.MavenPomEditor.source.OutlineContext + popup:org.eclipse.wst.sse.ui.StructuredTextEditor.OutlineContext + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.debug.ui.ProcessConsoleType.#ContextMenu + + + menuContribution:popup + popup:org.eclipse.debug.ui.ProcessConsoleType.#ContextMenu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.ui.views.ProblemView + popup:org.eclipse.ui.ide.MarkersView + + + menuContribution:popup + popup:org.eclipse.ui.views.ProblemView + popup:org.eclipse.ui.ide.MarkersView + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Ant + + + + + View + categoryTag:Debug + + + + + View + categoryTag:General + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:AspectJ + + + + + View + categoryTag:Git + + + + + View + categoryTag:Java + + + + + + View + categoryTag:Mylyn + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.mylyn.tasks.ui.menus.activeTask + + + menuContribution:popup + popup:org.eclipse.mylyn.tasks.ui.views.tasks + + + + + + + View + categoryTag:Spring + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + + + + + TrimStack + Draggable + + + TrimStack + Draggable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:AspectJ + + + + + View + categoryTag:Ant + + + + + View + categoryTag:Visualiser + + + + + View + categoryTag:Visualiser + + + + + View + categoryTag:AspectJ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:JavaServer Faces + + + + + View + categoryTag:JavaServer Faces + + + + + View + categoryTag:Web Services + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Oomph + + + + + View + categoryTag:API Tools + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Code Recommenders + + + + + View + categoryTag:Code Recommenders + + + + + View + categoryTag:Code Recommenders + + + + + View + categoryTag:Code Recommenders + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:Other + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:Server + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Spring + + + + + View + categoryTag:Java + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments.gen b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..63a7ec9a3ce3e4c844ffb7c8dd88e6eb3ff32ef5 GIT binary patch literal 20 QcmezW|NlP*2w;TK07=6G{r~^~ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments_1 b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/segments_1 new file mode 100644 index 0000000000000000000000000000000000000000..086dd032ec183dc1836c473ba63b877f92dca2e5 GIT binary patch literal 32 acmezW|NmD82F4`GbZ;33G_XZhKLP-nWCoQ0 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/write.lock b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/http-cache/write.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdt b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdt new file mode 100644 index 0000000000000000000000000000000000000000..d5abf41cc49dfca7560ba7bda088ecb22c377ca6 GIT binary patch literal 11 QcmZQzU|?nhVgo%h00CG4oB#j- literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdx b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fdx new file mode 100644 index 0000000000000000000000000000000000000000..b8ee80957685785cf4fa43c7adecee1e634fd737 GIT binary patch literal 12 OcmZQzU|?o|02TlMD*y-p literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fnm b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fnm new file mode 100644 index 0000000..523c92e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.fnm @@ -0,0 +1 @@ +ýÿÿÿversion \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.frq b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.frq new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.nrm b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.nrm new file mode 100644 index 0000000..cf8dc75 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.nrm @@ -0,0 +1 @@ +NRMÿ \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tii b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tii new file mode 100644 index 0000000000000000000000000000000000000000..ebd518d6e4ff5decae514a3f6233ba3198b30ae3 GIT binary patch literal 24 UcmezW|NkEb1ZV&<1%Q|f0A5)HlmGw# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tis b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/_0.tis new file mode 100644 index 0000000000000000000000000000000000000000..ebd518d6e4ff5decae514a3f6233ba3198b30ae3 GIT binary patch literal 24 UcmezW|NkEb1ZV&<1%Q|f0A5)HlmGw# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments.gen b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..63a7ec9a3ce3e4c844ffb7c8dd88e6eb3ff32ef5 GIT binary patch literal 20 QcmezW|NlP*2w;TK07=6G{r~^~ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments_1 b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/local-history/segments_1 new file mode 100644 index 0000000000000000000000000000000000000000..c5d7e17fae39a53b004018ce69a90e687c70445f GIT binary patch literal 241 zcmYjMJqyA>46UEVDh_TU$bqBuxYR1OtD}RXV>z#l4s+p-#m@o77?kW|@P&}B1X6)pcz3+#SjHT6lO^Xj_)SV-#Zuj$4n^;VzfS4`fkHi~s-t literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/server-config.json b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/server-config.json new file mode 100644 index 0000000..063c70a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/com.genuitec.eclipse.aeri.server1/server-config.json @@ -0,0 +1,44 @@ +{ + "version": "v1", + "title": "Spring IDE", + "timestamp": 1521529795778, + "ttl": 10080, + "helpUrl": "https://aer.ctrlflow.com/spring-ide/help", + "feedbackUrl": "https://www.codetrails.com/error-analytics/", + "aboutUrl": "https://www.codetrails.com/error-analytics/", + "submitUrl": "https://aer.ctrlflow.com/spring-ide/community/new", + "maxReportSize": 524288, + "problemsUrl": "https://aer.ctrlflow.com/downloads/spring-ide/problems.zip", + "problemsTtl": 20160, + "interestUrl": "https://aer.ctrlflow.com/spring-ide/community/interest", + "connectTimeout": 5, + "socketTimeout": 10, + "acceptedProducts": [ + "*" + ], + "acceptedPlugins": [ + "*" + ], + "acceptedPackages": [ + "ch.qos.*", + "com.sun.*", + "java.*", + "javafx.*", + "javax.*", + "org.apache.*", + "org.eclipse.*", + "org.osgi.*", + "org.slf4j.*", + "org.springframework.*", + "sun.*" + ], + "requiredPackages": [ + "org.springframework.*" + ], + "acceptOtherPackages": true, + "acceptUiFreezes": true, + "ignoredStatuses": [ + ":java.net.*:" + ], + "problemsZipLastDownloadTimestamp": 0 +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..63a7ec9a3ce3e4c844ffb7c8dd88e6eb3ff32ef5 GIT binary patch literal 20 QcmezW|NlP*2w;TK07=6G{r~^~ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_1 b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_1 new file mode 100644 index 0000000000000000000000000000000000000000..c9719a9a30c6f262c2e7db98ca899dfc557a0fd4 GIT binary patch literal 32 acmezW|NmD82F4`GbZ=<}G;lIclK}vmG6tLg literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/write.lock b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/write.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt new file mode 100644 index 0000000000000000000000000000000000000000..d5abf41cc49dfca7560ba7bda088ecb22c377ca6 GIT binary patch literal 11 QcmZQzU|?nhVgo%h00CG4oB#j- literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx new file mode 100644 index 0000000000000000000000000000000000000000..b8ee80957685785cf4fa43c7adecee1e634fd737 GIT binary patch literal 12 OcmZQzU|?o|02TlMD*y-p literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm new file mode 100644 index 0000000..523c92e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm @@ -0,0 +1 @@ +ýÿÿÿversion \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.frq b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.frq new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm new file mode 100644 index 0000000..cf8dc75 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm @@ -0,0 +1 @@ +NRMÿ \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii new file mode 100644 index 0000000000000000000000000000000000000000..ebd518d6e4ff5decae514a3f6233ba3198b30ae3 GIT binary patch literal 24 UcmezW|NkEb1ZV&<1%Q|f0A5)HlmGw# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis new file mode 100644 index 0000000000000000000000000000000000000000..ebd518d6e4ff5decae514a3f6233ba3198b30ae3 GIT binary patch literal 24 UcmezW|NkEb1ZV&<1%Q|f0A5)HlmGw# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..63a7ec9a3ce3e4c844ffb7c8dd88e6eb3ff32ef5 GIT binary patch literal 20 QcmezW|NlP*2w;TK07=6G{r~^~ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_1 b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_1 new file mode 100644 index 0000000000000000000000000000000000000000..c5d7e17fae39a53b004018ce69a90e687c70445f GIT binary patch literal 241 zcmYjMJqyA>46UEVDh_TU$bqBuxYR1OtD}RXV>z#l4s+p-#m@o77?kW|@P&}B1X6)pcz3+#SjHO=X;In#byH2(bQ1+yuQz)OxhhBFZFL zDt%E}TvL?~YFir=J)i+)A^0%Nib&=X=f1`S4^u|KV|*S2#3d#@s~oGx09*{uBfuAY owwQvg3>7*`I^rD9c-N>xN3wIs3X?c!)f?NuX!Xbsug7lv0cXih82|tP literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json new file mode 100644 index 0000000..cf79bae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json @@ -0,0 +1,72 @@ +{ + "version": "v1", + "title": "Eclipse", + "timestamp": 1521449902113, + "ttl": 10080, + "helpUrl": "https://dev.eclipse.org/recommenders/community/aeri/v2/help/", + "feedbackUrl": "https://www.codetrails.com/error-analytics/", + "aboutUrl": "https://wiki.eclipse.org/EPP/Logging", + "submitUrl": "https://dev.eclipse.org/recommenders/community/confess/0.6/reports/", + "maxReportSize": 262144, + "problemsUrl": "https://www.eclipse.org/downloads/download.php?r\u003d1\u0026file\u003d/technology/epp/logging/problems.zip", + "problemsTtl": 20160, + "interestUrl": "https://dev.eclipse.org/recommenders/community/confess/v2/interest", + "connectTimeout": 10, + "socketTimeout": 10, + "acceptedProducts": [ + "org.eclipse.*", + "org.fordiac.*" + ], + "acceptedPlugins": [ + "org.apache.log4j.*", + "org.eclipse.*", + "org.fordiac.*" + ], + "acceptedPackages": [ + "ch.qos.*", + "com.cforcoding.*", + "com.google.*", + "com.gradleware.tooling.*", + "com.mountainminds.eclemma.*", + "com.naef.*", + "com.sun.*", + "java.*", + "javafx.*", + "javax.*", + "org.apache.*", + "org.eclipse.*", + "org.fordiac.*", + "org.gradle.*", + "org.jacoco.*", + "org.osgi.*", + "org.slf4j.*", + "sun.*" + ], + "requiredPackages": [ + "com.cforcoding.*", + "com.gradleware.tooling.*", + "com.mountainminds.eclemma.*", + "com.naef.*", + "org.eclipse.*", + "org.fordiac.*", + "org.gradle.*", + "org.jacoco.*" + ], + "acceptOtherPackages": false, + "acceptUiFreezes": true, + "ignoredStatuses": [ + ":java.io.IOException:There is not enough space on the disk", + ":java.net.*:", + "org.eclipse.core.filesystem::Could not delete*", + "org.eclipse.core.filesystem::Could not move*", + "org.eclipse.core.resources:org.eclipse.core.internal.resources.ResourceException:Resource is out of sync with the file system*", + "org.eclipse.core.runtime::Invalid input url*", + "org.eclipse.epp.mpc.ui:java.io.IOException:", + "org.eclipse.equinox.p2.*::", + "org.eclipse.jface:java.io.IOException:Unable to resolve plug-in*", + "org.eclipse.oomph.setup.core:$org.apache.http.ConnectionClosedException:", + "org.eclipse.pde.core::The current target platform contains errors*", + "org.eclipse.ui::Conflicting handlers for*" + ], + "problemsZipLastDownloadTimestamp": 0 +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1021361779.index b/.metadata/.plugins/org.eclipse.jdt.core/1021361779.index new file mode 100644 index 0000000000000000000000000000000000000000..77902a7735819859b85ec6181a14ca37f2494654 GIT binary patch literal 37157 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1075874757.index b/.metadata/.plugins/org.eclipse.jdt.core/1075874757.index new file mode 100644 index 0000000000000000000000000000000000000000..fe0ef35e00428c9d5e8fa57a8d47f04e90688e61 GIT binary patch literal 243694 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�YJw6Hc9y)OzZqh9P_*0>zn1Lp`@CSq~q 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1079038258.index b/.metadata/.plugins/org.eclipse.jdt.core/1079038258.index new file mode 100644 index 0000000000000000000000000000000000000000..0235e49845d272fee9092dae020f41702ddaba40 GIT binary patch literal 88132 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1183045005.index b/.metadata/.plugins/org.eclipse.jdt.core/1183045005.index new file mode 100644 index 0000000000000000000000000000000000000000..9afca209fdb12bc39c0530d4b625c72d2e1638a8 GIT binary patch literal 25 ecmZP&_VjacjZg@44GQ-3_fs&`Gc>aN4+H>H1PJK> literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1219017619.index b/.metadata/.plugins/org.eclipse.jdt.core/1219017619.index new file mode 100644 index 0000000000000000000000000000000000000000..92cd309c5232030ed26604086489da5cc80e5da2 GIT binary patch literal 127556 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�PX*4;{U?z_2+0o{L<=nWq6HLn2(^Z<3h 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 D0C>xi literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1234405984.index b/.metadata/.plugins/org.eclipse.jdt.core/1234405984.index new file mode 100644 index 0000000000000000000000000000000000000000..0a1c1daf1d89d2290cae607d1f0b73bbfe05a146 GIT binary patch literal 992573 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

&0q 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 djvcv!j+&6A@^QClb(Dk0bI{utr{vSQ_2?GEC literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1329982142.index b/.metadata/.plugins/org.eclipse.jdt.core/1329982142.index new file mode 100644 index 0000000000000000000000000000000000000000..8fbee849938c3648ea9e63f1d3beb1df4887dffe GIT binary patch literal 520517 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

Pwy20SSr+Rur__EqMu7Vu= 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%0A2)Pc=YY(<9~5D2kVW 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%0A$_K06T-8Ptf$k z+5F)S&*r>!&CzE!8|`gF$H7arSKX7_K25z6$cpgusb+CQ!b~iQ24Ly%#Rbgk7DZ>) z(K4E!?XzTZg_}^?^Fs%qksGf2)V&xeI!!47p@kD4#+SIzn8IB~u8s>~_XA-*(=;-W z(`@l}5O}Aj7>K|Wr;D-A2RP=guNZHfd(3+ZfV+&tpK#Mr{&c_U0A5QcKIX0D7#QpF z9t@MFuH_qPVX(W)Y}cVK?+%EjeBRqX-F~^6$FVe?h~3%~4!hz3bstuA31&>oQeC#Y ztf7|Rg@xqOKQ5lFPA9n7ht(-%!#w~8m8=LI`U<~_RT_PTV_TC7{46bi+O?ca`)hsQ zlf}00HT5`6K=U<<0;CimI8R?2fY76`F9VQFh8KX5@${bHf+UHNqOS(VMc1vg;HZKV zXzrtXbIerLdPF{1>EIFGr(ALrZZbvTF;9{hu75;L!@pi>ZQ!1yoZGP@5HDWYCEcPS*Heo9@TxGMTi=*m7O60}+=Q=u7S3%J*v4^-(b)`n z@;!ag#N-R4J``7pvA_PhmMQF=Rv1`HgMo-EO;cJFnUs(<&+M6v;D~d15J^&+K=c42tWIVqkvY;cjWz1i zF8_&>r+dS{_rnTKq4s^9GR^sev5yvKn;0F2dZ;k|<8ma5W@7P->!Ca=S3;3$h5VK# zrp+X`arH&2hMkSkg}pOO0@8W1=@Is1Q+uH)5X?R)WA0(wHSGbmc`Mg%QLlk$Fhx5| z{%b9?H!8NRMmAqLw-MWulcckcP1~Avx#%7HmvkAtFDI}4C-rctT%;UVoSRUvK!!^Z z=L{xPyGW-e_EC9PckRnn+1amKoiB5l5qG;qZ6>sOgsD~-=G(J0R3_AZ zDU_LM`jA(Di5U}^^DUe?CYT3?35G>9X%V>nB#WSLSc-DFSrk<)?X+MlaUfDR^()I1k#9d1n#rB(H` z>g|AS{*)(Hz&#xZ?xOie!pL_&tX_>x?Z;?e(yIW1Oz|B|qi}^v-!MSOATj2_fCRD@ zhnCx?`Y93csip6ouOCtu!ksyAt4|&9bF(fA5-1q#iBR*m-Wb1ARl+^t%ICyw3COlM z&Yx-XiJK+*LgQEb0rrf0=w+n#xLRadp!j0QQ(pfjeuv(s<{6&E1nMdUu`-W13PFFA zuQYi@7K9$h9c9nYFou&o%}I4WUZ(47ls!MD)Ukx%Hf50={V(lkH{ ze7vsmvsYrwEj%au1}R?JhS&ds2{D=F4ixw3FBXlFqd#fuzAbfE59Mvs8dJx z#$82I`-hJSqKFaeVA2GXUqPNtE#LiB^@GrGmyxy(>yPw0>8OgshZpK1sKjH<@gY~U z)XGU(T}l52Fu}!3t#>A1K%hk_1s5k8WKa0Y@6|=*XV;s>@)2A}yS!LK2005Wjz&i( zP`YrE>ERXO2q-2x3^3NoI|~1qF2;F|TIcOfTtL_6W48jyaEJsul3Do7H*bL8rZEeL9a) zUxoANkJXYcF9en8WHrgn26-Es-KK8Bg7uy3?%M^~fdN0wJk6coQ>&ckM+tO9)Ayg4 zKh0fzQk=@(6J2|ZMd96(O_Zpm*SC3Q_(=@^1mEQ304@N57ufup)7FM5198^C``{Xo zS8&J!uiY%Z|C^m`+Gz6rZdQlPWh>r0n-PP94%UvnzBEEHc$-?~rLJ$NU18hxz3V3J z8esN@Y#P$ezHj;}oD?t5aV_4Dj*yp-%U?#+Tnf^{e02K`A!ON07||BUhY5^}gLLSo&qnxB)a&tDc*015c- z6;}o%+f=hz;GD13_WGU1ti})?n zU)XghvBDdI6i?dr2aY7_MingwXd+YR8K z6o64M`L_kdC*Y!uw?3B)DeHgS3q*Q zYV1j!(KD!>a!I7Ho)0!M(%5-k;3{eF`OsS;?F)pwP`>0kmvk@CY?*D+%Q;$9Y0=lM zw{7=;I*}}Sq_erX4UBJ@2BX=FZc1xF2|JYZSWEtOi&foT}7YBcd% zC?1AmEo)w^4>LNtEQfV+j` z9C!>A3_k!0yrINW8iq)@%qhHVyXY8N;zF^J0LKd}*b#Fp6;@;VbQBvGmH2R&C31(t zj0#Hf;j~}81ta8xY#ifO#vAQ>@oS$^%Pq8zM5@`?7k+W0g939fSz@9ohM*74k&d&| zK_`vpsh2h2Dx84^A{G3-mk3*iJWoB&-W1kF2nrp0HBTrKdyUyA5r+x?D(S4F*LBm0 z4j$P?_FknJjCvF2SeMVkYWp?ye~b<66pT(52g8E4ul(P!!Tzza!7kI(BnJ5{ag1AM zMe3YmI}dg00O=9C-$x3P9r^}3`{PVMKQk_v6ST^XDeB1vBue<%A7{9KXMN7`JwXh_x6!)?j-5 z-F-b?La-W+6vcLd?=VI*u>9pS>Yvm1*JTAh;eX!O6Luq84cVZAICAO?((QHhPvYnp zw*;2O5x$#-cF(sOe5d#?!TM=rEYRrIc}C&!fZSDPt>rhzuQ3KFHB5q%q618zJe;7-?EL z=yJfsAsFf7ofH@tival8RUh^*cYp99e#{hq%Fu8IB+y+&qEe$JE;UBF)3NIPtu&Jz zirwt8?z10IVHeoT@OYxb%keoTH(v5WH_~R6aBC0?(s9C2@ zt3cUn@Ns`*e~vre3my1W|8{>))%8JUBig&HF3&N01-`1k@(wlL(p5((xY=m*3H90i zKKN5gtxqU2BjxT%AK15xwa#`n>`l`$YRd-(-;=ctOSey`-^TGAh5SaJuZxg7JUODZ z@r3#t9L|yb`*yhatJFJ3L`TGw#&vhr4do zF-#TdEl#-8d>Zw%+}YTC8X<;z73GMTNrxP1UI@o7dTY6HSxJG^W^#@L!NqzF1+-MM zL+t?dkCNGny39@)d9CkN>!_vZpq2ucf)7#I_UAAE^WaL{eX8|yxRUHH0{DAw6)%_Q z;aItf8$?S0f!IC%Z@#pLPiw0TYCz7niG&H4lnFlLek6 zJyB^PDR1*0`WsnsW%36S8Xa2gb_jz2q?0{e{i%;2^EZQ>j4EiM(f~U*5;0*r_CC-1 z&71}U+9i?&aqHaW<#M|X_R`8I=5f=y{PHaROP=s>2t0%rp$4;fD74<>H=2~kYwwng z3tKmQ;{(qIXY!J`iBpifLOMaw8aqM?9mF>#bEg|^7(FZY zkUSY`KA1PlYIfit$$TVdK7w~&Rd3ZgG`f92DL6*#TaU!k+$gPJdNRNpd#sziix9Yn zdS!5@2Mi&>R4neOI0rFpem}8}S!Jz>R^?$9*`lam2oklPH83)EobFhJrOa296~^j` zDPLiTAZqs)RSA+zYrEX$ZkfQw-RVj*^Cy!!8ffLNP$ml1g<%-bLa6aDuyYQ{f{;_B ztwE#YalAw$77H>)tsnzXrnV5itmJ-q^#9yJH;iu3%OpZ0pamvJ$uxtBnzqw4++R|^BE}c`P4fjJ`yQ8feBsC(Ib1L_pjW2|La&&RRF~VP znw0_55C9Skl|0IzrQpb&~CJEG5fPch9VQvpbA_F;v~ zqpoY*_6`2Rr7~*O%G8T;zczdnYK_(sXpa%~1`OBKb`y9&9+m2Ol)LNY4^OV4{EmCO z3D+TwgNoUck3btfryg`50@KkD*%?<|b#SY}IAuW5Z8p`b1k<(z#E2+^j7-^NHJL8t zbBktuP;FwQI@Y}`sUA=d%9+6VJc1d^k(_PT1JwCM1JM8_4Xgfjvrm{i%Y6O&vZ)pn=}n0?_hm=@6zn6XjU3%td?sVlufL>1ZNeN%Yc0KG z;2`SQ^}VRz-G?2G{(>DJkXL8)7gNC7g(R(is1IJU_w@=kDn09@+whoLf`sfDZ9z0O zy6oBTN)FA1hjJysFpPOq!6#%NtQ&mGpQvX$m+@I^kLHOEu;)N-9(aKqH}buEzP>(j~7r8KFknNVt7(|a#e#TWo!VA758_Q21mr@|Q5qP~WFA6s4f zbo{LMYtH4J_CR1R+tVTj3GLc+NFV5|yFaSFJ$6=VfW%FdVt|Cq+X9k!p9ccs`Ze|a z0788J)0G;Lk$dw4tAp?+vUx4kgsq+dcbK zYr9r7zwkuA<8d<7k#p4hgmk?n;v4UNPPMSH_tZ%>7&sur3P`fGw_tqhy<2(4g7-<< zTKevKoP*ulp2p)&kQi*&x2t#Kz)J-NzkJj6DawRqpVFQdr;4 zyAZh$&!`JGCfqbE6qfL=K383g5T3{oN9GM9LVAX`+Ojc zz3JDS`szTBsL}(J7U3fVGvwXhWcJOqdQCFII<>(!;xTmAmZ`HLML`f8q;`EX8=cyP zuES2yN(s@-If+Jy*NMJp7D65hXo{YWOssJKhOEoasz!v$n7#%G1_y7y5BfT&jueVT zyg#C=h@;yh1A9xRs~Vq4C)Qq8AC>0UC%CV3y!x@1X|1`Z^MuWw82SY9;dli!iAB`P zvyKfm%$SaM=_cMth#WdD?71By0J*<1MqC=~fM(2;lbtWApA;Ao2a#^hb4ccE)(TZZ z`|%U^gSk<2Jc+SqYFXwQBmR5`77bp%5SyvW-Y}Bgwt7#3Rmvt`<`96%tqL263d6~* z>oMCdfci!q0Gs9YD%cK&2~k7wz6Z#7&(Wav+Fh(?EN^t$rTQh#2{yV9p_AgUq0X+e zSzO8Q-9F?>%PeQb3T6_%P9pv0mLT`^kA?@wdWPM#^0Jrl(Gyv#zjgTKE|#SBX=R1V zobbPr0`CiM{XOo6^v)D4>6g~m+Z`G{eH%&5u>}v2r0?kiylw&*F{}LmY*)Q21=tAI z{IDPvjbw=-?+LXf%~na0-Pb{!7Q1W%mL@3a&M4jLipckB-mPZKV-&GP1 z)0l6Rl&}qcRq<>xn|}o~`N0Hz`=4aMyROIupzzpkO%xX|(zR1&p%`Z5AHks4a zt{3Z7QXd0lgYExNMJn2&8YeOI+Mg-ve;iwXkY477)np$8P0mjR8v#Fj0K+50niq2l z)3jZ#CVq_1a*o5jWt4*vn*r6f@eh-4-!s)0(^ae0H5ycBCDK-|*xW|U3zbiLH87I@ zsLr8Sk1{n|?ZPHEBVMePQKVF+>XZV_eMmji^POre(@acPCeUf){)}W5$)QTcp<(`)}mWZw0Bl*7cLblVwh4WkIRvR zL4%W_cypc9$WK6us=Oqk51MX?1biy=$`dA6aYC|92m$p@d!j=pwsK_WarH0*AlBPc z0|9mWU6v9=>)HaHQQYSC+mmO0tFKHZ>C?AE_BpMQk^hIMfR@B;2QJMM%~FHn;6en6 z_@;dTl&VPKJf^SlAJxIlC8nXwG6U(iB&lRf5%V zk1peK1F(%k8wGqXucojVGysz?i}mm?Zo@m!LRZubFH|aXn8XKbFqj@xXG^59;VjTD zhZ|hysB1zJG;x|o2P49pw8|C&38OIJ?B*(xE>F<(aXiWOoGfO%Tom>&-(yVnSAoH;iee% zc!jws9*Z2PyX(n&zL{PZdO6WmR=A5M=sIPDrZs&KjUEm$}xwWx!AcLFjPD2!dA-0AWyq!L&v9ZjF z15sf%XZHZBAVcg77xGqmXK;f1H>-gYEgO$RpBn?dPap-o)MBOq>O(O&<)qij*gP;P z-R<#!(7gT(bZWT9N)jU@@z2`z&imAbQk~p9B;s6eQL0GShL#-PipwnMp*l97ycDf^ zvPMr*mN&ij`|5ShrX?sU$Q$O(A+TdAp6tz@;@fX0XRQu04GW4n{yXzik z%DRPH&1<=+&bS+}%=0$LASSv8D8_xz(}&a-!PiXkQk`2aPt{6jRsnVG*vg4{ot~jp z;A{_8;tzCQrqNd=ilVW-fTD!Mj>e_c<;X3uNrM1SUOu8hL1}kv3w;LY*^rI+K(5dz zAUhJ~r&NrYHXEoe>8Lj*hn_RuPjG=jvYpQK07JYx#BRF+gN!Jrguns=k!pd7uTZpw zd7)5CpBS4gB_}3%t+6$Gk-|cLLWKExN?e&gB$(Vguik(*AMCH^NC30~=){3YGT-wV zgZVAltV0f|B>SFOujp!fkE#s=O{vfzX_AITJRhFUDIz95B9lL!jKvIgy!I#Rm1Mtm zIB^{RL5g)7R2xb9HOI}N%L*pe=9=Y8G>6W-(V$EbQKZC9zy5XVA>1D8vaKp!(K_GY z@;r6Tp?{(Q!>HBXNMPnsjap%*RZ-sZBkEB+q2h(5vW$x6h!&${N+UQ_KkPB>tp>Ml z5X!N4k2TwCkOUWE#LeGZ zNQ_A~@R2@XngPwyWTli^WzR+JD@bd>FW`OD9G1M8Yv&P1U>PZbfZ(sxXkSg8$JGq- z#T!Tfb{!r4do-VXgINlm%T+qSX=JI?FReCU{g$~>oX$e_*CAl01@eD>Sn)gI@XD-109`@mVWiJ{fwT>A%kSh|xJ-Xc~f zeWp?YT}vX;j>^!6`?4cak97d|Ga#D{ylaw@#@ahsXm3oIBsK^XA*kIVYJe|P8g%J! zaXF-C%;J=GU_{}iGLq|cAq~~IAD^tz882Uno$42|7sZs*BWBSV zrottVLd2zOvFI?60KmO(Vt+SAdFnO53X%cDp0sqWAv=E9%FC_IYOaORTXrQF(~GKB zglTmSMUC7e0Gbf+t5pwnhao2L*yX5DZ^>5zj;E1snu4+SLVqy1%V(*T8jZ`sQJ4Xt zUlW3};4shVQn`!>1qCl5ZdxL&iI~Kd4;nql3*kr~R38CJ4n(;z1q(8PT|ch&T_DL zr1EZE3TJztRTL|A(68mLb%+T#N!p#(N!*QT@WyVW?rve2?A&bS3J*$^03cVOB7TLj zsTEdqz!2xl=L*H`nR@*~g=(R6WG)PLyO5HBGKnA{a$e@7&~~D}zK-p~K^x-^lyn-U68BzPR9>g2|T9ZF|J zKq?)N(hIW{s>3oKYxmsN&s2*vFuq-uqF$`4o5H5GkAc?xd+O(9JUTJ1DW_!1>4Dcp zZOf?9j8b}-SL3wVlbofP=|f*accG+|EP)G%{&RJ&)Bdw-V+Da6ft9Pg~ z#9L>p9Izu63*nk1jOwJ@)@-e_sWV~%mtKuO4l??~D_7h+ESvaoOf4JkJ^rOxFgU<7 zxmai+BK&#dE^+fS%LMysPMr-9GrQSnZ@Y;2hA!d`Q6DP?TlH2{H`iXG^W*jkzlw-i83MdMjZCg9RKk0fQXf;uQzrzI> zylG@iYJg){vyhPr5ryUr8$UFLjl14M_SW|rS>lOuS18`EdG0!FYgm*rv9bp%(6{ zZfwh)fiBx}7J)3&X$jxKc}{aBvb0H~Wv>@CibT`ypY_Po37~?ZkO(3_DDs@XU;P*O zqATP)G@%CAa?6~lOnp~15s~nu_LEvZR;dhWq_MYK8!Sm|90SOV#jCkm>@yhgQ=^sCZ^{P_Pfqz!K|Gm zHx4ga1?meeFH!$BL5nUm1z9Bhj{lC6#jcu*_)7-PG10CQ&|aZkrqB@ah2a*brkF>{HEw8w2A|ZzkAh60N5?(_ zSVx@L6O$tpPRB}?bzT2Sb;emOFG{?Y zItVg0Co?_bS~{8X<$O?-PJFnHieQQ@Yw!E>)z70UMKe(CEavdQK1R(Wbu_MDM&ySC z+u@22!{+cl0enyQVyP@jg6l|0D96+>w~+-AWq-ssIxKAm zvPVgfry>4T1S#LD+PLf)t>CbrwQYX;s=A3PIzrKCD=*mt?4&kZSXxFU&c!NC}P7@6X`eP-kN#WHe_KVCfPX^wS~j8P%^8g)CO{bJ1!^15@m#vRRxT$xTUW~%m&t*%Vd@{qP za6Xw~gHw&NlsgV*;HB=x$$T=tr&Hzf0t~FtW1dQb5Y%hcu>@IjrTKF09P9(YrSUgc zI$DN!<$z^Bh^ug=0w{B?hAK@EC+9suAUSLH^<*!o+Xyh~{Z7zm7To)(pJVfhd{>J# z$U0VDuz(4i_j87`j1z8SFHTt;#{lA#2rSj>RK^jOk;VAWD|ki9F+A5qK@l=AbSUje z8N(y!fJ9LRR79ofSqx)^foD@u_ui~luA=!C%d>l<=uP=?SOXt8F&66}+rzzI47&4=(Lq9jmJWCt^Xco)tnkX}SK z?u!u+RUp_QM7elMiL@cr0Lca;ekRA{r1Gx9e#%*!LZsKfO1&F9I!<8|L~YTjoll!5 z5znHCIh|j4)L+)T>JQaF=AMAH1Zq@qV^5NmP#!!E z5XLGDQKUelpA50QQ_^-0zc^QJ+U`KvHj#0nkW_(eqg6nXB3iEhxcYyQmWF9t7{XDf z5FUAL#qwO4Ul#WqrYu(Lvs>*Zlq%!}gfAw;cn`~2TvqFP6v%$h*y^C&6l}FqZKHYq z+T=65I}SF_^|=!4`$yDeztZs~FHUhocXcjZ%t`5@=C3!>Qw0P*|`)$?j@4|U*r|6ACOB>WKt@1l3Fge z@5-VkdLMd~yj~?g!>ieO(c+pL!*Y{EEJOy9?dh$EC-Vw5+c5cgFdHaHBt>~$(@9CE z%ppIWXpucWtZDCDQ?G1v)~c1(1|gc;(UGr7>+UHo4h=bn3(-#KR&PwKkT5r#ma+M}2_wYWFjn5W{Lw;(rU^5k zj0+u0ZA}l)oBUreDxByalmajMubjj&G-b!5%vMXm+vkRdP3Tvsivx1FDb@N!Jj!A9 zE{atI;cPHRTfMkXXPHZst#RnagGU9qMg?zAd9=K%R5dxP9x@Zu$o^*_H%LIvZU)E- zdZ*nYn}*iMBn0W2=lmbn&TK37Q)XWDiATp)=%#;WPVI$iUIT3@)hWqk#8e6+P!&aSCajUPHW9w+fGaQbY>}OT2ADX^VKhxn3JRX zW#`w=Uxr@8tom@c2Cxy#yh;iEYYZP1c5Q~*L>=9!jz01~JLw)%9E^pwzE6ETGiMam zLdg<+6~1|Aexv%!aOPnC-JE&$6taKmaV~H|C;QytEV5|R+)RJ>eCtMalm&9CzzgV> zw^E2c|5C(74B+L3{w#$w(xOMtR=*kNNqDB6hpWp7TBjXkkm+_H-@>uq&eTx#hA{Da zBk1B7F^B1u@4*aeC^B8a$Z7mO{2Q=TLjSNYG5o~0TTY)vnaZ>KC-H281|}hPQGjG! z|CD+v-Yswb2GW%0kusP1n-nhj`FK&g%L376xy0rCFLVb`-wVU%b zYT@BY>f72&1HjcCZ3Mfhjt^1S?}cqT;fDP2i`yk=;~1D;9cDICMC=g8)U)0$p=_0Y zK1BXOftjk;8vxaE_;d&AHxnJ+yO)CW8#0%wdKYR;9&0xZ2zT`e0yjouFg35fwV!>4<7UJ{!PB+i9@dHCjUaj6ao25M)GFTHe{ zzxfSurhxl?NgY83BXA`Rls5oHPvy_QT5W^TNi&eDjS2n=mhTN}KS-@2J)We*Cxi>z zNlqZXi1>7D|JrG~Yr63j>5Q!l7)bP&t|e1_RYx@^zxYIS7@-S>Cg2q*fFQr$YZ-3i z{p!I^gTC<-s9`6*!9n|CYnB%8PIn0{ZFywKZpMG55o|O*cy&h?|Jm(v?nhVeDd0D- zMQ~=~?jScDNzlb`Ox|UCdBp{XZ{PJpr|;SSLwF~pd>&Gi(<{39X7xFpi8}2P$|*Rs z;yZ6#&+*l;iUF`(f!<5hv;09n5A>`V5{4i1YX1lxO{VJV_4n>P%}@}cDta~Pscbz@ z{W6?I(}<8@rx*mmrVR(klqvZ-yh&h@S*8O7?qIto4mkJn{lM?HItNx6LrVR%>CXj< zIg8R#%qW(Q0d&@i`!kc_?rT6`N9h>A8Y7}s?yFT-{Nk?bf1-|GXrR2SyaC!hH~I8i zBBd(4QZsou%K^e+;|(g9EISd5W3o@9OlY-@kRgiTQWCIjih22aH+n79VIgEqOxGv| zf2IyE)sSjTfu;RadQ*(FfoSq2sDT(vI9HGsvgWzIRZSxdPLH^VW(||Kag;#_?NLW% zQpP(!GPV8QwD{OZ)v-lOZ)fr6zCO2qa++&rE zt>2R_ZGDcMQ7;Xw?UsIqLhl{o+>fC#S@Ccgt0`8Y(mPA8PoxC4EcdaaqsZF(k}@rNsZsjr17LKdvIH$yKw ziH$320b0ySc+L|kE$`{cxIx;f%4D|06(TE)cm?@sURZbgl-L@2459)p26J50UjZEJ zL4dsFjb!(LfhrjpnCNtyocw_sJcpA0Daf;}5%8d>E(cfgCdrP{S}nmtjdp&UikQSd#XMMPj-yB4UG+AtUJF79Fkto1&e z5Hfo;?ZefiRv~nCU@UL<(?eFX_<6)g=stvC97 z0zT?+AV5q0NPQeruyp`rZ{u$nlu|KaYnz7F6~1r#W$KA&cM4%OnTg*AUQvfxl^fv*2c^_o^!9Ck;DG8TOh zX%}MKBrQ}`yo}#oNGeRwK%LOIJsUx5!;oor((>Xg#fgA@lCKcrzq44)mYbA>@X9iAl6q9pFJQzcl10Lug zUL?#9a^oPyrIM6&wz>8`!_JK-0fM?h-pJILB4|%^*cq|GOTcKO5Q0^Bb#>GkQAEro z+C@DoEoLoZK^^GFzPK60HrLYTMs+}@#guwGDQoT*+N_p;MJ2Ozn2{N5_;6%69lBF9 zcY2`Pa-#^EP>2rUdC+USSzUtOWqiC;2)rPqHn^Y_B6YqH@8tRLQs=RuM@`RI{ZyBX zFYh1KIjPKxM6m=oU=*D6lG~v0LN)Z#4y?%#>0;K7WW*7=n)ilpJ)-WDy4RYj99tV* z$c`r^U4n8u^Kt5MJGZG!piJymxJcz`LxQVKQSaM;E$@ zR!Vi`L$@Ya*%d0Sr@z`oE*Sq7x%f)lt7vOQ{TMG!(8-8XU~1pc`GFbL*(c8fF%6V5 z(?Q1Ig>WyNgo?CbyE@OE+5hUT%Lgq9*tAf4DxD?>?$Q2{Se$vbQIX+fiNH?ks<#Om zL~hcF1|lRdyDR!OQ$c2Fi^q!;Zv(%KEeyA6{rSXvr(3?HNghN*PPF;6#M|!88&EPN zZ&k0#U9z2dyl5+-%1$N9+!wtsmH@1P>lL*Z`v+|Y=yxyb@*uy=n1IHSYkx0sKkq@;L)FVsIRHa zt4G~bpajPOg=cs+_o#Qc*}xyrsC7HZYzvPYJXzns^Lo3tNz*KSw#4oUi6421Hp<;K z>xvrRk!}8=H=B9zvn$7@BTCUscAJ3?c(cj4)pBRFn|t#c>M_Sa*c(xyukN%(yE&m> zRd4nu1Qf&$=e3)Y`897cy5vI-7T#^fIR=2270VQYVyxye%x=$QPJOZ@Sr;~TV_lIr zD%VB%i5x#@q%+Bbv=IL|?DnMBk~#+Mx2?x>zYFJhnxDS`O!bR@gh%dg#Cv@VLB=3q znbu69A|5TtKGw#Z@FkXKi|{Ec*Gla+YmdO{xX#%$kEk~Rn+D%5RZ!eKDY%yUb*C;8 zv}X4+l2Yc?);;7rJv81f_)$~pVp;{mIbZt5@2j`=nhaG`>CW4GK6I5z8rwLg^m+Bh zyeVO)th*@Q6ni46`V^?C!*0&@i`1ieGl|(Mo0kMV8rkX4+R}mI3OSz?EQ7WWxp&8MmAOa2$cpx}gOx#UAy3jW~wKUwZVU?+c!> zR7c5F7jUeWT85r-VLx3kpDv`7_8ydR5O+;G&+N~sr#d583Rg#K^GWr}U=z+$_c8Lq zdPyLw3w+B4g{0jqxm&UIA$6}fY?{CcLm~9`xleacE?M}2W`lXVx%L;fC?a|+AbPTK z07)i}G%$huU5eA=JJnO??1Iy8@XFzFs7 zw?Cm6rAlu^L{gm5F)`NT%iqmkSNBtoL^KCA@1%xo%C7w|KB+DQ7>cvHkS>l`2TH)b zmpY9Zjg=?VLDV;Tfd{Igqw^tFfaO{^P`zNt?Pn79qWmw5kt~8bot*2R+4C%84&HvJ zM$n-)i!Q|i83)&Euf#s0QhF-s(DLrE#@=53PoVSd4TtJ&I|jexp6n$o9~r!WWlXc{ zX9H{|C3s(xO)?7D_@ngk@y^~gHb-sYTvbiS?5 z8AXoiDgvzwDJhdrv^V`rZmnoz|EAx{{tia|U#ex?UR&}NMY1lzFUsT{2@{yV<7lLx zZVRt^A=^FxMIaPWU(Q>S3a}_!t=5@!zyovcv|F=)}-jZd6R-%^+zu5rLQg z|Az!a3htF(`-+6(WDgNbhQ#z!wU4!u6F~U1RvG_=Ld>4okP#OAm^m_cx4gi1ET_c> z6b-e}e}TXjrUGvA07Irs?D0(BkIsq8GzK-1kYzFdLskHLq)C4r8k3 zHRL>=k_-ZOJK1B>+))M#V|f~BAb8B}`6G2;$sNpM0oN} zH0&@mwz@IM(8YRTezrvJdbhUJYVn{u9C?AZn}+m*C(ZVY_cs*~>ZgW%6?b4HoVaCT z9O@x5G2FNrPU-9ArIZLB*+q~;EEG?9UUMk zC>x(wQy9g4fFrPYf(#JIC_3^JP!>)SWvJPwsbDMI z0GW=@1B~!xjf+pio`6K@Zcx52-V2NFyqsLtDMur?{abrN%95VG3g?Z@wAM;%8cNGN zVVMPzmpYC_O8ilE4Ysz1EJ69MBf{Xsjn;8*4kTnm*p^+?MpuuR4f5sd?RIS<9D@c$ z8w&OX;b`2I85Brmc8}b6Q|ne^G!9)wNgO5w_wXO`;WU@V5pql2dJ^r{5fgQ}GT>++ z!!7|gH>Yd96HJ@}k&~@9= zB@95eQ@CaLe*@NH`~>=p{gS}l;x{JsenRxIp(-FOht?89UQwB1rY1_DVg+L*a8DK9X%r$^Bbi4aLg z_?$}874ao=eMqpVAs#ccn1GTSZR@+#B1Y3n2B8$lRTMcemt1MV{hk{ecM6*Ub+z<& z&1IE_=8lvbY4iE&tsE(pxJYk9(V14V`?5V4$;}8dp1Gl?Titdin8=Wvll#JSLh5dC zFj5nP2QwR*6Zz5<%*MCn{FzYDs5*s$%ZY`zOC0L2>;CKO!VV7+7D_2mLOi?E?+zxI1ih4bFX#V*0 zl*g`?O~=U{1rH%s9>7)bUG%{MBpiDd}CDG{EmKHjUpjH;cH8=tIsvc=dPz;u7fN+>zFAK$ zG)^}zCH2GAs}O+CDhjQI`zFr3Dq9@fj8(k87I;Mv`%7({%u>ftBWHIv{fbBI zY^HelfW&^$BX+oSDG7G|y7(}CRWf&>|5n}O7Mfpce8BmASUsSNCeAgq9WEu{bVrAb zrfcu0>*0`kRa2);3xrtFE=8zsol^_pAn-7>#yrNXg2K7dxQsR+8k$9$R~I_5e`$|2 zq#+BE{?g_YUsCOXwQsmr_q@m}ZEWCt=`JA`A?5`7)?uT~(*tYAiL#f9#xlWw8`i?R zy>MpkxF9ccMnVP?4ZLtga4bmYA^cTWpDY^7ck%Bq5K2?lI1tq|W(>pRI9F=bVTW6f z#c=L~99ro%-mUmNA1hsLHOs7+fYFwW1Inz85)$#}(aqkG5jWh%AByjE_%WK{?0mxaV>`2i2Q+56j-oMO z#}aYk3NIw=11LCK2~!@MpFebl_5E%R1Ye}6PF#dS2uICz274f}$$7>l*H#5{;gQ!p zO2$R}hZ+2DN>3K;#mXF}nW|JdK6dM|$w?M9t~Kfx5TgB7^^)}W#t{`=ySA}VDu4J)Fq7hj1G7v zWLb}=pn;QLP0*s(qOh1RzA3YVYmdha8{CI6kbgbqZlBCk0J#WAX2^Jve&8g;j6E+pxl86s7uF%46*$2b86UkefGVH5GqA$9q1pC^*QHZiHeD*Jpex9<_kwj3}MR!-$o;hClbCJd< z)pN{l4jfmv8el(1Zfj9SHx-fJ>dvQLJlEhhxg!h1upT2|I0}Xxw|bldvXGfBV?;$# z1YTHqJ%0_*m)T4qth=7e-CKJV%IS3E;!erigBv5+P%;=!zLW1+%O4op5p1Y-u3+7I zr(iV=ht5>mL$_6q_+a~C^#ImjUV^Dw$L*CCq(D@CESPS=b1+dh-OC*Gz&ri5MG>Sd z5VcF>dDhv@ImI@J=!H_ZiS>C;fn(mbt2zy>E83>5ZxbPj$5fDB0@ra%vC-vFFLHFt z*2965g##j@jBIq)O7OIz;E^#0(}&)bzRNkPS0bnE4dOkMV;h1g=4V>S2ka07D0d(( zLEb}mi~?nOe6)U51hy?yPdi#hL86?LP%mWEerTUJ@k+EWK@oh2<~F)n!ml&V5$?kd z#al8?`qYKaCAD&6MFK+OBu%*Vfn*7mzs>8W(`-yTPqPE+Zjd%UM)EB8Ftr4x+=Z!g zU*IJGah4v$12E1_p966V_8TW%ihTbTp%jdeH#(Wbv`4y3%knY~@!UrO!V{uC!pwVH zfF>(rH9M%US-oPIf!>LM`q1Z!Ra)O?6M!K{(d4$&`+1zxGb|J&FB6SWqg&!%0xB*- zh(sQ%9VeA3lf-ePN)zY_rC zj*K=ARH4swPpOrinQr`pKAy*bI}B40{Mi*&d`eMb&6lgNKqih@|$ovl;$ z0{Q3U&=tSuz07p60X3vlhYM*-9Zl&ST4{EepJcH015?|)PQ4P132brK(^5GX&SdQk zGAlQQUy5W|G+ERwO(*-0>OP(S2GJ;PhcRUULHX2?Cu9H}NwrcqNF3AN>DFZpDMYUCO!ph= zquXq{lsp)w-4=6q9pi34D3-A2uhg20k7)&%VyKz@3f3DC9vnV#pWmxR{BT~-TZ^T% zhDflT-oSi6%kTqt5~J44EQvUw>nbuIv7gjHBR_|y?)WZ`LIbr(xB6Q(RcY7~!jzJk zJf~RnXh8Mk%wkaYr-%dK`n~f_dy;wnK8?ELHP=teU?5pYTv7K60 zp|A$=T&Um*Pq{|C8|)smlS&4gV|jBzU)c$V-6MV7{v1Rc_05}vWeF0lqf!?J0OSB( zrc#YtY6E`8eGzY{dmVl6guo59_J}pCLHg#`&M!2A>q8U&Hi=1a&Hy%}D~I&88yD4T zeauvu$ZY0%0NHiutcIN(!)$rC`a3u4#LX3AXdfcLEv>`K25)YwgCKs;>m+W@5HVSp zk(2+lP*2Lx+WKxO?}v$o%)m`J-Dn_0xEg-o@>u%kw#`jpVmt?op4ukm@_f|G($+1C zM1~UBU774oAnZupZZ5e9GLZZUo2y;z+DkM7u|v%kL~#pMui#BInezN^ zsI#F=^%YN(GpWy9%bB&Ws>6^EuvW)H>z>TC=-_0`re^RL0XOb6xv#0?*~yJak@crT z-Xl|va1<;b?HGMTTBh3eSm(#gf5XC@ro)|&wra{ZLv;!jm{I(7T$H&7hO((C$4vRr zX6w<^f?{rTns;%Y>|l(k(U>qj;{yioC1h?;K80fk4@_$c;r;DJ;koJ!m;)lC^>#_p zRyY*|0U)fc65FPSJrW6yq&By-IPer*|5k>6>IwQ*lB@oZNM8JPbyg}w&lzb1r;ns{ za5mGTeg(j{g7uZdpoCF_ZdIp+HsTxy0A^s8I&*7M(taVKfhfPg)NX>xHfTK`?Hj8j z{>wTNNQ05Sm@|`|230J1Ot<$cG#Di$?F3RUj3bun;c&Pu-}Zt=ha=Fq2~VZ_ZMB>` zpw;Hg(GB4W%pDI1uBR{!R1VOf-@~oOiZL!tz!4x2aA6d1gtGuQ@51Wj7vCDy^m1Ie zWYPSx&8d5j5YPptA1>$*7rf!3^5JfD?<@Ox=4ri(&0EyT z=nw|ZddeOEGM=tzacW;uRN=eCI}p9EDG-LOvG~b$&MA+HJfth-ZC;UT8JoUUlcX`7RVPVcSj) zqQP<6YSpH2EPCxwna5?WTd&*da_nO02H5&Ds~b=!D)Q+Tjng*H()>jk$H#s?-R7J7 zy3Go`73uijCK)7vZ8>?Y5u$>UiN^IMaA?fu#q}`iMMKsNx4taU0@+Cl0rD;^BYP*^ zi-XEAk%!fWUO>uoFPJ=m`1iW5of$yN&`UzQ?!W4U&tSPol(fPM-KJ1*Yl5UjS_94V z`7T5gIc0awF+IlM{NQcn;BpOg=Okle7NTPM;+ovizDr#-OEomG*m+pIEFE$I{lPT| zqEOKbb4z=3ZQl6X#}tajl`5w&q|{vDqP4EV{w)^U86C|dzQc-QxR(PBRFd zf1#L5Ip2UM0A2LlYd4gt-S(-t)k3>wNgz7UwOb5Q2c~EjzE0<_=ffaF>Tg&uTfD=* zN+Cua zfERc27K+7|1}%rjzy8zeoDLoG)aRGMl)bLC!Rbb@0)34oJc~~zQosSMr0dmN$f>Mo zHfteP67rGa-hqXus6i# zc$sGu-y2Z4@BjsUk{&6w9)A%9Ud(ooPjuBx|{&U?2ckE zZPS>C0TH)yXqG%`2$7Koa0GnfN2=|4ppRA(M4QA%c&1gQ29S9N{2j%OpS)%I*83*Q zlh5`b=j*?tPFCA!K2fs707PqPkDQcv1E=?WMYm;5fwkaDIN}(LEcMpM7=grB{KCLqIlKENJM?9_DXjmpI$UiZO|F99 zs^W7$b1*3b@rfPF7k6E3;e>3{Om>^Tpn&ebw~N*%A~fe`a9_Eiycn(Z_7rW-pOe;n zvxJIHawSKj^}4|}`cAXcH}%+r0eAYt>h5aWZSz#ST&)hZ$6ry0s%_(?q4UF8$#$bd z*G1}3L5<@m!|W64ShdZS3M+%_2B!zVu45*|(dVjd^DMKU7OP4iX-y;k2Ad~5WIo+# z(k)d47(NoAS@0Cm28;~}5V7#3?SC85(3M^AkbMN3M#^`PW4&agd89A)iVtQD0R52j zt}Wol161ExQ18x}i(O>ouH?M352?MFfg9GBCmM5yo>VgL9VUr3lA`~J+`xd_+nYD2 zcjU|w=9;zeIj>mTa*p)zObbFVp4Rp1r*oziBwp_R#2~wuDWT)ZeXDwB&g7`6ePcIG zsYi0=!rG0WMdlzvs+Q*8q+MbSunYAR*}q-4*j`LFiI=hRHKZ6VbuHI3BP z{@>Vz9ZfKhub-q65Xsl!X`QRK&)znlpqoL7Z7LuNk0%#OWz;}n%cE2y=%rvR!x3Xu zra%$9Q_YHJ22`gl4;6|EXN2duB;fVNo@!st=9kpNi0XlL*iE8Me;_Krh)v#)A3ZfH zLwo;Xw^m&MT{POcuyDL_VSlcDmQG_GRkwMY4j=(sCb4V9&0rR$!)|rdEF3FHfi$Ta zwi$(q5cW!cSzmx@DLqA@&kY#9s-87PA^7 z2l`6R`km@*wS8_GjToGAIxK%55DoeVJy8MbZ_AOV*3C0w_usxA?Cj&S@pW~ibfr}7 zkU<1ke=_b@nW=8=8&x!tJ$76BlsXN;3XIy}Y62e&bXdM)Y#VME4$nmhM)9d-IW7>k z>;JW)<=1UW8(N_b!|A0~pATfLPu6JjlhOjzT4?JZq1~4|)%XSQY3(${A5xH!(>36D zWqx7rZY_B2)eGk9#fiMu-BPVHeQZ9UpyQ^#@1eu{!Gp7wH)1`Y_wN5(8b^h_OKxN426eribHtaU5b$u6>qwm(kxNzVokw2rFUF1yc) z@@V~YcZ}{%W9<)Vtwm3NoFS2S#`I%pS!#I^X%RRBd8NUS{5RJ)`uy(lo_+@A5IPB1 zkSGmmqyCNsH*Wj4c%Qw9u`Vuv$>qkQgVpY^dylCl=IPnX49iW@lMvhiu#f}5duqa8 zkwTUwY!$|<6F4Sxi>*xr|`&RO;XC~Vh$XIERwW2z?JP5edz|%cw$y%VLz(^WtQ!Wc(_W67)?Tfb~6a;Qfk zhlPU6>>?VvYiTp&uEJUoQnvO7Ihew0NOCwNzUPosBN94pmuMvnXEhS5W2N4+GY)bl zW^QG}NV9`7gZOT>GQ)x)Xshkd&)mWIo>*^?!81pK2Sr10rYDmtLs8n}X}+KYBUENL z4qA9BF)OV_O`($d70tkqskTWVWrH;M4pmK0$6_ILe~KHgr@z$qFW~M8UbJ_$jzS^3 zhf*7yyi!GpQ@LOx6T}{h=<-Cj)&-9pyayI28yuo%+k;coEE_ZH ze^hrCFjt>Hf3c@g3^?+<{;BpvjZ+Hboj*v|j)|;x%A=S<1#x z1~Kaf0)sh!et~*j(RYH-`Uw;QZvz-Ifh*3h=>#5khqnKgcL+`neYp`Dpx8|VhMCHg zR@h!H)h@%*4#m&r%c*Az#9|HrCzNL4Bw>kxgK<7m8BiS5!K$6A7x>L1^>IzzUv0Cg z35vZ`m#Rs{KyG2UV~F$Gog$`zV}$;CPr0qw`jC2+IXg>&5hA>1R<{__D2PB!)tYr@ zGsr=j6hl@F_gqfFKJCCAf5hmW)>nL8;Z(JmNQ!S{e%M{la70s`p;WEbraM<>mW;h6 zyTCu1ss*}b4=X4Zy~YBr4B2Drvl1ArBVu~#+|=BNr0}XAOaOvgJ%8djx6rB`gHH-h z^yx-(bUN^AWDXVALn_`giml$JK|UU`1X$u2?(zdsdHFawYbC zV{Gevbng(t0?A+m3ZOmSyI^Z2pAk4hz=oD_P~uC=8E}waXmjgds+VCSbSHH=7kF-g zO$v#m&VK4JK~$s5XTe#DJGq(obM%67*Lb6=>a7Ges9RMQARzW z5RA7g9ca{WJH^!-{;B6`4=8%iy6xpaaQ4F<5qE)%iIb&axFN`}q`0%e`TpGD6r%W! zM;bfk<7v45hZC9(!Ii+@y;;2iS6`g4Q0c8LH1KUgFo3sdwq6r(f{nD(vFSg`edap( z=Eml88GuY(k@nq;FS}J5po5r9fbe11zMc=me7B9x^F|XHffORFKsn?ZEyGQ0T%_g1TyZS$}o1=+Vm8v_w4FGExHc%O9=C| zTGwy2sdBlCd%2X3i#1lutGhTBxZ_CqUR4zShu zP$0cdQ`tXKn*gWN!Y4D+j zJ)117$T4SyUzpP#y>)XzAY_ED$!?lkKgWP7-*|c883UhcwMw?(Tt873LR`anZf@{& z+l$~Gx~a6z(07j~9{uS=sdXv)sMtt|Z)R-# zCsNderkh=+MjT2plLxD%3w2nh)iTnlf{A+e7Ut+vT;C)x!%(EfAP?P%M!gEP8kcKy z@-WbuMC2T)&LI+c%Pb!ekr-{{<|B021eXTt$s(^~Ul%aAGA9WX@x8^w!Gn%e$oH{i z;TC!tYuq#2@#MxYQ(XtV78a<%vAVK5v3IZ6a^FGk{WQ_%mdxR92U*4B_ML8Zv~_Dg zNqzcY1Ccf`-Y8@c-9cgiEIkvg!)*EGbYshHCvxqOSAvx=n8w zbHt*=aje0KJm&TJfDh5j^|lZI=pna7$u&-*o6-S-nptRTOcL@SOaQ`krz!Zdb)kd=_i1}U-HTnBIW^BV3aQ&3usv645Q_G|&Yr&# z1)$jqbcrE|`WiY)t{P{i7&;@PQUf%>2bdZLTWPV;tyip;Xv|1kQML!@m(aNe{Fi|3 zVT&PlohrPx!X2Ke?*?I<%v61KwuRitdH^D65xB}UkQf?o`CuXq4FwP0$9ZnX#ok7P zgbK}|l8*aLH%1^EfK~y|9tpJi5o&^D{#6fYIyzC_1TQ&fdbwMNwKk$9^s)TFZ1`FP z@q2kjG8gqT4nByt-fF)?PK#cvg)UsD`W=z=BdP5k;g~PcAfwOd#ig-Kd2` z7soMSPfy7-1BqsWcichR^cJAbPT#Wa4Gf;bR5QPm&Wy*A?!l)WuI;I*dC}&Iw4_#^ zMtGR4Cw_{`6gHw;zC>EaO^{Tyb~O3y$l>Hx?0^$~RBH1Dbhf}Lj!K*jRM{s%joZ+! zUA=)8dT%&h?7x0F2d-Fh^g|NNo zpf>(e{jf1v!6*bGN5IzsmICY{F5CQaw^M0csUJl) zoosil)P~=Sw+=dviTq?l0(Jg)Z56usj76Bq)<%v3{E@v<%5{c9kVp6h8V~Yr$aW7$ z0(yd!|ENHNV-%I7;M`)b671e!^(h@cZGH>21PCgiw6LxK=wXdw{h}8IYSRZjz;4_H+E&&NE zTyw_(Yz8JwB_{NbdM;e4^AI|&*S}1+8WlH^flh#e7zjJZU5b1nIax6uwUKReABLv` z7G{QKd%1K;s$;P5*Jv{Xb}^Tt_M%{>cMP@UcQ9p_!F;pik;y^m&eV1Am<#4rVG3RR zdiy7_b6%RLkxrl-pt3IPqBVm9Ha|AxX24arsL(2Dv;Y62e0hI2n3dBiZKjx>%XEYlfp8%>7v6LluHbZ?0o?Ky;7 zwcuE@B%rGi(-yd865C9(H<1jXlyi)b z&rh#bZNv#(VL&jIF^f{68M!-+*!0g@SAB}$k%kTn12z^f?kgKB4Xzv0FY5&DFf&I6c+9?&8F68CFC1fmT)Z$edZ5V}gMpeX7>IaG|tVtyMd#Bsjh?z?Vj_ zdGSnlSe_rBSX1-ODCx=xk~~iO8jml9F}QSR$fZb6cVzN#3~%Nu=@M^-rvgpF++Cx# z+9icHgA)V3I)ehLu)ckd-(Ww+Mw~Pr4_we5S0Ss@`)9EJ zT=hU`C*X!8E!K^Pz0d=@m9jG1&T&)8>}iL5O{^+evbi5dT<$ zhTzWAvG$*7>dfdxj!Fsp#;0U#GsCGCSaLm|@O&ouZxpVMlX2Sf#m5^CT%=H-9AD|u z(NcSvk~3sJe-q0DFbhUHw)56MO4$4<_L%T(;Ik+_L4e+X=EgEB3z&A0xEypNxJqv*IrL-9yA3ToDohk$}x#YGj{J|-ZT4WoF<=W ztNwd0x6!yXzz6i1*cr~YC+WXd@F1m-n{g6`oXuVzt2?<=!~y2|n{;LPFZ7HABs;4k z2IW4&tCNE(JPiNK@}R)NpQ0{fL&h3dI3%4{<398HGTtt+3e$L5QU`rbDvU1$5w(en zrFOGgj`(zYia=M2O~+d%{WQ1wW}tsK#=4R$0xBd3R>~zml#cS5c+%rEV4HU|{1|Mr zisht?R;VnqnH&HhJo}A&Cnf;UT1t7@4?dD9T{)q%T z1}Y_J1zL8((PO1(Wc2&8opqL-9QEA*#Msp@>_>IDMNQ9_|LdPY*DJutS`FONwv>*R z0?Adz%IsfU94L4Az`taC4)iW~8JGWDD|Ldk$_9rFL+^ZC@fKmDMS@YO?|-AC(>ewD z3Zo8dL<3NG{y@tLL1RE>Q>XlW&$Av+(Pc%d62(TQ{_>c}n#lq_LXA6s`i(GI7*_u4 zWx%MA{5Fa$uImYE?y-1!KZ8qw!kPB+WQGV?uIRmkE`-8c;gi4lGitwgeT-Am_lWOY zLF}`27q!?riqztsR#cAV_~(>Vxjr3E4%9+B)QN7RZUngR zeMC-+pI~HP#6{9M$wpOOM6Gcby)8>!s`1l5qWcDDNld`j_3hg~BcKE>uBY z^NsX-`-ILmSlSA$Epr`+eI?fX61|A$+qMu4EIn_f6uGuCir)DAfo!;C$<>GOxqIuq zs%ok?i_Tf^oL+4v^LWgb@apfza8OL9fEJrZ9_yuJ@Z9dwFf^&)UfGQm6ovzaKN4S) z#F0FxCvQOF^WDXRjTL0m$%8%oAkn#-9YXvfpU}O6>4d z;9C5y%kaeD%um^KcrqxgV}9&~UzkpoNymyFV8`#} zqAD3T(q|FWJR+>X`hSWbwlKg@6ggJ1H=h*kEG>I95-IATL0PAfsI9>0gyBgj=}`jh zj&_%pRuCe~^xX5qc*Z)dqZ4APRqvn4quAp>V zlA|cObJ9NFiI)CmBo{WHPm1@piR{n_rSVWa*=Tp+czMnE=6JG^z}#$#V|5I3gwQyN zR&l!Y+ZgCUX{W|IruBjvi^z?S+7XjZJcgA*|Hq@aSOw}w!og!8$*7X_v>4NZ2@qU{ z&M_u(=b@zw?;XG`N5|X*Q4s)o$3z{k16st6i5M7%I`H_Y2_kGff(8y8eaim(HM003 zgiv^g3ZQiqkAWvqAu|7gJQL(Y5Aix;##zdU?P{2c`Dh5bh?bZiXZ(yB;w2WH_Tx;d z7{%g0Qj-K)I2ZQD6*>`IAf5kZB6-8ll@$e~X0=}fa&Ub#KR7a^G2W&raS*Qz^0JZM zB7I{_Tw^tZG4%ZqHh!GrdG_9QFRMphbyzeScDD9a#tpOEVO)1+lkMifwzn<|n}6lo zM%$kxtUSG8!xH)98iG5MFM?`w`owVx0pkca^or4)(12K2Wn!67QoSQrUFz{N?&tz9 zYB(*6(`#!K*+TYfCK=h=PUG4yYQ&46&w~DnnRvM8TXia_u~r_=s{b9Q$IdSyf+5AB zzLTRZ4{-D-<3((ci5#nvF=<4e13ZihN|9Xf*)VOMGy#`jr0A`mr{^@bLq{bE_$RC+ zjk2)VhLPuq_(3#Jb1p#K488ni`UDx4K>WbEFRNpVA^<-@+6Nkq4tAr|9Cz#k@*yZE zNgNh=1N})uFtN`M4tMn(o-kkkFnxU@Ax}Z$H()gSyhloO{Sk3WSffA9VBR!p)ffZ? z*Rjycce9%9pqO2wt6`v~0)>Hm(L;^y>j78#%pO*ufE=kc>KD*BYDsp~FR(k}9O3ax zU!@Ug;f3=%g^oxK>Ze1>j7Umkjzw2m)^m?ThMA*-h=dOMK4PKFbuhZY7zpAm&%R&g z(hV}tAU6gRg;|Qi^$i|< zTVTfJB23qih+xsqSP~WJ2ZEO zHS?)|LcJQ)(|sc8QA*?FkMc2f4x@<1jJ=mFk!UeZo&oaNbBV9LL*0|NLFv}S&=8B} zq-4w`i44Ls9?5jOeP>|r4KF;-CuJ+b4cBMcKk>rTd@|=WJqWnwdt*|>8Qs2+*0}$| z{aJfj!Ce(`%}C(w{A2h?&Mj~O8L0>sTzDRTukPhOX_imV zynjGo?u6I>T%88lnY!K!xlSTsd=A>dS6w*eE9xw0=U&y3Z|d7rlDE+YL+$pN;N{E< z?F+PtZu3G5HD`JWwhyUJ4gSRPY8m}^+1P*{3}m=LLBlh}N>i|sOy#>GM}~kY^XnG5 z`guY-@{|6as%6Ipm~((Ef1vjkbZ^%M`y?;)8guiP)Q@Jzgv+aUgNJdi{EOK2#)Ss@ zjnZG_*9kL+S~Or_b;EU(w|-|-s0i=PlKWI(&?K9-qv+c89B1<2(1P zqP@3}mch4w^H=h&U4T|8IPVe0d{Uu5M=WMo#sLMfc9busmc!sn-C9)j?6A6$C3aeJ z#)?jMgvI`jdSlM0SDS#AClzPC%%PPCtOvLJXYayMedBX=@+(WL(I{2`Bi?;Bhs15QfgrBl`!f3@CK5dXs``($;lT zi=MIAHkEO>%B;)2R;phxfj|+luGq)gN%b_2wwuf@ajf%)TSyt7ZAz1$zqjdv(A$Se%LTm-p%0pm_SfPWk$;ReigZbP{h zr*?ty<$UFVw{GKU#%?0V`>>QGEi~?h;1D!4LHmp3=Q`cqqXStn`4AgB@)&3nYc#(I ze{0}HBM%^iAOO~PGf zfyIJ*VTE$ojCbq(3dp_LOB5-P?iW^IIi;C`)1_K%5n6Oa({~;822{MBO@t#vy_Cg( zkU;!HDj-=1$+Kd#mECTu!Gvi2&3{YBZ|~xX16Z(&=$4n1>hK%B&4%eQN3pf7>uN}9 zn5CCBJc{w_CuVPaNC7J-;2chJjAUO2oBc$oERW0x)pfnc+2bF$xH6e}dP@e_YIg7;-({tpZ0!aMmAWD8fC3V7x@!ErDYx~!E z6SI=K$77QvYM+^q@_X6bI7@k_ccy>xJ0V!JPfY)`p$~asH~7A7hh28&>>*OMHx?ed zR3?2$EwSDomGCrY6Z^|rzeR>06nD0D&$l-5oX{smbsq|o6k>M`Og8Uej`d8#)8eGU zFa)-wRDCSeysdlPpYX!vG@tR-$@re(o21pL&x7LZE94R|M@@5lMaQK${2g`#dj%C>fmB(Ho;yIyk z7>ckjuCSfZ+BshjlQ<5lz`Ul%e!PlD)NvA-hU0p zRMNurglki(4p==1d3@U237lSmzs-6%@6UDh=ua0kk-hS-iXpz=|AF3$1){$f7Q0J= zDV0EV@Ga~1S@6h0KV)SQK5bV3Glpljy$>MZ<$e5)`Ec@kZDPSznYjRz<~A=TuOe4Q z!sEUK7jpa8*p0wXDUhc@XWeMqEvq=>5P=X+8D>;P?*?D+eo!q#vG<}pyFgOXb69cDQeN&_mH1cOS%Yrdl@BI z{1UQ^jL08x{sF|O{|l(+;vTZ~=g@S3sVsI9+hVYc&!Kt;RqEn`UjDU4j$Edg?7d<< z_=Cw3rs-bLVO)0DbFZ?)<1yB`e9$#dbnf?Daf>MvP`_X0icusTb%{gW--D0E*JcYqFM z$cT3PN&^M0VIj%_?XM=>ueP@lbY#5zB;dxbd@2+daby_55oz`*Pn%}TDLN2 z0@`*M;E{PTtIfyTKd*$3RD23zI3(HyK*Hg;#4r}9oS9dP4Je~(B(0N7heKi|( z1mufEo(@64<|9lg*oWczO6N@vEv8R`I$Plei$2n7Ap1SKvu=ZVl8lp3OyyDC{5hdY z`7>Usufkl-Me^^~Ja)8Nj+Nt~?$#UC62>qDVHq_Wc%XM}tTNXFWhiMm9=8HX|G6#P zQ6Mm~!l>v#)^Ansc0&OQo%R(;hl#9PfA`{na>Gqz1g%Bbdv#Y0WS%SS(v^>Lo!I)hqm!4^O5BG7+OkuZHNc#hPX$&pnGb@5t7#SHIv!%zHfa zXpsQu@qXy>c1;vuzQir(uvn48*u{w&+(+I9Y`#k!2f>sBQr;S#;t79>R@W4s7+UN4 zfM{LmG{;4ii|5SbUD0coL55vCkRblz$3pQW)OIuiU^_jr6Nha=n>w^Vrj82DGb<%H zf$97*U>=9R3NM%y0SH_f(2oRw4UlM3%?PzwvC79l?ne+!Cj^(Iw4n_dz^HWmYWQI< zBcAk}HvW6{lW=WDqJ#AKr!(RK-`NQp$r6kJtFAwVRph`#G(Lq1Y}_AEcXuw##X8=!RpNSOSO; zcsM&O(-21j{kM)W#ar&<)}}OY%=*f$J*qk&uhsMurK?jH5*a`{EO5wq08^iO$QA{# z!m?B#GUVOZ>r3i>jGd0^ZCRctHeRI1LiR*f^a|V%TYs%)^$@37e`CJ-kStHyN=YU= zK{K&8JC#p&=yQfll3zNq8*fqPc_^&OH@%EXbf|d6ZR4c?JkvD_>&-%PCIJaIz}A=4 zH69C(cZuD%6C_(wF3I7{OT`&|INnz>EAh`sxFBo(G6m(s`K|Bm~0Cz>3oDC?tcJsWf`@9nqU zCR>OOD1a2T5H;waG4p>Hp=tedLjWX<YM+-ouDccty9y3~UW$MjS_+On z){iU%FCiNs2!f zqH*FUD#)Ojg*!jP1p=NX(#?Ej=fVtrP1ydhD_O0=G$ z(+@^=HQ9`$7W0 zuOr|+D5z`8y#NlP!5jWNnMr^5cQ6Nb^#KJNyq^bnH(uQjDCl}o!1felR25pi&S^Z> z2T<3H1? z^4Rl-ymrmE5(|b583EMyn+J+-Hb@_@F1Fa%E#zWzEy)Vtg17oGh96KT0t<_;BrWF} zTx%wDX|XCIsOdR#s9lZA%b0E3|C&TSvvo{FahHf0zmSM~{#2u7iWRRQdOXuKj)S-# zpWDbKKk;kP!qc}NS8v8#Nz4@AjHnf$axArcIH>s)iMBp9q+K;yc#n|nXP$!n)Me6M z<6DpKd16U@V-FZEQjsIXOpDkUb4gaQ!`LJgZLexc z9@lYHjbE7o&%o0YGtAcW)In^Kzt0C(5rC|gz3q;XLPclx-%9LwS~oD&?rt%qaCif@ z+}6kUcA*CwC#5ytSQ42x0=>i4R=YD_YXplPk{)B*5WBUcqCG*ND$#=>$sGeZELXB( z-OlA%ZN2WHyFw31`~mb(xByO`);K6KoRd-%ZGv|**Rl8BV~)R3tzT|j zk`@u3@6Vy05IBhpE_Yu|@r3ZMI%PnT6XUAM?o(SV+4GiLx(lSckUN*XbZsZ05a0T` zJvhB5W7*|d?6MYwcs>xgVKsfJ?Ktq!;jz)z^C1x(=_4^PrSD5A8NLcQ9}}(X=En0$ zr-LU%`cr1mS_LxuJ!%e1&N@QCt)miVl`efW`qmrOb5yc->5CBTfkcERpMFd42ak9t zeI{>IFXF28Tc>vouE4wm8&O?N$0GgPRka_#g{t0_N85B(p{r%`IlaesBIl>n;R-B0 zWc6U1AsBTcN))Q|ZRBN0H!l+f+Bw&vqX_Fiq_`!=llleS&vLjK9n#yHBVSVYR9~X% zVf9XIl%UuTHn2EGA+dqpz1Dw(iVn!??Yk&sLY?^^)qPap+4K``C7rkDex8^GJqAtE-p;fQFwzjj+D zj`!3LU#!cO(}-dpBW&L&QK+=S0#63_VII(C`2CA`qYY;{+q36K7NSMmpx_F1=YG1x z>dA>ztB=V07tV{Ub&xaG&p_+%7XLU3!I!!<7zI)hAL}vakAF!xFY?6>$7xRqnz2a3 z82G{xXqgfVl#79B5f{nw?=5{s$CJy6_^{;J>yMfOt@<^&ozkDYqc=kTw@$R~Azl~DNo}Ic?42bDV+8sS1Oe9dAvB-GKNbJDZS6?z*tCmBxa;ZZe%2d7}g$;4%y4j($CK@vg*zterCrjN{^ z%~-Y7sIv~r2l7*#w{G?@&2pUo-&+CGveJ^P zG-$*aGf%_K`Ap$hE|oKxLekrNb@zvQwT+5f!x3I|uh?D%&xU&)2A`r&2?ZwnV*3LU zQ{JP6HKLQ7wrg})O! z!QM#Zsm#i4AvHW42K@SU^?)4^I+*B~*sx)SA__@{vUL1G&>%O^#E#pVmKZ6o#)lDn z`j)uu*={S8=*o00Fl{av@DTB&^^@=h`Zf;Vb$}S_c-x}^)@tf;?HvS7GDbRSfI+9i`r3j8QOOt%Z zQZIhZh)h51X!V}(A-hjNDjC%qngRmA2OC%FLLAD@N7MxfItq|yXt+fT2Q#?o4|m99 zAZB0y*@fXc(Lbv})x8$>3+iqUTCEKu0nHHU&?^pQ3*MU>^jiv;1&2YW33U7Ifi531 zq8A*A2z^rB+e);3AjdmHXHudY&W=QuX$I_rJI&kx@{7n9gsTRs<%o^d4PiFFU46{p z_Fim|g<`;D4FKQuny30NGj_p3peXMG@L<+9&|l!if?@xTdJ$-Kyfjij~UUi%Zcf2nB5Mm&1L*v(wXkA7lbO6 zmFPM;kUz%Wsd~Ku2?{wSXDZ=O3&Rva(@K_VFy$6xvim1tPdxO{KB#c48enb;zlToL z@;#&>pi~gbl>WXtf@hQsui;r|xh}xVkLEMI^i_O9n zX$~%3Y+^kKN0=-B1vS0YO7xRITn7bYG6IuJHnzFx_ zw47wXh8JcU@4&5KZ6p(@0Pxv0RPOI7F?2qz_S@+UH<91LMC`^6Q3cUV<8A6cfOo0< zP1UL;L53I=VOk0RPK!sftKWAK`B~>hwCh%1uq6a@8BwC?5_F$WI(PZvOjFZ#J+zMn zqkSxxf`kitUOM=WV<@%vnNKFsCep0x0hQFSB(N$}6Uo1zB-f4&L~!eEbjqW?Qp`P` zZx>o(tOVF}b@&M0pdQQ)WuFVlg&M;kD{95e7{b8fP|}O|#rNgP0c?EszOz&qBp@PD zzK&&#TdGgrV|Q`m?^OcBoT=N`y?KB(=!eNyLL(NyeuX8Vqt7P-YRoEFd#g%_K7&gf z#<`K;lBRT8nlKi_=-N!s=r*Ip8u4mVsU#}wN@s6EQCm)~o^Bk#O(wu?a`N6Ta9i3YAKwaC&kSQ|nl@_^|*9a~XX z&GzfBS5s{byC<+lQ~`5kZ;B%dfx0m>!%UYHI<|35eXPkQ**fcJZmE37?YG@Yn)(l! z=Q^`3^6OT3Ci+YIVsq~n^p|i%jZ4*JZ|WZ?^p?o4Xjrg&2Y=Mom^Wu@uC1&0RT?uW z?a1R3tS2Uo+o;Q?4D5BaTm;=%J9(XJHMm*!YbL_xUo2y)+KC)~op08Y3;xMdHH>fPGk3_rgs1bE6495HXn((PJQ+-PRy|11s9{Dnyq9-M7xw8L zx$@Y~+77hr^(AKrK>rtCrtO-lz_cQld$0eOg_~Zh{>iH@`R5XQ1J8_5kplM=<<>Mx%40QR&u_QwD2<_F%*? zlsY}xp{&1RpeDT!UgDu7f2LJypKcg)Aw7=uUsgZSY&5$yc$HyxxnoZS$ml;Xy|>)sB>ynERQqwMfg~yw6@k#1kwYooej=uv?fU9 zM)?Xd3yC@xlu0Hj7EC^&v~64pnA`qYbw#Fd;2SrAl}fVMl{>1jPsa}4gA$IJx(64# zwdw>qy`i|{1t@~)<{G2U`wL2KHm*=DragpmpKY{`+}H6;zIpW*QgcLSHMUQ$HesoN z7tFoDzxu={d4{JESi-D~wR?g3V>mOhhm6WB-+^q(!{2)pt(;#la^6~bdU|^uRnO0- zISlH9HkCG?QitFgs5UCqvhGL-)!~%?2amgQv{bz5DX(noRbRoKHlnM|N0sumj|j7W zT7`1VJHOyNvRP?I^}vbZc4$Q=vS8+B#6E#~`f*rpv^ys$B+FXxQC#eUdBp(WzAL6e zZz?hnj6T&$nzd3nnP0{2TM0cZX&P?MmTCLgCE<#Pz}T&`du|BR@A+E8$FgGmEDTpo z#w`MU$wNcNv&BPu$Y(&Yc<9H_<=RCrNbA<@%^NuMw)Y|y)!xo^y!V*(MD%-jmu^z6 z)CEI82X7=$$d4DHAMkB97Kr^XmLCk#V!~Q$Q&Lj^Qspdvx7Ut9y?3*$N>augmyEeb zaFXOZ)-w;58!Yo!rf#N&$5g+sUKtHEUuAr9ryzme$~=(=>E;cv@z2$Zn{4aAXszhR znJJr7(fO^J^wyWcQvo~u2sCVv=!N~sC2)iKk!H1-7%kpVA*T&Ajen|s7l9O4?v^tN z%(4Of1@c@%Wk)a*-R2~JZehMFl@LOPx2L%Pi@dh7aD-28we04xf3mHAMfXvjkt08w zh<_&4dYP#(RY7f*wwP{~DIrvB&5)=_zK(BbgNh57V0d~4|1eY#wfY;W0h~j15XS_f z2KnUIz6@6$TJpA7G|aJ+k*?+hB4gga@M5EBc@CRoX4VCH_#P)hG!0l>Q)k&;_7chh?t=8Cc2CPBOhdgTo8qOukQX`+9ZE?wn5k(|Db9 z+!2taH6OVCivdMxZmrghW(AU@&_QZYQS@n8eyB0orFmH=T_ysUOF5 zPSI;>8-JDB2r*D#l-QaP$}{}gJ(zh@1xGP(9YrAEy->rVQnIxAG zf9D|}JZSnwMWGcFnAE{Ru(u=O+Sj3}U2D<^BD&s7+J7|S$rak$^Ct|ZV@Y4rQXZd7-+i}N&m7I2+ z7}-aVAqRPt4QQYoR4ck-fi#yCpdnXlX2CZJ_o&frLBGRemyIh~$0TB6E%Qa2ksEk~ zVh_&dbJeRk1Nt8Pb?c&##p9sZ0&Y#<|8VaSY3=7g)WjV}qLBFijP6FY>V+zV=II7J zI#nIL)UXwKh#V?gK25k8V%tWy(+)+=Qm(INwmv*vdB%z%vJi~9_x#ZU_j|xPA5;ql z3On1v%1kY@)_@bw9MN;UjobRTlD3rk_}Os7Lb$*ou&l%{qD}3bXFkxvjG2--o9#Cc z*gsPTDs8#6sI@6RnkN~KEDutH=z!3ElQ;eKPb+{xodW|vPVLH&AP~J7I@QED3;JAv zcd4!F8uJ^9hOboHC?WxPBW2jQ+^Lzff_mkc91hV^k-Q>5jZbEMO)YYDs5c)qI5Wtd z9kk9~Nm$rPyaef*zKzvQP9xjca5n>dv`t}}R4W2R6%j0ot1SoM`+0iq*!KI_w~!Us zX6oD_Eet4%_Rm2x8DA`7bKj}FzF%{>m33Oi^}0EE(js5FZNHY>W_TG+OGs1j z92^&IafUJDbZCgbjb0w(-SVXmdd|(^!G?a?ZFXjs<~v=0fv|HY8VJ}U2d}~oE+y8Z zc;Z^F34nJ;y4?w7|I9aEz|K5VFfZE#8gnVM)8aU7V4VpORv&VlvvGsEqbgW|+4-Ko zo#D#Dk~Pm`FFX#6&17BFUPI61{Qg@M97T?4$xEUFW@8h+l0{CMXi`-~sdo_-kgS3>HKwS+vr!JJ0Y6s3Q z;&)^TGU|fL(!IBXEmzrMRkpOE2=xM zo?foD&!0HXgE$J;p?0_y$FGfl)^3lD!v%V*IWlcP8a;zzUnb%|dYezOJt2?dB`@On znE#4-z`tljfs`lEos%e^TTo08_us#2>z`rU$Ju%^yClNL8fyLWEmS(=NSwT7`hMC> z^ny6SwEkR$9;TkYgKgui2iJG*KOnJ7Uv@&_d7Q_B5&_h4tlmEO(d4n2Ik<)NkoRf^ zNGhIbl$u#kpmPrlT8hV&*3J;_98T#k;L*(ws0aPKHHMM$A7BjhD3}o4sCBfCMuxnF zi};fmcdcp@A_2?pv>I(#loV9+Vp3(qmCvdxU{w^BnZUmh6%36k36T)<95dM3S5yg+ z2LRc+wDa2%U=|POU@ocq58!P(JBf0!`x;A2@MG+&=}Hk$1GJAGT^J|ojVmarI(U2}Ci<@~Xz;nHV#DqtVOkvpUru zO5+*g4gr*8?P~HJu=bUGHuwa61&;uGL5i^T54M+k8Lk{JJncWpe62Y4-204}ivvJ~;b^#r#8`!fu136iV=fRZm} z09`tpLYH=dI_m|6#|Q&rAcp!s)sIrbcnU+Bf+OY{3?IvitNF1>yIg1pPdQH8BC zk^T=!gUu6svZX)`*oitA&^Jj<{uY$(ZEyy2$C`R0a#GO^U4e0c^zI*+zc3-)pX{R8g}qVl3n zu`nUQu)P6nsY&MP{hH^s36{z|=|$tlkT8=Q5PM+m*Keyg=gbD~6oEPJI3I%%7|&#Y zu47D@M=KF!5%mbQ9EKc%zax0r{d*pk0Ks)f63h~R0|>@HC{{f~NhscFOE9jSw-Yh) z3uygk)kY3tb!pZ4sae$bvVNbeW>_c$%Pth!`!TW(h#>rWqk1$NdI~Ddg*wKT6bY%w zSS)}C9NT*u3ube%A`S%#(nD9_yp#taH8=bADfl=;Jd>Cw`CoKLU-yUe;H8qy%2Py` zGSyUX4!9x+RQg$rQ^0_u$OO!6ol7z#nV*Ka=9}u{egb9VuPz`t(&V}#V?{@Fcz@0A z>`OnMe2%-wA5uR`oIAxKJL5u#^FMd+QSrqJZIxW-jv;DVx#F@Mgo72~;}t8o>L>hkOiXwAnZ<25Ft34ti?=8lmI?(7dMhvJaYG z;Guw-jX;X$&*3E;!k?qZt;65Sr%-R0yx+ihr+fpS4$H5ez9Nc|c-Q%LdPK4hK>$R6 z?GD3TV=0!Zr~%F2Q5O>%aN~W_Rq}`bi2T4xV8fjt9IXvStr&0rmU@KFPv&&c zOMI@Xi^>`VZ?BeO8YWnv663>6PP_*Mg)fWZrPK|A>uc{*?+~nKa=u-Y$e+RT+Lx>_ z1u=Tb79yaPZew~fPW%-6zb*?BD$b zyeD2jb_{6|o26o;VDaP0c=ng0jOq!?)yGU48ZI#?#?f( zOWjsY7xv(;AjS_BTwtBUqp}e(6%~7$&BLi-FP78C2LNoKiq9g!(tfz0fer8@5R2_Q2YD^M2SE!2hL^&zvpZI#3Faw*AuVj%CuvK1SS7I9aKbA0 z7A+#=Ru4=P$gPJU9b?FX|6mPPBY|6}ud|1Mpe)rtO+kA)mA9AYZ z%pdn`Tq^HzNYPqXrQNQJ#92cm(*>&|0sgsfpHRP%ojslmq}W!aDFEycCKlyDWZWix zgO_k}&z`a%S>Vpa(<49$7A_eBd?M8VD1lS@rdE1R;jH_DSg=<1bK{iR>B0Sg+g_mj zL{8`IuMw@gq<&r_EUbUYIEQyd^%1F=?$0vzXMvk!95k4MaGSX|!hOM|g`RW?;#8;X z16n6?G%glMyf?D?+#uNN_wEu&)Y+)YBbi%ygl-gMLDNGJC`F zyWnD--tm94+^7A>KurvIC?z0Hczz|9}1kAA+PA>!ZH;|)~gh6;-T*(=X%-44xFp zQ(I!ArCtG4-f9_Izl)lsVemeQwAJHKL>+uVqV`mCd^lB)owhb7nrLKM*oeT?2!#{D z)FWaw7RYlb3R-Zb-+|A-`;H*7{!V+kt;jsqZdS_#IRqL6C*32#b;vh3&)zCq*ak!K zT8IZ1%O*esLoQ?{i?TLch#0%PXq5gY(r`}I5jE86pvLQHEt+xB;jZ}Yx0}pqO-^Em zI!E>fJ1XjfAL!PRTOn;XhVjj$6?9Nm;U^*7n1H42dBG0R!+TZ|+IH$Py3@AnXDoNu zb51AN+^ye|p57)oPTTlWR15Ba(`*I{VK)y0W2lCKBF!`axff-yy*_DFP@_ceZ!+MN zK_FOz&IMSj1C?qU(JkFrVXD1aFXNpd{6+%}0_DrSzNulY*R=I#>J2S~i z5!xq_zf-S(*Hz~w9c_WdV#S_PDSilu@)Etu^EC*akF3;0VU!r)9js|otyXO1HIz9d?{moi(qEa zZxNyRxGKvE?b7UlgF{_X9@(il-wmiI9JQo~S-=>>>?9x$Jqs}#`Ttxs2OyD7eyPm_h{TNvz%mas#C3*-4Zf(*zu|ZogmsqLc!%8l}V<5~Mv; zmrOAj3WZ_R-5#o~HlnUBq$+Ky_VW1AolEAqFFRpm9q>x)<-6S&D*BM4j@xiVv`d@M zXJcxKNeIKu57jkN^E28*zF7{kRi!1PN1_HeKXW3fRK-n}F$k@vj~Q9LfzZ}AK0A52 zq(>kw7^bN|oIC!_uSi2N-s4@^%Z?+P4)}ca2v%=j2CZ?>B4*P=Etd%o?<6x#+;~JP zi$T##J)S#sh&Bb)G9$RDY(1{t(C1Vzx4ueDWZ(LJCW5AqKcT&kI+q>HK+gzEb1l+h z>s3Z0Ghz-?=h^@|saO{h%5xaW=LnIM)O(`2oxu6DR)ZN9@+dFZK-W$p}~8rNAEu>jVX^3Pv8#8p+v{;(=j`0Hz|=Sklr=?x~Bs zQBilRj6UZl4&@0Ita=&9+@vLohRnQEc=V3uB9hvf2+~RW{0)BPp>ci2;M3+;R|`MT9ALtn8*) zNj&%{H?n?Fx|;MF6%S&sPoAx>L)tmZ*?bq;%0$Z{Kg{>(8822Kat7Oe4?Vl_sWORqo8fEia9%^=dF-b@)Im0SwgaqXWRSpd_e!XO@NCc~X(R4*P^UY?6yaYihW_T@ z$zsKF*t-TCEKPl(z$Cy{z(I}B=&E*>AZ_!0N+WU`UKLzf9V!_`JA}-u^WB2Q=VTrf zKNJs1(M|j>I8*0X@3vUw!lLnUzF4KKl3}n!H_X=E>h%cT1LW*Dg62e8G&>UF{vo-t z+5UJYvo7~7L8<_@Qn!-!<@@?9F=@7z3!keLM_asB>ooF5x5~BIP=634+hGvOSR|6^ z>ivTk3-UE2dum`Kx1AUSZ-~E=6Ox+UGP1q+CDE2vSob1Yjn5uiEh)C=t!DQILXk}N zGnKH8xJksFs;hLvvxgLw8j8eZmIhvf8#-V{n|5iAC-8EfWZX9AR+*h6NCWH(&~Li| zUB8FfQDB1EZ`h%LHYWf>T(mO&@5 z863zam8N&bU=XpIxG3?d@GY^^l=|Wh`hsLQhO!p2lbDmHzPes(d#{~ZJLm}4n`Z73 z_WE>rk4%h0Ub8fg_KH2vuGS&CJLr?33nur~#o?~gFZ0gYT)dYf#OXb%ZqlY913NJ! zt-bh{!M@yurmHVUOY6aZGsI7DZQxeI;B+dPf0=nq{-7sg(eL3X!o3bpC#9cot*kNU z;2pv9Zr2Ly!(u4K%ZS!HOr@8S4AMJW$DwtUYG6`FK+4FH(TUA)m2BrtyAkupt2N3p zxoHF(&epM0(w%Y?YFsHA#oKlWy3Lsh?hU+c%%L>#L(`CeEA_%|=6YDmvcHqvP_G2t zLx2*(=D3`kU~PHND?M)Vk<)v0^2~!B|D=WL*yk!;6J(n+e6Oo_9lDCxpkz4pcX&^# zpIt=rYUGcj$Pf;Y?~X?JAFf`77B8O1NI7+P9E!W-P-xY#pD0b{5f>mRJj%`>pz1fF zH8KQP-lpEGD>zbPK_4q-DB-QjAcqa2V}N33M(G2_FgvGo$bDCkxp^Gk9~bGjhD$il zMZRqaXnG} z^FT%oOYvTPDUmzVO2$a`H$fJfg=xzUPCC=P(1LHz>WVo&X00anwvyvC{Y;N~A+j)4 zDK&9nq8=;yGdC-QB&m@?7jShlbm?5^;69b!2=_n#MByp`n_VG5N>4 z7~PQ4JXQNjdI#t_?!CZ=)je3?SZ~uY?igIRQE6X+X5(WddlF<3bWX-elS}WZ zdg;K)WOPPC!E86+WT&LSvaDE z9WU7tfw&uN3I@^YTR|Iq^E2YG-c5FgWx?UWMeiV7*g?!y0GZ!wknoQ8y z^{w3dzl$3t9}ZAk*lk$+s#|O}Z7WtR)n0S64S~OYzB$b^izAGlttcib;yyg+lR=}`1e z3X(3_ds|`W1t8)cCGhh|98U~3CVqZ`(LPo@lYX*v;mX53kFrcGwouvCr0^K$^*-bn zmHRuzb%mIL4$|L(A3HO#vWb7a7-h&#OpLl+(hM_Z`;1fri)L!7G`g#%=+xwtwY7`# zvw=nH!DX>_!AFiK=6+9A9Y*6tSC^-sl#F*g8oyjnOTe;v_)m97YqH>);$$UVo(Iyb znx z4hx|d+`_64V0?OOm|yv5=0^Bfr^xs-CPS+}omuwaDkzr4c%^f$QIb<_KSy3uuwQkp z{%LU~a{L#%m)gVY*J~R9&<{+fDZ`hZmnt?LYN5X&Y0=4}o6jJ@G3FXXb}6`fxoFdl z(h1O--M|4}35IAzS%*Vh+svrYiUu$N&xpUTBpKj};y0tOeW8Lj7)2gHqNltWPb?Eg zQ3qP+Of_-kY`@=h0_NTdT#bX_a#?^zF#b;Qy5SB1`R8i=0b_R}eJ-@RUfsUM2ZJj; zisVO&vn5GHp~V+HBgMa7t{9Z;LLVAkQp;QEPZqE7h&(bCm5&w9RF-ynQxW+m(#&hP zvjf4bjLx&?pMt#FHJqfXzM3mMI`~VJre|s%4y0B^mDlEangg#3>#}Is+DDXLMBN%c zNuLxe)94IBsg_9N&NJ(dP8L700T1R)w69W*PpaSj;4vCHCRt8)~EMGb9;LsRH)RFIaJswKpNG<+wK}(_h zh~u5z-ZdV<5M1KxQzJO8;S%Q03NknHICX@aS9HDIz0LxB>mUQ#y0ir@9=A~8$MrWB z)He{SY!q+8W7YhO62x!|?fkB4F-97txCMCDwqlP|*A=eB-{z;&N2uElY7)*$4Nf1(I|@tKgb(je)!==pRrjGq~5)iUA`w z-$)B5O;=%O*bEj`r?lbm=Zf#?_uJq>DpYl)M?J1VtwgL4{R;Iyr8jt60h^sc0o>>) zZ$r<+Mye?*6(8}GbtTC3IKig$iVwJx`;wW}8St%D@p&w_cD8U0&_F6FerP*&chDH3 zkHUQN^}Z4n;(WZfA)%k8_VqVyuonTHUm0jBe|}F|WM(CdsJ4^1=0Cr5{<#1CLMvvc zhyCfnEb<=R_ZA4Nrp8j1U3x%e+?nf0GhJUazHvJq`0|Fyk~>%^KB&za_Cu4~|9HE* zp+M%t9>6$OQ(~>3CZB(j;n?z~6gl2{UE{)X>Z{~&O`tAqYMMBi zx@n1>t!uj&%n|2MmrAeYkXDF6;eKCyN=9aCizvN4T4urrx~{tHth;Ps;u%5JM*86z zTG=AUQP6kTAB7J*mUCg}lWrp36=M0&;?v#}RIz*cCK`M|xe_&j{|gKW&6Rb*Z`46z z)j6*^Po(ZP@AY0K`Fv)2aZ*FZ2 zRVE1RK6Cim5m}j;x$MvikP!e7OGJrt%o(N1^0{_kH|t_;?t?vipm^V?`J5hZZ{NZ7 zrN>nbn0~Fk^m5t7L^HZuoJKu(8h3oql^t-;#-XcCxw9|vilLx1{1Zb^xt@{WIW!wZ zCp@@KN5ZU9ntU1CvfAwH$D^p&^|8P$P4?%DQ%G_c0Kh|Ws8Wldd0DRe7lKHIy;+qB z{#tPcHEvsjSFRx@0-iuW^VMh?PwA5c@Q|f#rFD?!jz-fUa2cmr_^dg>l6T7+PJ?R4 zbLt~2_$}hpB&b$^uu^A7{Zo7}fcxG=^V3^QS?PA{-X!mMmF1dkL*W@oHwl!lpDR{E zx2k#K)+X|l9z)M0RXl8%9;}`-IL;or8kdNI>1iz|X)#gon9EyE>Q~b1v+`@q^&woB zoYPdad~deds!Oe%CW^TwEp2`M%O(D!;_>9XrXY5@LX3+W8x~T|>r(~J&|l-!lyFHC zH_JAYxO>+Fc^adzvR%Jgylqsnau9!wOHTS978rp|#x?NENW$`S&11RuJH;S63oj7) zVQ)!Vu*^R8KPkSo-rc#w%(6_~mz11?5$f546|EThW(kKw&!x}EG+s8VPt%G@^&%0!CY}&NL3L7T<(Y zo&bQb03bEYb1mT6n++*3te03ZhexbY+@OmuK6{pzqAcIG_uS$gD3H_bvPvU!P?fP@ z+KDpPc+$M+ zuzMt=4}R5O2`J&Ls;Z#ab5pMA2X}_3c+IXLO8!?2 z<5DmLsfJ#*2<1yqn#~Jm=r5ZHlBXof2s&p>%|c9U8+<{1^3NmaxcG8a;%35F%fc3| zUFAe8Wvuv4Iq5Z}*4l{)Cq7mWe}lUK^^!(}YI^D-pSVp>X-`V|oY)#{w;7f{(cf16 z1s%P9yZ8q5Ici<+P=TRjKh^~)>WSk%eX!Wz!^JyN9EdVeFVU0(2xOu$0pOL;F|L^7 z5xzIN8R>&*qfG>$MGqElq9lSc3=ko_l^95?DMm+6`S-*O3&pS0F1N%izutS7EQrWl zY#M+-8Y`+Q=w9u$(O_!iIQ=>rbVod?l?C0qR;;JCt}?>3n}(u!!m@$9x>=(mAc>%*JZh{{+rwM>uGFe5K}r=yxx*Od-~LJHo_~#nn!p|?4IO| zwK`_*@5niSMS;o>+ud7DD>kh+k<3IZhgx$?Z&EO%>+0tdb(qxy#dR=%Rg`J+;BA_( zYF?lLkKQ?(<+!vX+9<%z%%Hah&(W_Hcf^;~XCH3J3vi32UJrRqSRe1%1en^VtK(Ha zfmrtBF@UtvBvQi9YeTSf)$8K82v?jknYLXU!d|G3SKUmv=n=M(g)y>hqzMg;`9 ze@@;Jw^ECY#jj4iCG9O2p_w?xGC;*kW0#6x|ez@AIavP2s zQ{4($&R(?O-cJ@N3N=vq92a*O5Rh=e6a#mlBGl2qw9{+@n;}IOSYsSN%Bb#2G3r|r zqq>O~W3AU4R{C^o0pQ;q_K%su$8gZ}|Hj@7tG2`S!dN3-Ys_BOz`aUlvZ%e<^>uczr0TWpkjyo&shUUQlC#BrY(ww!vmCH(^mr{z$4|Dt#!)_AoKUCrjS za~LmeCE$$C&c=@PEYH*}akzIN;&YkRAmzm7J{+8^h7tI?=jIrt01u+GC$4LC13#HQ zDlp6GA4YYgPm2@OaZl1%9GAT~4_gb4aXyhrggog2E{rpa%eC8!2+oW%Fl z8vZ;N@8g!Fd`3}qBV0>{4Lz}YGS8kCx9mNC0$^=`n(yy5FB+Bc={(8t%*Zo>M^(H7 zJi}@_VCSBObyWc8BeXkD4baBWI4t=M6;x2OQHvdKO<#LP+$r<0kvM^Osk0kK@PF2EbaW+yMJc_ zl0RJ#Q+~SHL1B4mG6{0Vuc>kyp8a8uXN;QP_ewbzpV)H0w^_o)u(xp7j?DFntox%< z^Wcg8ppSBoC}M*Kf2a{H(F+>YIwqvM{;45SXsihJACg@aY}+MW&E_c}B5q@cnKPjh zKOUT5Pk%tFu+U%A?B$}!swP~kl#VaSR+=E)^^E*chxPr%s)+zz>WbBl2#!`+EB1|! z($#M4s5(+RU8Kfef#zER7WRLufW%O(0ZiCd{CoPe1KY(;&GR0*E)OULgDr%Z;9T^> zmxr$^R`3E8K9lz!S63c{b;8AOtZ~6PH7bDRJ=NUZfroEqINO}yEuPI$TD6PM0UIOL3B}u?)dOb*avZr`dQIToI{5Mw-x-?#*V0 z{@J0b@hLx-Zpi(A2RN95VrVA@2G*_y{Xr#^YXEM2?g4*|2UpJotX%gWq7@ z6L+(>)~o@jv?P6MrrJ`Ug1fIAg57au8-i_uJPPg*zl&GPRh$A8oa>-i8UIp_bA_9@V|}t@^bM-yF@%vf^=vo z+V7?73kX3i$|qf8RoX{Zy*k%r|9y$MD=5k3&H5`IdBw}AvZ)U$?9(+1w(yp9#6JB% z_@#9f)<-mjNSKG|i&0<%FAnTl0`gZ%?x;WN`*GiUd&L(j#|8as&c_uwoazbA^|U^z zS54o+oEKYN*?cdeInevSTB=K%wd(dNXzjTI1mSDGIw~abe7-;epS0vse2pj}5 zw9$gNBo1*TmxBpjNj}wR0lGZF)Qo@D!#BI!j8=SC<*%;m{MB_e8Q`1Utb695JXXD& zuYoj!XPAy3m3zkK_*rOf92=7r0fY+dcjuM z5)bZ3hu=~BZN05mFRv=`a0g|U=5nB(qNf$HSR#IK?(bBPe<{H+ztmHnffe$&N}{_! z^(@s*q?^8}jNp&0H_NG8%25@`A7;6@1ho&?zGe^X2ViJ4lZ6FgWBVhk(K*TKwUB&ktEcQ2eg9)X zAm>F2J(hef-w7?f1^FCmEK&}=9oXl!ai2Kvb!^Q97$JDL)5BMLQ%!t zS6{NK!tUbF+y4{AdZ*i|H>Ft(co8ygap^DcBPm(*U=UrfK9isb3xl8~A&ROElg)7S z`r@s;%(U)Eoc}io|2c}LX{#}8$zePJ{57~tt@xlji86oHP9+J|8iIl!LpNBIsKitA z;U5`TrGt5~`=_RbcF@B7)^IP-jZq~31u?b_(z36byv3E%Mw4hmB?X*8-23YY48*q< zwB*y{F@xyvXNzkBVx{`7)IB#Jta6*|3ZPf0!YNElT4ibXjT7C?%@c49mjSe+mpIg) z;;@JadGsGh-7w=P9YOu@$BJ*Vb4Q6$+-WKDiU{7ZR2|u%k5ksrudd`hxOWI;a;12U{amD-TZk+gAaGh-*g!FqsJB0GCsS%XNW!882P{9iP!qcG> zUa4J|2)V~r+$lS3!|Iu(nxY;IvJbz%U}bXYv9k((Ks`1e>0k0S4$1mER~x{G8NLX2 z<^x?aAnEzlUsx~c8L=&9A(l}eLNo6S){#%SjYgPD@;||c`HF`iXUgv{sP8Y7--m!c zBRjOVjfxKWcZgNVuQXfo#`5mHP_A8{17%)Ah&Zu%^4*muL6t3NmTB3c4rDiL&m(x{blKju>#1Toh>mfLH$$pWS}}w zZ>qlR{g)Kqgo$0fER}xL-$%Kq7Yf&cG}f^%J&qh5JjKQghkq4Whm-6>}layqMh%{Z}oyM<@M=~Gv$p8w&? zrCg`EjQBq!o; z_y}t8i3f1_%Hj?-_YyA0?QT!mGs8AA5690SanCSznXPi~*~;bx9==+-2HCwU2Oqtf z=e{6z5U-YkvLpr!!)9xjJBBbhK+%Z3s?6_)e7Z_KWT0HUTh+tee^yE*n+Zx@{Usn` z13u$EI7c6V8KEqWD&f7mQbd-n9YGgjs#%FMi;HQ!0`nKN^jt>h+|oCldp*O|-(Bd) zyD?T5jIG})nplG>uIEvnb|_S9;5kHx`eqEJ1)|xkGhml24}rVN$`HsqxqCN-#|zcg z6gS)ZtI}`8T&Fn=L2)E-qdAYmR>@}{Sy=%;(g3lR5>3WhvRQ8at26!v&HePb1Z@(2 zQKTx|c*uAJGJj5Eya`Jv%OTG=NSwv}qHqvxt(p^=Y=`3V;TMZ<#q9mmGsx`<=|CCr zh0ig*V6CRuwAU&lL)k8Bz1&+OHIbM4JG>VK;2tTfqkE)>}_|P?-i4SPO>(VbS zU|7Z4!4IVp6|AB&TBlzXMb=Uq_FD9$YAI!vrQl7Bkl$lIkTx3+00WXx68FBnKpqqn zD^ap4&~4VI_;6CXsK5Z9-a7sL4z>gr0{Y;v*U=?@N^j!5yHdnoFIe<{Uh!}ryjMA5 z7ZM62meu3q@78t*&YE$jfxVDLx;o`zE3S3xk%`#kS>NB0*{uV?cDjhxI5IR$??@4s zJmxf`OI<_-l`4b1_s_*IvWg;3s;rXBswM$ZR!IX;Ne-)uR2%j>GfDOqVUc>HNM$2T zSgortyDeRScUWml(NeMtE_HVS#w>m4DGqn^Z1F3`C5%HfKC`*mX!{fQ2e` zDMRsN)s@`OHJC>_&SYOy{9|XbT#r^B^a)t;OD64|q^gbZCA9B9Sh)LMU5XCc&2bUd zSv1bh|Bwng^xKS-$zu`Y(=bqjROUKPo@60QYd2S%_6nXX2a>Fq)-T1;{wIoUGR<)4 zwJpQIA)H2z?@20u^px%X32CcT8B>-!({NGM4@>+OEYYnvqv|cqR&pjH5<3)l(K#GF zAYO&Ql7&hrg`dns{H-jlF%zUr2zwBJBNoWq)mj~*$h3E&Jjyo&qa-|`(uJe0BVh>k zI)cSJLEQ0f!!Jq=9mfqx>sw^$%$>G;(-rNtHn~sm80wx~uq&6^t(vl8@{iW4jAlK0 zI2tG_Wnmp>QscM!sVt9W(Hu%xo|LYfje{_}j@ zpmtM7nffLvyL?CauKtm<>xXMhu`P@f33jO;y$E(Pu z-OQRJ>tK8Y%$8L{5>3?mI=d#=E#m+``00W@jirG}E`rp*k#&NC3TWbEgk6rAve2S7 zAg!M#2VJ(IQM;IxEPV@4bhn$5(w6D4E`p{knE|z22d4K`SK(6Dn9+r__xafmrz9R6 zO;VY+YTfPsNHOHj#^klHaqB}J@#wdp5-x07T*h&x)!v^jewG+A4Xq{MP6q_9(&rWS z6S2lsUw;cY6G!hsFo)$q&<1$0)op0snCm2P{RY987q{h)`qBvgg!)0=1d8;OTc-bL zL5+am!`Bsm&zV2qUNFAPx-wh@at6~b8{^fJNh*5}cv@#k+OO)a(td5!YAi;clo4{3 zjj_|-yI1@Xr;QX*KB)enH>?i`R@3ECS0!RxZ|WM7qYOmkSh_ZAu&dRTIG+UH9km<{ zAMxgU0_m#d?9cSN+rZ!GlVc^a5vTS~i!aFXd(G3xcI^T0_n*Mp?PO1&4watwWUGGQ zBv)#f8xG5{n6qrJtVoG*C4liQ0l8kM+cuN-cgw(LrXJE^0+C*4O-0P?U)JG zxht$QKjTilAvTL06c;~%R`G*jt(}|&1;5f!5T-xhzpe~N=gfThY>aBul}ouFu`~j_ z6j7EyJ+m!fEN_!%qsl_qxu~L&!@v|AfHGwa{!s4~L`7=J`~OVU#8Akya}Z%eVku@I zN98%H;7mKe6?G&oN0^q>ZICLxK~9hQirjV0D{5M?M;^PmoungZ@09{H&cR=gjW3^mLon9X;LZXQ6&4VMW68ILx-x50NQR^TQ#?(mm={>C zHL~^Sw!j5Z3kKDT#DvtP7^I{J77yHs!#rKQ7Sv8(;MUGYhqH3MqO(zZLa&j*edU*!jULPLizQB>fnqFL zJYv;P(aW!&tQELnHzxDA=!w8ZOumG}pOBZplMzS>6S^_RW#Gt!g*ivVOSa3}6((GF>Wy>O3j57gK6+S)zz;f7I>jJ7zh`}2c zOq=uA=pP5g&6qB@28JJ-_;G4{m<%S()mf`%G!&v8x*h^aim38!45%eRuF7L)_nK{sfk~%IopV1uNzaKfI&*P>5=2V_t_TChCH#u#;EM@P%hl= zZ6ze290{YJQ7OY>gTdRt&I9FO2_3_S>e-iUbc|W107XOxw`juV5LMrQeYGYWA!{Xj#Zo)LPt0 zw#nXAR8{j2=yS{3;?UBMc@)Wfw!SUcNdJv$RbXC1_5I5`^utE#%W(7lw$wg_l=VW7 z_%#z=0%fnvqz9u|{Iju3gHC1jkeAvAo?Om!QsYlb2Zr)(&p1wX-x3_`=uZ|m(2Y&2 zLpUy7(-UW?Ka+m#;&rGj+3+;jAL}((yIV~ZePWTRb^W)>3k6X34!2+ThW%{;=^6!$ zSFnGlQ`fqY=f^W}SL1moF@e^yk^;FvjQ)#);1;&V;;&Fp!z_u<+!06cyu;EG07vNR z^^9a&y(>ND;eSw>FnH%ksr1Izk1p362~Nwb;OoAK}9g?Iju`6%y>iv&&UeKGWJ%^#GEn$xxw*V?sJmdXg!&DZI#_k-A{FL5w$%QLK|W; zXgsjEVKoqbc#f>Ibf`l0nQj_E)53_lQT-?ZYsZ}Ej^`=nzk7x<>kH())x06sRFHiQ zg01wM^Cw92arBvhBmP=J{6;0lR3XTV;wu$nUXD}<=hwvfua;rrOO;Wps(?|;D$5|A zn#>4M72Ur**pfM{fWbb!=Q1q#*Q`rmh+AMZc&!y$b65fap8hz71^J(j)R8NP@!k3` zwuKm$!XPwMQzXFxoTK|Aq<9ZQ%l5kn}xc&w`U zdN!sZO6S$8YPfeOPKRJqG%`moXYn~fBcdSsYl^NXH@+h%F84&|GeEQ16HhU&O!fhc zN-4*H0aOF=`?u6j2+K+wC)jCe|wko~?dwl)%OA#*M`nuRFv8%Z6ilE>XcM#N}a0>V9WU? zGUY;FY`7PPzbusiwd2T49%sV0i|UK|6a8Q-j9!!Dmkqp@3eNfywf@$CUY5tc1}Qp9 z08~$@*#SVj+u5dzTD#{WyRc9I)7Mf+IRUbve3dpu7C-Z$XUr)>4$2)OGuD}L>wQI=>(!F@3=b^)z10VVFG z#M|NBg0OlOt;+0n@SLnf-RzkB$sF?j^&J5+VA#;+c>81eTCnMju7859X+RhyPu8*#$b= zz{w1PO~Pd%D$lNHh_{l2`5pY2Fnytb=be!(-K0pxlBV+P{hV#Syg$C6h6qAWy4Lj$ z3X-YUgmn7UgBnjSdP1P-njf0|UYpB6w9KeE&UX|Vwcu{prnfk~=y52v0ub`tf<1Fp z?J-MozPTW_Fj`?K6Meb>&=u9Jh4(7=5_lpQLUR-D*gQsgFGf*X3D}eF>B@NG=~nG} z2lt^>uL2mH6EPB4kf@4lQM9frk}3-Ba4gNk76&aqqfdQ~;_3&*Gv0*eKb7P}m^fGN z%tRA$vw_Fol;lhZWOZhOyXKvar#ZT3V-;fG3xG}j0iWXJ=Per7N@uvO`?BjsVDd5F zUAq~ifSQxoT!kv%jw9abD>&QO~WN;o7z_ zC@T9$IQ_NrCSow_X)r-bQ~OdpiFZ#qy_rrSx%DjcdZpIGe~qYG?c9LP1L>|lo?U#r zMJg^TYSu$Jhf&^!MYw^{TDru>kw9r;dER>r{xRbL68Hi9SOBAAslgY|wjwQJ~h zorgBTbf*0vUbxYiVR=o_NLmwO4cS_ww!=Iw7_u5-_V0>~QF`$d zv%A!7x9WEmKmA_1UMWFokVcYc9dDa2#*X&Ix-i?j+5w)w)u2Ypk8H{L5$se9-%VRf zCiQOj{wwh*(U31AW(dEw>inn-vOW~lWw#tBG?ujYDp<}{LEjNEh8MtFILi>)HB=em zU4q%|KZ!mL3QWCRL%0Poi4|#Q-^cdxL5AG{?NYE?lJ7R!u-D2G`pfmvuA_6E1x45f z0m0-A(_-%MN9Fy2W#gC1d4n|*?SJxQ$yfq^Mv47Jtw-z1@K?G2G4Vpf>O?gxUI*^w zvW|HNx52K^>qqD|M_LDl3Zk>ZY@!TunL@S79Tsj5eXK`}v; z(x&4G3(#n2D`T;cv!_ojgW|Msu@&W=wxl(~o0%$KIKx^FTqhe%K4%R9nwcg+^qi*$ zX`7kqn?cnc5-z4gFpCnj_;55ZwBq$FaR!}6@mY~56ZghK^2VkZa@(u%N;>B0X}ZPr@iiM>cqH4Q zs@co!H`O4NOVPZA>7N)kos1hH-RuWiZo0weWZn^;XLiQ^dekGdxgBT+d6V`4duauB zfGctXt8k%#KZC6SqfM#jd(TsD91*qIg&cX*8uIZ}5HZ^xhj_efgqi-E$a3;H{A{;c z*p!=|m5DaZ7O|$*hMT%ipZuu7)hUC%Ck9w5E#g(8Nei9w8Ny;4lW0^jAHGVZL3dfK z$?d-~$#heciNG%}^7u1-_S>Q^)K^J@)e}f7y?MG>@9O&GwCo@8yNd*m(5apehXgeg zM=5rHx!}@1I@*7W_-EV?DHK%0s>M&gC&c!ZP6Q4^DA$3r(4 zjHw_dDk$Ul84(_lXYbAA?x>k0TpSpJZc7vZr^VJsvpaE|IkebUpZMtx%neIi@yRmHpD#Dkfq^6D`ct!RlVhjK}bCxihKR|o|_fynJ~ z<~JHgv-gakc&ZudCRaG@5oMiXlR5hmD4vfMo7jpo%^JFciKkJW51ovG*6*z!tt8M9 zzURf~wOf(h>^Bv?u!hUt#o}#@9}M7j+#q-!JMZL>lLu+ZH+c<}u{Zqii^aEwlUTFJ zLveK)T`$-HyYqeR5uN4S4~~j&!Zf@BIv2WZxNS3QrG}F6y(=gnwV&9grz*%CeXwX_ zl=5~>KZLWv#(^BaQy6m?ZZO^#{WqhE7T4`pX4%%Gmr1=EQxnNtr|>e{qs%nwi;7(= znfF<*6dYu&IT*mZ-q(snc$r)|=O=)v=opXsk#$YvQRGX16Ptix6cPP)wHyVh%z^%LgHM}DBVfvKJD)`8jRC~OoC8@`%J`3b}NyW8#cer6m$CQcT=rww_ja`img0S)ZBd zU#<%QzGV4U`Hm0%T5;1|lis8i2S^{@TKDxFuZdNcw)Y-?8!Zn>vPdsPyl_JjLSyfx zI@Zx+1?$FP_3Fr+>rlG1voG-d#TEu#*+s;jG8gA(c#?^2RC$sGYEa`)PqE(ZAmra8 z;?mIK2{sK~==mBL@_8wsVgGmr2dti+~^NX2Ge6joh=Tz~=-tRhrk%(EAc72_$62-6y)Dl!%~5BF_(qh`eG{%ig~_MZb})#Nt4g9)}3S^2Yj4UaqA$=cPcOy6M-#EMWuqfl_ZSKpPtlI+s~rN z0RB)R0SHmaOjurnVSgF!3<+$8IG2R0#F)M*XUUHiPlEsH;07+Wu7)J~M5U{gD^8$% zB>1{h{dn(_#TAgJr=9u+x!slSHr`Acm}3Aev1j5{RzCP>@f2Bi2c9|T`J`>-#K=}s zs^@Kz{tJwI{OhImo)i3;=TNk8mr=y6BW?E}dsL|gvKd{NdR%#wu0_57`2sB)yd4{@ zhL(KG*rdnq+R;OjV9j??_8T=$1BIQpvhSfO-o`Hp*vdS+tb{l5=tejuryA?IQM}79 zN!!=c6(4xkA&AdbwdB-5bS3LZAjB0LEc*NJKJGwQOfZkVP1U|us?ymbQ68Up3}J#0 z*;l~~AGK9L@kvJNJobvAD`f^M9T#Ifb%q@vF7AjM^|N=sKlJdM2Y4J8|8Ow?@sf+H zf9d3kk=9O6%n(szJ;o8yNa9e7dv7Q{SdI<1&dg)GNjt`+5Sh-+=A9ErKj<(1$}_P? zhItVR3`qb0>gq*Plm@x*fyScmz0|8%jk?B7lDuzX?mtv89ze5CSaXSx;*iMfPl-=e z86!H<$KM-U%Kq~tXtLDafv1dV<-kwmAA%qa=>p(fqr8hC$cyz+WfWmYr0)p<=P(u% zWkU3Bs4^k&-N{a8-*CbN3~)UEUcU!o81r6Uy4<`)cO6U!VQv`7h5J%Rkez6M|EcP(wd3%WhDK6oYVQ*&W_eE9W9^7V_fFPb#QRpcgBqfJxt7qmjN?=tJS={ zP9HX0*z%zskq(4yJ$PZx3NaZt9q1wv5hdT3LQZHm#)=4x^!tI3@oOS*O_1At^g)3y z7HRW8U5FCF5+FvrJ6mu@AoQ1;*Kwgx30ES4-eWe4T^Q-9`-9^BIKWZXb!?#UH5f^m z$;AExxwZ3LG@T=*$guAmr>cFG`YoOeup6$L=DI2qI@-PM;(w`ZFM7BxcY71&NR(xY z)p;llPp1R8xBQ%t{ zgxm#rj&Q2Mr+Ehs%=Yrow9Qq^AXK`mSuwlUf2i%0CPf%oV zye2%w5E@9vOJPA@E2^L>N5(13i`fND1td7v>fD^&pY%@2_cvl|extAg9CdA!95j1` zdSFnswftbSn4o6fjbWR8rxUJ#D+LQtxMh20rN{GAG;+<5*S+d;1a%lU<{0~{;j(3}k3W;RwH2Mmh!I#P+NfrxF`#;T28b3Pr*4!9TnUJED76bZ z@lX3E0-`V|UnX3{38|2k%wtW=fAP{@<}t_+gVwwT0uCU3{uaZ<2o<{ZG;fC5j1{h3IMLX7QwFp(PojHlJh`N^I!M zzppe*FzP3ni04BYwQ;1TlDJIL&#ZG()J%5LEYwyoH!smN3o#>*W+9g7&rqHKnXG>X z<35;YpNS=N;EJEID(q#_fo%#~1s_P$Y9{%F>3HX9fF zSNkkADeqp@LpjcoZ0e>cfl{@|4;Ll4d>(~bw};zTw`)jf%S&G5#&)gUUWIfcZLR0> zu0va#UB!KeXh~;lyS<&dcJ9Ixrb>G#2vf$PsPaA8Z?xw(!Yz!TC;a9PoH2Y>;g$vZ zlIIh%E*b?dj>g|w@xbHWJBshFH5!-DvAT}hE8PxUb{bYr?5N$w35KuA-|8puY4p`) z0IF9&%O}`0yG;YgIyW%4cCa(#nr`d#aF;vdk_7H-z?V(0RP>7hUt?oPXQM{fOG2H`r+vB2K^coCgC zrQm>Y96)QVNI_Rf9P2z!$cCd2NR1Dn^=fy6--j5egaVqW7cZ=CvTuZ%#$)PYWEWSkzaHU(~ zRN%OMqS;2|r!r1yb?d_UdWiy^7XjIfYPf2Qcp>1!esQ^tn78#W$ZOJIt7CHG`#K*o zA;k}$U)*W~PB+})DPC6EKi~kGE4wZh6Yvf!g)xsX!KDxWa&ewZmta0vge|45Uh}jU z^rMnwp)WZWrv4=rz(;V%@?tue9k|1U#2CV?;2gr)&0zP&UgXhl7XQ#&1LV_H7=DC{ymZ9oZ`7OZ1q509ee5n` zdCAl=d~e-;j{(L$GK8TRcH56ewfVaK#+!EVl@sVA)7&-PT70&)_gU2uR);^M&M6E> zT|edaO`q&D0wdP$hTNoC*^M&;il*6HtGCombu`gw=F8d^Iyq4;HluN@6WDco%w=?WJ z%h6jbboXYfnPGY?B;(O6!Q(k+n&F;oVWxb!z$-XjhqRv<@?*i;jxw@A0rAhs5f*SC2z`?{JydYQ2_punsdY6E1^6yAhp*N&r@5OTqbF zQaZ&%121;k=tm^FuBbTWdOc@_U2Q7Hgmv)N^F?PkcUo>LGHUR-v%PB~GZcq5lT$xY z?Rv;tXkv?RBQZXq&+WZk+MRhNRhO35bR<4;YvA=|Bz{ayZU~#ML(f~(d^tShmsTwY z_f}?(P!FA|DSxJ5SQ-#evr}isr5809F*z+NodU-*lVssBR{pVSo7~+jWUpecGm~YN zQLTm`Oh6HJzKe!uUEoDjw$$SDQb{37^G{v9gRhaQwdSPsJJv(lx-u(ZD@eu*955-G zM=Ehi161Kss42c6{TCNMd-orBm&$!E4pMcYE?-afpt`qFd^#S^UNm7I*X1NK?TR1!Sm@DC+O^eNPzto7EKJ2e2c;Ud5_!)>D- z5YNA$j9g%bXR33}CkmnlZ~~(3%O!(wlAkLF;@$(A6^k#98V1S~(48X#Q{X=eZa_dr zd?7HR0S^Pd69rzxR;@M;bq5U$$;3JA^#px%m89hz&TABg1lKOCUNb2EE9cf!<|lj@ z?e5Ah!1SvAPk_{Nm&8&iiFMq2dvO~hXeiSi(T&O`p771tw6M>@)^uD70&yBs>WIXN zGWGq2YBJEi-bH=*t!-|la!0YGI=D@%*48K!?JJ2t83RX)t44>f6XP(FF^l08)L2J9 zeG#saDGF*FpZ~9mP&(c0z(A%CMpbB3E{11+I6m1;`E`<|9e!`|9Z=-prcyi$H&>99 z%2{`&1`FHv4h>y(mWSY_^#*VZsS_&wAm!~|j|?CX@^UyVS=Z+Oc=5jUluRNjrYrV! za#9YDopnZszg~O@Gt$O~l~D3btk6|ll6N}rxA|AO+%)ZPi(P95@}!8_=&|gU!8!Mq z9(?vtW0||9w+2%&==(_ucqCE)@UGWEoZt_2Rd{|$M7 zmI{wvkbH=k)wU(i*3nuf$&X_oDclBdU0ZY8O@2Go=%Qj>Yx53p)a1|R?I9S@tZgqo z`(bYzoFqy3J@JlAafkgMDehwaXQ33;Yn}4xm=n~$fd8%%QgFAnk3R-Ou0CduFyHVE zZzOx2?p=~1d@drA45h3rGp~Kz>EEvH02EGEdWn6(P^7YhTt{gytOaxMWFt(~S-ANv zk{E@la?zTwUL{H&DdSVc9{ zR)_Xhf2#|J$@J5r^HSDg+JsKIJU(-X6ZeKMZw&!42{aJ*G6s9}Z)B^>cWz$FbaXCm zvij+4^AWz&LdbnKGIRi)BN+jCpe*_n@WyzAegf>(#pt0zOd`@TLfps619SPFExOfN1maq?SKPe@zK4IoV@bKMBMrh!| zCjMfGWPn=Sw-~|hB%G>yFA>|9MXc6{-Gb_~hGZ37v{2*Jb5H@}sQs8K7x1UVQZT!y zx<`r!HOLikR~cv|DaYpCTZ_Mmtt4awR*iPC;4al~f}sF=1l}qsi3o5_spd`ukc zQA>PJXK!s^?y`6>`Kgi$s||Pb=nbZvekK~qZ1E&z?oCTBA8n=sQrha$?s8$UZTd%( z%TRqCO2=Tf@!;@BEx=_&idLKp#UCq{$+{eR5?}z%B)p3~Y6>Iv zkO^RCTFthkfRhPirqBL*;&nI&DOYBS$g%AXPQh7;v^jKS_tw&pWI8<3FN;2x^U~v2 zx%JJ}nvozwz{|A`LIwa`neZ>7V;*E#_`st0^qe-Wi&#D+Y2kyK4*P~Xh}2Yz4& zya}G%#lMgW;W7gVE~dndJZwsnTi(c3(GzW{6IBL|>Yet_dl$cB#8C8}@1GJ(f(xBd zC>oh?)!$`rB7=g)FgOlGqw%xR2^@U4MDyq&@mwx$TQdt>_7>*8=s@3E(A~{2qB86s zEH-eFj6xiR_yx{lZz#KJIc|hq5@!T|Fdv4#O7k4%X$-^j4xHXpef$8@wCf;?(stFA z)^-z?8wHoHRJSpHPybY>TLCYm;|f0|%`$QhK=&H; zCnNJSJtQV>8Mz)}=rRo<`e28qxrMf7q#S^GGf}?G<8&d%ndl0hLb;c8>a$kgGtuYs zx9pEF+Y%C+X@trOGGEAV!3rFCAIv)N2~;GXb_C2M@;@$`48SLuSH{ZCWxCw!ns+qp zg%x}zmyA&eB_upWuT=Gzb%3}&^l_L$oRcTGDyNhv+=ST^W0`r|=^b$}`V&qx zwF{i6F}*X9WG7)|7CD+hCfbx9E|NbJS=v8gqDLmubPLiC8jOF%_EfLL~)IUz{s`_@(K4`YEJ};iT-ZuS-v_^R-{%VdfyuP{kh-{T$zqE*@ z7ro!xL{|f1W|?a#ps!n?EV3!_~4diQ~auGa6*NN~`ahMC}d!%yg(_0fi z0kbg)zJ+D63Cfiou8Kw_SP&SG+IR-Ig(pwi=uGHEQNayvHX5lVOt}4DRgGO(kK3^n z=uo~tBN?8TcTJ*H^xJl8vTqvgUOAsW;p!MiwJga#4%O*$91}6gyIKAi%-6_&^!^z0 zxnA^nlzX-0f^hS07@fS(hHMT%Uh2&32lY8$EUI;8l=)mM9tW|aVV(c%ZzM9%d@dLj zs^wmLKE#D(t(~*!QrWjjX0OvvvJ>a~=3xu{wIRy8=I0^qm7Ncl;ug`&nF|Y)kT5a| z;dIKr{dG(nUKcdXW`h)_YAr!aQJ%WI+=+)^#HvwZryC(^a6%v9LqIDcG=~s>Y5vXH z!~hq%&Jgq5FP@AUifE=-9Be{8E*2cbzOm0S@K@-QCzZe+U)9?6;>jS_r8J*Se(UiH zx`NiAs=*r;aV~>N6xAa~48YVV$; z+>F{H$S_!;Uj2>GHnP{m$#e0L>d{H1_UR9#;=SD`9GJcw$O9TNa#`}e0+gR*cog6L zo5x%lYl}KHPDV^D!`1nm!0<<%Qp#-2do+gy>j=0=ZvFp~?l)ai7=$sq@raYBg>LDgy0dJXNh3c_&y z{TA1SN&!3k#bODD(azHCnu_lkI=mxLto(**X)?bo0rIted!<96+%Ok?4wkRc>wDcn zx8C*e`c@#S-%RPhan<7am?l)1sN9#4WCT=N^a0L6%cp0>A8bD3{J6-?i<=4_-f3)N zHMmVMT#(BjXeNQ1(39B~9_r)+sqd@CMv~Qta;cX7qpH0%1UCM{RE-ZtSXgua0&d6m z3A6C`1(wQuw&sdp8R6bM1t`l+`j?^BTxfM4QTYkx&5o+Vf>qOry1L2~PH6f%gY)N$ zC~c3f0rmM@KG>ib@w)|qv2*nMFeb0Eu3338zhMH;GOs?OHOTQ(1LYrtm2zS5D2D0S z>-~#8Hj&6Kd9-)tiEamwEpZRbX`r8RAGChR-yiA$rTO|BM)hU zQONf4-dv)-4D$>@e0kJSgB{*aTJ(&q+VJS^RY&HY1T`?gO^YV1~4T78=3h%!jpX zbgr8RZ(O;76zy_&x(If z`MvmZ7DPc$ye2)$u=#?cMVdvk~)dc$J-mtxckQHK7xFp!Cfa_xl7WHrU+=(J}4z{@?@8k)^*fZ$Wc|)$9)?35OYHlrFXAl$<*z~DO@3*6LQs&Qrfg~j)BKjDo*X3l17m$B@L2NyXqkK~*e z7Jmz~yWDJJb8e~rEP#E@Yku((WN{nmg~f-$nSF`v+&ko4QCk+?4(V#=_y`Fb(Qb>y zuMYGkd%03zsMt+|Zrw~6Twk=FeiRQeKBLrJridhbQPMw2STfeg6chDdry@>RI*9{b z)#>9NHdR&8oI_CIc1zgiUIMLoecD$quZq~nJ$=oo=5oBO%;)3#@X`QV!L^1h%^nu2 z5F_E8yM`skL-Q2`XwugGZ7GqfMlt43Fs8D|$`MD&1UJPc{|IzN^FkxXcDTKv97O8pQ8}@4P>F^g2k&s4j;DsW zyUK^cF=n92jBjUR*ly>iM7;l)X`TW})me?F=wL~r7b5K|sug!ZiE&q4M%JPix0kNi zh}&T00JlHKkm;*dy32=m1aI^ z#r*1Spa?&szsov~U_d*ky4^t^1%}Z5)!$kZZxFLfic!T`MT*Yv;|SA7n9Gp7koD^Gs<*sOb&3xz7f!fSGF2r*)G@G z?G04AqFaG4ntBubs%WIUK*_%VmpfZWEuavq`d+y`jPwu#3I1_(bo7VvNJWdn6{+Yi z$+v%u>hk5q8zHIK`HoBxwI5WCFD0D=6Un_Sej|DxONl@)>6KpG&ldpNShS{a^W6c0 z6&3Z*9U-Wu9!Z!%M0tw{P&?4xd!-ERGFD0YaiPW40C>S&ca3~rFfVF<2$f*tIw7wlxKX!9ycyCm$+yhi&lMl1J7bzNA+Q)sj} zG8;<-%);BQ7i*Wb8@!Hu6w`Hg*e8gWw0}bWDJLemvsDG@;NL2H10vtS_2CDReJM2d zG1lF|q39A`pw<2$^}T}Av@3@Z1?NfXt{lEe+CV6KR$d`OJGQCVEDZP!QIB2+dw2q; zh}U_dmDs?0e;`)!<3tJ!wz|saGk^%%KtqOz#pd#BBM}le7NiL*3owSkdXul>c;c!^ zz+C1{<9@A{g&0N^|TnHf}OH{dOh|q^e(8Qc}9*R8T z>QH!TA4B2@A$tnf{^V~2A##mIh-SXNjd9}K@L4~2!fi8RSXNvQNF5IW6ata)Z zrJZ&>k0iSPhmv)&-0t?9<=dRYWfZ%qyNxVG7d!*5duucoy`>;{iPwMd*Q6Zc2n1KA z5hAWwFB1YgM%Sq?e=Wxzso(sbEWzkYj<-GE0Q9<-xf*jBf~j&qY!Gk3M>Ur*=t%?~ zkn~qj)8US&JRzRUWtB+p)h!>B;&SijCF5Q1wc8O0&)4rj7iQd>S8D`)941<&>@=fu z$HP09E`#BvqEk=7x!kO|O^YuVmx=EkN>Y%wjOL6Y!H&oHi+L2_e_shI$(hu|F=lxNDoRp;@0@>hGk(A*HVp zx2Zbqga5U-ft}L6R7!4o74?s3taI%BjW&V9psdFe9dYkb!5%O7YPSJRTiuaD2l^*{ z!8P|036|QcW5na-f~5j9S$dR~Y!#|GjKyRh740w}6}=Ku_{Y=3t#s^<_9Y!034mI- zRoSCztp**^_%9L;>hWS==j0$xH>G~Lrl@V~oP!V~G(YN8XoH}4&dD>qrc@7eQl{~S zqwS~^5_Nm{_8!qK=rr~-y#H?6_~K$T(|P|b5;VFz>@4-g5edd;;{;Akp-(?UjF|C$ zDTq)q`25QSLwaI7(eNcRl^-UDTfbH8GvmKuMXp(B-Nvl0UOuO74)XS^y*8|mk*rHM z4Cc~(PixgJzX-h!{58tT?p+g4hNxsljm6OJB)o_3O8=4Aw`;{uVOaufS2!i7Y|Tg< zmzR*gyADLNu6Bd$BGtX}o78ma2IUu=$kUA-KuIkC@*(f!bQy)(jU9;RD3WXcH-%ZR4L8sd z7w8^d0&^!En*fR%aCkm#qfU=BmVUq3#gxl%YlUVYsjZO71i$)y$>0uTQDqWSEsS}b zdADi<;RTx`0i7m8h4pKTJHw53s}4pDUZCt1b{z^vGV)(GYIg+WGI=bqfskz!4pin) z1PAXj851guMId2!R9A#dkY=zVpd?wUVU#8qIOgJ!rO04U6>N#29yJ+wgOd<$B5s2R9P7Ia&s{3bxhtQ&av`7{WAkGjEi^%Zq< zch^}dtKV<0qXg1Q2WDHm^E1AoejC49dp{!>vk~=OIkBFy0l+UJZnV)@o_{3To_%B3 zZpFk;RpX2)p&iE9wE78m00P!g-^l*c#rN@MwfZ~l+8s8fRd|$UgOM9}?X)>ARziR0 ziDnzPj0!`rH*CAs0fdCOomj@crWIA1<5=0lK57wL_uVpUPk}m^(}Zr;vyj=^XJCj} zUF7ij#hayAo(c(&`WmDjDhal(cP@6sMoF*OdsF7Pkdvs0T^tT&lgLUkXp$c?GK-Xp@NbeyO|yLR$#gfNMl++Yo~$=WnTpB7(P?#zC+)Yn{Cp z=sI%!dat!(U^HitmxhQ=BWDb*j2hPMkym=HZG}(9WqxuCeLtl3f`k|5KZCbp2GSY+V&`h7 z(X6*?2w(D|$|R_m&wmaKd9AcpucN%FLYd5e$fr?)LHqVkbsKliFins*KI+I0G()#E z=^}b8K(`UFi0fg2E1UU;2;?yU{aTbO&*^;9Ob8RpYGwGEB8K9SIDH1X*#A94c6Bm<$x|c#JC^U`T z%rSO5HFIJPZ8UV^8ON|jm@zv_8lu``Xrcd;Z%bkjsp8t}?%v6Il5Y{4OO*iaZ4L-3 z4pOOj-ftn11DM=V4506V*i~6qFT&NYcim$AYtR;56jy@sRi__}RodLQE z!OQT0tz?1yauNL0D-m0T^~*<--6{MCCq%630{-AwRZ@-%qCP4av^JKR zox0cuZM3>I7d!h1w5N>2QzH(uk8!1C(u!^3!fJ!T9C+P%iL{?=91R#EZ=;Kp?^*|m z>MttJBMqtvpupfF(9$qIfK&7OQ~~|{;k)j2ba|@uzgk5?6}q7E!b?iky^j{}QMU$= zCdqZhcBtNOpbyN%H!#!>&_r0(%cWeO1~d_Wb9?`tsD?1?YdbrJA)xl3G4tgk|H-*C zadd`3yODa>d*4^Q0eFiiQ7oXjyw$AV6lGb%Z8hs~L!IGCmC)OhCl`i0*L&>gDrkKr zTlYUwJO%o6ccjR>d29Z19B*iX`i~Y*A9KU#b=B+8m(3*JVXQcJcQ4ux7RO!T>HrbQ z4kH-Y7IqmbFYynFh3Fw==Wx7~1xt+vo{Ai;0poE`7;ulX?2)j`Ul!P-BH&bU(mj!8 zB23*|5hyD;<)F*b9Ez?)+b9-ukflAiwly3yy0^W)nKSLdF>Zs2CLYDYAO3Q}Z7>n( zDB>5SrD=}~vv)vf+!v|L;~?&XCvO~RBX8j6(pi$Z2KWGuwo)1IxTS>A9B(lZBPHhl z6#eRfm=bpQIh~&CXa&d3Xo~0kx#BjjwWKRufq6pd3L(UrsVapjlz&#y>#O5M$<$~D zR7Y5)&{*z5OhmKi4*!h8j4M*+wLWp>{5cH_(swAuxeQJzp~xN%i@$@_A@K}gCQ+^6 z>%P+6#u`S%Q)~)B%wzdPw?A+*2o#zi>V)6IS5LqyrEMmIM}yS|N)eH~cI{gMYU!%< zDi7T&uEb}~Qhi|qEp?Eb5xH&3|K3q$)mb}kUDuF%^d(Q9VxSSDoT%%>KqLulAVdG@ zH==IRF9>c|Z@ke&CQ;pDw;4Jd*{3F>(XSbZ(z~e1I6CK~%I3%!(-NlPlZhyOb3wXR zhJB#>mS^P`SIt0}73WCUyv+(0MSs`G@{&oN<@g;VEQe=$KXxsuqS1Ed9E@!{p%tEBjD3)V zk*7M<&gCA&eco1zkSEj3$;6YDXd+RH_e?}-ib?R&_;fPdRZBDD;$Me(mO+&alN38i z49<)z=PQjSYG;@*8L(lK5`vH){AcgVBii>1I||8|;FkCPqcWR^8-qKl%2Qs#T9@Nh z%}4mX*ayq0l$#!p+o2z@`P80_DHO4T@GdhEAZh?%3wbcHoDR`)2r%w;Chku4jpEzp z%`7utX{ww&xwO->e9}LB&ou>AB+6>{|8c>N8iA8Fl4`T~>G#qpZQM~K6HpSVWXd*# zIjHpp#j;8}+kBj3qzx=;jAWiHt2$HNK*5v-j!1p+Zgi4m6Zik3G*9tD>t~VdE+53H zN$uE;db7O%>}tPH1hUdPc~A>p>D0Z?6^!q$4Ut46Up9;`>ku6bai-O53yPK}%q*id z)R8>bLWcFqZoS!TG#mWC0-1-Qj>_|NK-CGhwfC0`VrV&#S<-zOlvQt+&;W25&iI>W zQQ(XwaIeKh^KB~CTsoDZ%q?a_rV%_*<9)#*@!Mns>hOnDK3p)^MT^tVKi=E0xYD?I zN|#V7OPGYQ3+rJqOBs`&b{MORveLsJ5E#y7l;J7$rr1QlmSQnIGm*rt@yHtuDl2)K zx22Afl{6i&I1(0zhOjG3MK7a;TovG=lKG-Nf&>r~-TwVrv5HZ2E{rZiT^Y%42Fp2Rq;<)ee4N8>pQl+5eL%yZ#5sOs75jRcvE zjO~0%+!Junn^%y9COd{?B}lYY6nH!S`lB|(;in2#$F2A>BUysV21)Uf{eNCO4noVS zzp7T9v}rsIG1~B&Sln4X4N;nNr4C~CAYP>zrpm)cg7u+}!3)(jKloheUb#)B|1h>pgL8FfU5@=~JGB#0-pox?vN zkt1^o*@#kSkpgjCwLytYtg}2V&rS!+lyNy5Ild9W=XjltPG3B)K1^+*sB!3-6+;Ri ze5VRAxcIW5?m|NEKkjIrFCGuAgIcg5k4oEU*o#~vv2aQ_lK7}(*XJ`PU8CmWH3kzE$dzDT0;{XQv-T1oG2YMW5!fKa^JIYQ5{t)w(KEn|1ag3%AjyY%bL4qF?IY z>D1w;-|6;r!{Mw8V7$V35^UO#O16k&ZBtkA=$4d`FWtnLrqpOxpY&CQlH=lUoA@JD zHDzHEzg{QlINtk{1&OnByIGhBi6-aSw2+|f(pDsR> zl)oC-moPLAeo5SMbU*;GXW2m>%I~j9()z=%eCbP-rxum&w<|i06K8xRsJ$l8`}HmO z@g7+R<`91k%%KZVRA11x;G>JXFJ1iCci-cAn>2O(6?FF*7St8fWi@7Ju)ESzOjj3> zoh@BsVO5PBqcK)_2~k*+YDtxM9^;U;1Z>@SghdH_$lLfSB-3{BQ@tjc*5cR0YuoE} zdu(;kWAfassxE9*%v-8uPP}Yi-6Tb$6t;A#ebl=^I)JwBeyzXL?ev>2-W5KP?(G_? zVlro+fpDEw`FhEaGS4yhX3%SE`0PArTN{!Wh9?Ned9xjB#pa&naTRdCC^2Xu1!t1R zfn=mk@N1dJntAFZUUhl0RbsQp4y&}Uf+uUQ;kJAWvMz2wZ3wcxoO#8uoN1J|V+q%4 zy%w*lg|n=!t*-1MLW~ZByh(UYJxH@avf7m-@{MDrN}}xV!T(Xb1@oXh7koX;xhzwN zX40qUz~eNpGuA@PV_0_iCy4`*Nd?FJKhi z{b+u{!M~91>AF3Fsfps`ps`QFvp*c1zWc^=HA?s!lEmVre{sgn|wDND^pb=>xGn-T{&|0nGflf;H?txMN~;1u13IVl{SRIY$mf19qI5 zB3=8+-EDm58A)cHCFiA6Rv?jPo+aT2C4ORNa`cP3@r;=Xic%koXwFQTh}l5#oSEh= zF5iL|$?Mcz){JiUht^3NWOx<=inM?g1ygxWkp4UZrV=lixxXP@NO|Pn2S)xIZ;=hAD}7$v#--tk^HjE35DY5yuk64h{to0^G2nO z&aGCj+mQkdGb`lp5!jeM;b^*mz65%3=oBxAVyXJ-uDlF+(zja8+fb6?asI=X6byM_ z=S2s^fgCO=KpVdN!_+=VJ z^AREH!iKUDbump@h`PXpECd;Ig$`rhEATkds>ItzSA!VSG5VBnnfz4A=WSaW9Dly~ zawD$cn&{dV`3Q?0v$JU%<|WN-foFwgO@87kx+wag zxr2FUuVSP!fOYic9f2pi=DN1?lIITTn)LJ8AsL|QRWQ%H0^-aep&{SUSdBi>%T4Lt za9P@e1{RqW1x{cy;aS4 z$A~dSi@pA!HGtCHozp1gRV&rNoU35qPrZ~f!qD-fN;@ zS-%O}));{p+Nk+w`+bC^8arJSF&OP~lzL_E9aIYZI*n{;%!UEVsH7i@(kcxCji>$FaC-?Y(ISwca@${{~Z%Q zwL?$Lv+w%|(P{88d=)3m)RRg_=aCH9z4|ICJR!kC19`6QfOVX8m_<>@1&_wzv z-1205wrHfJ)21YcQAxxvpwKXf4-`+;i6bk~PC9ZBYTjZfD5>Mv53a~S@v8-0enD!) z!EpGLyh8-wpv@@hvvvnM)VBF#P4Z3`!=R8$b!1=c2-}Nuo4re7WEg0RQsEjbJ0EP8 zJM?j=nco+h=E>!vDJW&%pOuR=UC$nXC>LQy`bzsd7geVAN&h?E@mxgjfT$M|wLif6 z4)ksJGSIH}v>`2LWAKBtJlOksxicG@lGK+Qb?IY>T22RpIO6rA$1#ZxAiejZQsII998E2~{2ItsQiPOK?D_ zpY83GmV3DBJ-u8s|7Y>+5XgwK-H(7}qi$Li3FPh=t&GQ(UhVK9ZS1^8E6yxyNp7gH ztB+n;(iWI5cgX?z>nz}n`m=D7=|(G$IRuT?{dM@;*N7$2tDk`54pko*Fg}48XomlbCqiCWuZu5e30;^t|b5+lC3LoyszxIIF`d9Z&>qL*EoLygg2ljt8U*j!{Q4 zlP#tDvS@-!joJU6rOMGjrS7%Sx`E1d!2BmR?fwUIGv!u^qWA9*;^@z~V3MmW2FTuul$H0-xt z>ay;gF1UtZJ0$%Y-pA!`yN%9*1iqx#FedJ&El@pk!R9lFHneXO@^nlgE^J0Z7ge7v?nn8Y>CirT5~{3ukHNO< zG%H#bC&41)IS~85P>9Lo*zo4@IYFWkhLZ{skx8$!G$C`s;E|5%2yr9g-tPwO-D2bW zEY*D!Di9Fm0-#JA)7+w*bk#H1tN}9O1;OSq7Ci>MImU^~e-q#?FYU`xZKVR80>O!h zApQRYh_ckHZ=qBBT<8;uV%o!*XG~UHEtl#Z>X=;Oh9F(cp3i|i%hFhQhPv4o*hAtu zsaFOd0j2S{>-aqOE&uVT#=tN@fT3{}SGuc>rp-k_5=yMoQH= z&=-<(qW^7}e_6>COp$8z)tz>?*3i6p1g9e-U4ZAdsWO|#^%li(?t5QV{DZucaj+ul z@~AjHXT4s|dYvm?g^yM_lKN3by@l8y-P6yFF%8W8oicM>n)Q!)7yo|Nx!lK1qzF-m z;JOQ|7cwpS!V8&TJUB4Kb*uFwjXc!spMW2hiAbYw8aGz&B`2#}U%RK#je_|wv^#1veXq|#i3 zX^KASwYAMkp7Om?qdV&e)Kg-`w6hLE5P^A0SqU%0@!8tEv(nup%YrllI8zEBXun$# z+SKB(mnQ50sxJN+13lcoUC@jxfew(}I;3PQ>A;AaR&KYnL!N5K;-8P%LI=MgC^s$s zaJk4X`5<)dCT-cLg38L!OmAR~3*(qr$JyFfplwL3?$a2;=>O>y$e=RDZqbD)oiMV?1 zQCPc4lQtVRr;+H{Geg*D)`O{Ym?-@Dm|RSIAla!?i851nfOQt_5(t4Q+*$7zt2Kx< z%xfsJR=ZjA8ida1V+z=(o=Wmn9KB0LsJeuL8`dMW@TVa~b^|Ta94y(`)U;TyFAE{! zh|je)dgw1pdg59zKX(CzA9fm3_GWsKvA%qOq{5J{cIxe613l`&#L|)QQ4ZfPNDQ3X zqfx`2fHO|>lCVaH5-+wKjp2n+tM2FrrHziJWYp7q#JS^oemZ)Xk2V>HrX4iO%{PXc zzuPZ2A8qQsK_`N|#I^2_|5WL`Csn^SZ@$TY3+R{d#1V7}OQPc>xa>1SGw>{E^U&XA zbfyurnDD{T%~8fx^3f%r%k9kvL>JUuu0d(Dy6s@J?y6O6qpCqOzjP{h{F(ZF8%-54v!Sf zI?clDO`sszqa4Rd-v9T-8#-OF&Io=||48B%Jc^M^@sc;FWFi2GHo6GS);dQ=2VW+z zBt~j+T%ONbfHbM3V7fY!X$=QIsv`Y9`rWwOXQCUcXEPH)7Aiw>7!QvB3ymXJpRHTm zOLFCV9}~xUHQaL^00O|Id-TpqA>P1LbjR5W;*W`IxA%gA+N@R%Y*mq!T|`u1j2RE4 z(QA_C#&O2!-;?5*D;*ZKY*+{i_UqzKv*V;5Ka})H0=lt))R9iV-%h=udv7j2gvHPT zM_)W3x5I9AUmg@3v+qb-t&#igK%1pbVDr&v8@){#^F+H_7l3a3jURLc)vD)*w>a_q zqGJ;goE*@->$-v_JP($yB#iB}1yQ#MMBa8K*(A~ER7;{S%He=xG|W(}?$HYBhs56i z`9YW{5Mjm;ID7ikvdaATuZ2A}FNvutbPm5lG~bf2n|qLfICUiLXF)5c)ed|6-f9Bb z#;wUfpZbZW4|B8C$VZueJ58AZtbBxDUlLx;IA6NI^?co~8TsbT4dG6xB(#hdkeZ;L zIXngVCj6tI%Ty5*bOcLPi6#{93{C6t^sgm5{)bcO{%uvjz*OFMAPwe~t!r`~_@f;9 zu`5@QiW2(a%HJOy9kxZ1Ycf|j-%JmLn_Iqa*2~TF@aTIv-NRe9CF(M~=1RSg3^X}W zzaT;eqSR(GzJM)|gQpLgxK>+mMn;X(pFI0vPwYEbR66s4Ms%`F-Cr*FbdY5FBg!6- zwgoNwFwAO7^t5Qf3PSzoQ!dnz0q0N3ot_KfXJo_r{oCE1G|0UQHJQ9=15aB3ft6wn z=Bc8>7!&0pYD_FMaR|B{>g(~S^ea3(Y-AGtv6ujWngU|SvE;#$${$;=8DN3fa~;;@gB~<1Zqm&)kw;B6b;LvcjH*GYUhBvO_G~ zq+ZFzVE;qTOv#W@7QfWuPi*JC*B5`Qnyh_!v;K-lUh(oUTRZgGxVuYpU-SJ;+1e+C z{mc6*>p^Hg0nA6KoMGGop}Chb(2qVQNT(CE7tV>`8?)gjOx|!B!qe-BLeT{fO^L4F#y z(Re;|28Bj_bD=uS!+H`&M@L^MzQdmsl7f2T$(`$*Dx)}4`oDx}kgK$iJTJkWagGAj zKe=&UQr(EN5c}5G2(=<5Odt^|8JTnVw+bfZ8Xht`wby}~QyG1Bf}EatG_zA9rk1Xj zd<&Ka8So&Y>S>8q!$UEyTB$l6b`QlxA!I7SbN5#ilvas0Gu6PSkB}Vlcftx!Ml6oB zfq$WR7q+1yauWljG&UJxOg#E$tIJp@Oj1K&{a`+5ftE&x4Sq-dD0k%J^IPwqNPW-yo!h7 zruPRuz;XuD(*5tn(E-z8*gQpkq{GihJr54lS@er_VH7XN_vuq=FE&sC=jk`XSMy&K z--{Wy8W02KlFI{SL_0$X!f2~82*|AyxEtNuE89DRJ2GBe93B>D?0({WZ1cErO3_wB z5l25E=EFFeujp?^42n{k*4+Mo^4Vmcf8|V`F3af${q_!(f3Wz{41i zB*un;l~|h{%owoQ1MJQ&uv^dl?!6K5N5mh0zACHLV&a5IrZ$#X(!_9eSsh`hv-Pn8B}b%7f$wHg9RM&#Z=TAt*i)wHqR>)SzJue>vGF`Y$3SPZD5B(v8(^y0wmA*_#4>yDzSV1{hYIg`W{oAB3^ka(ei>WDVH;78= zc09rBO6gDo z^&a&C?1RI~avO+=Bh10X$PeGIuA?(4T|`bZ-KD{Qw*=e0e2yrGK5nXBG9tzefWb}W zMr=8-q1%qz0S?@vy9LFW`3}J}5tNvtJwpdA4POr@^+j+1ugG*1G9Ee#ehJpG->zDnPX0$!uVS)9_Yys=5Z`Ap*v&h@AbTr55pb-)A9pk~4 z=i-4#aAT0hJkqS_iUx*v!}HOdF=CRJYo$Bxi2HZIx0gT^P9H@!trAM>$3u^VhojWw z5<-bBvK2da05nU5Du8zk!AmU$DLs)fd>C6wjwdiVg=!JWBmaN zTZecNZW7dvAaLKfu_GYIODv062cw2gAbyo347i!SCOFCgt0~OOLFz)aR5RhOoFg!C z@95TV-k|dz%MEH#Kxex%Sg6~eHiyj3(*J}+rN%)S37l_SKCJ41W*rj=1yJZ&!X-eY z#KOy{OM}Kv@-(G~c_cJxeRzKeBbPzxL(kk_dk2>1k&NsQsSqDcRQ7eKMl^dzHcxRU zP5*&(9-j5j6R1W<*UN!bUsz1)z(L3fU2C%gko^V?%ZXDLsxR z5hCi>-4U#$BI4#oGUaI$7Fp1Xc)XD2lM}>)QFb0xu{k>E#tXO{Bt_sVi^k_zlt zyh3{3*SN@MH(IS}t3<}I=UtFYU`{m`TktKhWCS+_kOLpB?}v#-o2qR%WOdO~{87Sz zzZr(Ar-zZsYZ9BmOL|sEcDkUXv3edL;csW=VyGdpV*&%{+|MV`Ax`^*{+2ZZ3~hic zg?AbZfuxdiCU>Tf1J}s{Dpc?@2$^Ut=-SiR=JHa3wudHqmw<+nAE{jBjUFL+LPLGZ7E^I0Ei>Bq_(zGKcT_#Cq6aWo#ZUK>T*#2&n^r zCTZK;n76;Atmv*hbe2TUj^U!0PwQbu2i5-^#x#F~#|oH00`UfS-WaLd&%N@HksFki zXDnSDTjGolF1Ca8R-nR0x_0L@;eZ7|oCew+!hB`gM*J7(;O^ zz>HMhHZTfarWGIC21oLIIzf-;mD$BQW=><#rqQNJYhvfdZZG;}FGXMuvs1Z+e!3S6 z8W5`CzMz(X$z!P z$QZ`WXR=lvVq}k+jkW9??z02!ZJ^othw1C-=8DDE3hj*q5GLF6EprCk=SfX5zifFz zo*DMt>dU1{h5V1EKAs2X3Logg4%F1aGRXKt-G|x9ktkrm8Zv{ef0UL}q?Q{=<)%`5 z3Hr+oZYVKSBz5I|Q9~)pAYT-IX5E}L>OycK(W+W%PkyISFIQj7iRN=%v`9iEOo!bd zpAI2b!Mx#=<>k&QXzPBud3*P$dU2zPHUZ7)^*BUr&Nt zvJ_9@v@+BBtkf|%&@q#i&nGPjfhrGqw$Gi&%^Od4f%~Bu(|vk!Iq57lDkLx_u<_U! z`IG(!sUZ44_qP_i^x(87uQmt1`ES)9?EIRv{^ZfWvx};s#IMuB8-e7?Qe8r|T7fhl zX_1<_p7zi(zT9-ns|GCCNDQ;hKUDK15Xdq#ZXP>zE6~hC3~qvej$0Qk5K0apmbI9+ zl=@huaU*UIgbzJ+dLc$h4a27vn<*q;!f!MqrfjzahkK6R^#7^{JFI zu***xvfq#G?lN-(jM0yoFEeAbxc$1*W_7m0CV}(GG@`KFBSoCNyS;bD-bL5RTf;y} zO1Iv4p29xpi+!c60#_p+8Pf^t(!)f%frlF`Dky2DB79MX8sQ-mH}ztFUZCd&2| zx-pSxQSEc}AhV?y%c^Z`l11pc0gMwEganG9AZj7~fcp0`fK>)ZP8~ZjM_q`f8m+dx zyJ&8I|0P#5FyP61f_K?yXT2mMOTmE!XY~1plcQRvbvU$tR{e(1j_q8iRTq~!Pcrfk z!N<_KxzRc|U2Wltpp1rfay?vtj*mjCITuFTZKwp$NBOY2rP*k9YY3QYONMf?&LMY$ zv^Bn!u^NT=b<9BDR4;0G8cib51Pe@dNm#sTj6BM%*G}5U)sL_aJnGMPT?PK-sbJ@h zc55}q{eT(4aB);h=lj0)ZAk(df?;EKj*XC8jvT(ZRVA%7YfH?^NBq6he5&p=WbIbu zLC8=KCQK!D1t2Gy2n0`bNIiutp^@|OuLuZAd(+4K-D;ip;(zWvxU14YkY19}IWXXM zT7OCqLUY0%7!=qu`rzCUY1^)ud>`yB5jH&OM69ld)K55Ml+M$L0G4%3jFF$AuAAEG zd-pm*)M2*Jk{ybukE#1oqNbL*WG+9E^n6A+XGQw--o5TwW%L<$d&YQH52{~+8qNct z+VsMWrcM+w4xK9WI=R>1eTm(31adt(QezGtvzGcuDRRO%DmbVXVXs$S;(I1 zFdV@@fiejUJaAk-x4iJ$m$>B}*9N>V@VRkU!Ey9xoi&}zeY`tgtCrzsj>uQ&0OyjG ziFS1n67YPL((0`xxLQ&5l=<~#%sL_Dff}D2cuc)5#VTUsiM?~5Rc}rSI^C!~p#tEe z>SytsQAil>KX4o?jj(#1f9(x)OqWl{4$qeZ^W6nAy8Qr(G~028LA_>aBB|?4)?Lri zZ|T|#)SF;;bdzHXI(Uc|n3@rAl)N;FVd5rcHV?3=7(&E#M5 z02Taip|bx^?Lcc+2_&rs>DzsjKwN-quF2*@GP{F2=g&H`w@p-FFxbYKOiM0^`htkS zLmVsX5fd5?$#>-};N=a-+N8BWwFO`q?j~DCVNb?f(i|gQ9uE1=(eF`31T@Id;?!IS zKb?wX6xd9U)rf!)9Rk8%CpY-wd;M?J4Yfw2$?cK{C-l~kP#)bS?PW#aB6oYsRCBvjuVunak4BHDN!?_tttBNcr(6@KU2TplMYt0c}ip4%vjOVAk^Ih z>ZWd-HRnt`zr$4JZq(aAilIaJZRd&MXDRw{;NOCCzA7e);akC)6HgIHQp*7 zogK)RK=j8%3}^#h!!Ltc0D zoFTiA{%IH14_0&+0auFgknbR2-D52>1n>-u3;y+qRQK;ci?$>@47?RR^5a{Msu4AMh;b9kx&yjR7$9a0319B*11FWUdE-7KE(`EBZ$IZ=jB(Ql1ww1fRr6np+EL&+sI?b{e1g}J zI~^m1$Pv@hi8go)8)dE-mcLOSeyx|?!OpN$P>frN;wIMVYsT^Faf>?Y#N{Yz;|5Q1 z&H;~ybKDqu>VRzej8Uj^%~;7<(70EVK``zWya5Noeb-@q^TSp#X_z!uAsg4QVnU~z zM#MzSS<;2KB*$8PK#__|zG}?OBgxN7y3X)~9B+4|QR8mUf#+I;15Oq=r>LTZmghhv zX4ny2dlL-l#-=hygo4Qt*k~B+rP)45y`_Dw+SI;N-6aWdOuwYywRZP`L{@c{Bu%vF_>oKjR6VlJ7B z)c29t-4djEV@syghXBr&Pgpm$3;2G|krM!p9D$B>X-%+VvX+V#OFP=Q1O+Lr*~$d{ zPdlf9(-apzl4l6O6SOcxhd{^zFXP@hhCVwIbsAxV$r71s*3nmF8oKBr$2?vwNlosy zj0pWGpo32;Co$X(o_gZOF+in>YLJOKWHnycRF_OOSB*N)k{l1g)Oj-{*i5+E{^8M_ zHozsj$TZd&55e48946QT`yV7zZVU%Un@bPcTvBS4x$*rNfD)|)l+J4eQIU5ss3jwT zT6NR(wW}#C;U16sXqCpqdpXaB1KV=kSSXDAUsX=T= zdo@PRrhaZ{+Lp9hr5dNzj^SPtnXV6U3?QiP+kYX!r4;0SuOjzvC&A1-dBtA)gt9CV1Wpb>GyyJzhE#$E-6|$p;UFL zQDeBpWr^<;%M1&Chb(}7lNYa@{Q9N)(kz~6D}Dx0hyg%?&nr1yAw7{X3PySw{Y;KA z$%HQeFswhCtK6-&ml7_jqYOotKL^kvt$Qui8Ikjjy`b0J^(Mk^16=Y+PK&0LZuE0} zmNW!j|EemcIg@UN@>sEaO|=~?+@`aGn#^XGaue|QWfI%G-1YwH;@K4<+flOBKcSYK zjg%^5Z#y%ipVA1o=b!DpqZZ#IgpceYIydphy4$Mqlk@|B@PPO(C~AX3yw9ztcIE;& zpxs+g17>MyK7O=P&78gIv|2I;QCPFw96wqb(e8kDS4+7U@DA_Tg(s=`>Tc44|Cz+w zI3+dYlmY9m=r}OWb=%0itR#%kc&xJb(MT_73uKd%uZkifZTo8rckA2K$q=r0;Rf-8 z<-y*qi02SFLd*E^ZxasQ!nNzcdv+c;b&o{y)r=qU`D&}vMdM-%+{NAj_7e$>3Q7My zPUdI@uwC3`;Fc;*)PJBYP=}LbvH$f-sa27`*l~tE4z`s{K5rKM(m|xMgvPcSmPNJs zpjrT`;|&@Hl|=~O=1jfPq_pUaH`2AosJkxXX~qCqY^xtur=tsVnz>0{17;fpdY*o3 zdo5=Do9cA{Po?`!+?4Ec#)hWSW6vlWxpyyi&Kg*m^O2X1-0xH%)^ka}rC#52$L#TB zb}V{6d3>(_|U5ree>g*?qIYY z!u_w)qAftX{XlmkGRpmFZHKG#trCiZ{r;$$oqA4e`#yCM#OvWPIxs&cb+G1zGiEy9 z2}?hgInT-R>1y7s{$Grzq>5x}D!GU$pkzFnTYsqCP8{|P zl=;kc$)c4{xYU-s4%=x5KA3B59k$JO`m@ii$&0h~#)4^O`+^_D`Muxxb^Vh>f4EcdH)-teh!I5}X|2BE+N# zEhQdJ2N9H7$vG(8)Bd9FpC>xaER=XL0fSym)?i-H9T!qlnYgxqCK_R3PB5KuT)Wlch(va4kSyzsDH0#pNl|imzFgErXu{UP(U7RIu zsL+QGMlzoazu$fl+`ANIym*f+O*|y}U%+wO@Ex9`o6{*|{98Z79b!$1D70CbzWw*JffM|ra zlsX3&bn6bDJ>^1X@irhxj|Tzk6<9tx1egHFpp=DR$U%Bztuc=YSh%|Sd4iI_CG*sE zFJlV3Z_ckGts+IDwr3LB4oLi~aA6t;7Q{4TIX$SjN3VWq%rSVj zTSIMOe2R9ohxPhtbqExb%Sg||!!69B@pJ`7l0G*c&j8+8*P+PSn4W)QTrR%d#)Wxa zl_J{Cp}DykN29{%w|s>PVMt`o*%ifAojcVp4)(A?5MyjX#+o!H3bbJwTrlQmZDTS` zWsRy4nksJ_jBGM-47&rq(9^Ju+|Ryg+k;IZ$=v61d!VU2D*nK14=%m%Jyfaf0jGSV z{8x8-uy4!2j_VHF!}6n$-zcKRr1xs8QRfGiUJw71OklxW5Us77E7HG**fqCOt~Xig z^9>||lcsGJVz?^5$ zOM~zMuf3B=KGmwyn=w|nT&n^ykwIq$e2f)78yQ^ zc^(0Jr*yX+9bB%XaZgzqLk&L27rRGoG~3x7x}2AFH1SIr`g2O3fxB(+69P zWl`LS*Qb+qxm6{18dW_w-;4$F4AYZ&W8Q=;q3$Oju!h>;T9PGhKz<- z)fWHIL#T0+bT;v_IurqD+!WB7dpxSC3n7JfyL5(Jg3@o)^09K_+i`@DT~+jU!S+Mw zIM91|k{m^qZfI^`GyPr>-z!>7xc|gB=PhQ-FSykm@XLNKVgx;vq=c|ZAC!bxuW!3w5+D24k-Taoi3-U%U1zWnErFa)BD>zsb z#QioPgA|w49iB&qcSp=I7IZ5`oK?0R06^0dV+u#c3YeY(j-qOZ44#^?!Y7x3t|ODV zJ7a}Txt_EwB%$e*Jc8I?Aj=FwV=Rj(!jhD6!|R7sjquJZ)JZ%K=ioi#!OQ3_n`@&>U!<73GH<}= z_o|yOP>W0Q*B>mMOT@4PE1~3WGNaJB@v}5Z<;;Oua_-JgG!_;nYDqnnSL>frZ*Y=B zG94Uq5K!GluEZwayu*T$Bh;&X6kTkJnsXZ@!$=3T3KL z;1kHQCf9Z>o6uEERlue~_?tFnTYGp&a(4EMiB6wrG$>k}qXxrY z)3Tirb5!B=e^M2&`vCpE#)9jjeqNccgH_yr$<;*c#qw4$;Qfl%qF}9*WiQXx;p##{ znJ^@RP9%IIPIPhKe73MufNog)g_e9%WDy4-HhzEy(#)Y=YYd<`5k8Sz$|)2dj{zi& z-+>i3r}fEgu9a#)XzR)=31XlV8s?{b-4%oE{TZ8g)v=5x+9okBbG zz`ED7!og%HI-xg~B8A8}pW$>|y8UR^S4PJ9Ebrn_U}G->0DoYa+6a+yT7)}#S&r&umR}?iprYmO!T}uBq4Ucp8ff)IJD^R7u&J}wSl!(ujjAA`6Y0%w zR4;E*XVe;(AkIk~&U-baeVi9!mRyT!`Y>$$uDXH2kVd}^Ag{7OZizwJm8X!~P!v5} z4qcnSs*X6z8ynE6l+NR6U)jmw>HCm6XhF@P+fA~Jv8s8s_b&g@C=JedaaOzf4{F9j zo8re^8s6snI-U0_*t)GBR5vm(;fyhWn*qz}PE~APZHsI7k$4C5&&m9dL8k8nRl!eH z*LPaodYLXfLW)_3u-@)ybIRwaJIWYrikLML4*`IVti1$<3#x7fPA&QiIy0J+3|m{f zCkX|}Qxb9j&t zdAW=S@muO0aQBqChyMwBBH4{lN7a-abe5z31f4^&3hC&+DJ25N>rQcavc;=MfMloJFv@WmExx-t-beeEV@^! zqushec<9J2^g=sE4#)2|I}|qz=or4 zuJT+p-L3Nos9KFFCOw%YQmHxaU3sszsNJ6M6TJk^ zCPzOqNQ?6QqRB(Eqoq!h`o1T{nKo~B_}DUf@|rUgo%w%e0W zrEQG6G+>e;6seLsvia@mWwL81At9V%Uy4HI>BN$|#wuBIu~|jlr6hL5QgCx=Fl zYZ0qi-uA4;4*L^?#asw=$?G2n2hPv7^?~-!LsR2ib`ds6DwQP@1@e*k#6wPzYNsy|8He(K znh#;0A_8Mnz5M7lOkW)0-06j8=vh)<4ZP*mi%g`;M_{KYnhW zUhSkFq#O}pge>OGzh=wFqTqAanpKERv>`8!IN0hQQ%%!3#5x~{-))mZ3I>u#BKwvY z#y7wBY*h;k0|mik+Fg;3q~5FU#-RrLK#2FZSL$VB9C`ICF?)5;-EI2?Vkwtz{_pBX zI;|B7IumxCEgoKS*Le_lO21!839ptR&LM?Btf}Qn3iod64fRU=(tDa^kgaEDaF63z z8jNv1sgQN-iOAj$gW;CE#WM#FCYW|}*_L}R0zUHC#z-A5qS8D%(pIz zfH($TMP}J%OB8&A_v*l@quGZ%m{d_`E=t4!Wo_%#KT%}T!Gwir%@!!%`~gi5GGb{@ zGM3~Jzn^KfFo~kkMOF6D_-_Dyt%HsT;pKqf*|Wx_wWC3x zz|5iw!P(<;)OlRrDjQrk??Jx4=R5>n9Ua~t z3)K3YHow93GH~}v`MwMio`?G!ZC;0CFe;byewHjz^>Otllv3v2K%Xsg^d~`E6fL@<#c69kxjyb-?ohA|Nh}Hby=R5{#7LF^je? z(j9nkzJM4#;tFIeiBo$*76r zpkOdH@gwSmj(Uw3yUL(A^SD0lIX~zr z92XUX9offKnS(TLG|7poBZ?Qc%`v)t8bjhY-%C$NdZ&a5kyxER#LrY*ZG}kr97-M} zh-CgTRjSo^_$V7vMvad;8O%3zzL~K|i)Fwn(zpbM&fX65kCce5e^htCl;Iu*mWuRW zV;}>K#Vi2`(IbS(i?!RZ^*8Dx9QTv}F>65Ixb)5*Rs?4_MFd}-%N*Y?o`MlPjib6L zsi8n)4`GQ0gI#L{zbiz32T}Tes~>Mld9&P0O7!uppm+j<3tUVg#{!l=ij$udMuEq< zmixGA7{mwLL}=tSQPDGr(}P^S#LdZc2vK_U@h`MpHXucWNe2}jRt506tT zBdF(iE8I0h{1mhklZ?qWg13+Dda6_a>&%CxQnk)4Wm4Cm{Ka_P_J-acbN?JAIAY`6zZ;B4CQoA@VgIQi0-%Dv`%C+2+vV&BW%d|LLf-Ei_G3K$4PCT?1I}#|%@=j_T`ZH#%iqRF)EnDKAh2D|+oVHGA3MU~qeweeBR=R% zw2ph>1!c63UFOMXm7{nmP^!1@nlt>on7J{}Y&WOXO1^l8wpVAH3c!# z`D9l_$3aBDUTG1H^j}3)``p@||z5pDiLCy6-L`U4Y8Q03E%zNUHuD)+Ug$Xm2LWB*%@1-t|3P>JSx+JLj{f5m$%ss3 zgM9;h{s=asMDChHfP>pVu~2Qbxm!5t17d`)zmH41j532K9!ZtvU%S0TFKX3-OxHy; z*;~xy-nxG*q#&SB9arb7ZMuz6q~HOU;g;qG(Qd)3&Mi)jzdo}bBM}{i%J(YX%5rbs zHf;F3dQW;uE$Z1iq#eqd?|_pR`!}e7$mnh{fG!ixCFm1KcTtEG&EWYj7lG*Bio4Yc z$TVZwxloArV{UflqO?{cComF5Tl(@vq!{`EqDhaS<12s}U0PDRL}<2Rne33T@z-hz zBp8*3u}f^u-yKh~7<4Q+Wp(-qU;;cfBD?4>sn_BaAhC^Q;q*z=a8j!7&6GL)l$$w+ zA>CMWRmhfQX!dPb{|!ambWYS}{wu5A5;_f0Z9Jx^Gi-{=xcu$9 zOn2MROc-TdU*uMyDKc|)=#y%>pQ1SI+BP3j3D$P#x|x|QO2Z(T^D;Y{ds|OWo=qXz zGuwRF)B}@l0NKXUR6IR6X(|d1QMn2V`2;CfE$KEXx-Hqu^W-&^hkNbcDkPAywMd!E z2(Rb}p3@lLlXl{rVJV8VRwJs}uF;b7W9mi?F_zUfB(Tq@n=~*oy0Vfpf1yx_ zT^^`BIJ|`YW%}<7F10{I`WckaV zizzJAScApHQU_f)*q81~0eRomV#L7h=n&pzX`*L>af4187q$kbQyUUzU^<4jH2)OWb@(p2y2)4#Y}E4E7)^X4oH0@tfS zM^G^9T|1?YIO}D}y4~eot$r+AZhV=U=_xz6%vtq&$my?1pO(Fouwx)4S`AEfVAGhi zaai}kg>%U9G$*~MS>fhfko z9KEwJQlf;v74ihyV~3>3HV#0)B@Tt7k#o?pKD|Dy3xElbiRq~84igmMbcW!7^o}g< zYwA9|IDRB)h5g=0lE#H)xIHk=!DF!O`t&E!&5qKu`d4a-xP)B4h>|p?meAU1@@aia z?YQzcySUBA)om~~XiYMFB2$F!?o!`y#L;R4o&ZSV+CFw^*ynKdI`K5@Qf?k ze`}d;qpBYCmqP;Q$+n1_!!t2PhPd#bY|AOC-}BF8rdC2B1kX8tvaO{a@)sq(nMGt$ zq>M=kCxp|;`w0qiq?hEZ`j7sBNJa8~h?ghZQf^cK*-%oAV$9(@S#HZ2^>BDwBwqk2Hcw6^?4|09 z{)!HoYym3ec(R?(vifa*HR33FQY}L%^^~XlT2NNJ#9AJ{N)gFh^!yAp$s0u`DZLEG%y$HL2sY&oM zlQm9h@$QLO#a@TW%bV%xtyOw+pQD;#QNZ!Tj=25 z8GbW(Ikst7jDw)&=Mt$@wKu6cMCt*gZK7BK zJ%4$o09~3^@)Bz5guL+3m+s<4(j0xo%~hHv`JvO4;7;a}R7p`vv3^|LN?f>D*99qa z2&%(B3!a4ArjB$^WTTnfhJYpQxtZ(@o}*qBP!_}HPpT=LP;wFF9*BauF&sZ{&s_|; z=P9*rc8U@a5U4_;9$G$s%>(87k^6y~3PC-tW|E6Z8BWS+U0NZ%F%ADftJN7(UwL1I zg}^*lnJcpXx9Sp3E|zFU41+9zOupIfAc$$Va)fj1y@z(elXTT-b9U!8%jyDl&SpvA*6mO0Q8dMwTW=37lZqvQ&VE^YDf&&dh^kPz zW?aURQ5wQGE0tr&+MAqI5f(MMRZcen`)=py>U;_6NRor=oGKA#nP4pErL1*z-JeBZMu1CC0G3_x^zE`(xSo zrRWMyAaJ$)71VpIfH90^1;3(b_;0vRhL;%6m{{q93T;y|n4FM&C_F-z9qdT%S2VR^ zE}``2MvGLlMwh##h_J$SHlCmmUm&c2PN#VOmZGKsq!P3#0EjlEbO{8WTxceS5T=IXnhh3BQKy9}m`$ zaq<+@^VKT@P=kkTQz$>E-hs`WBAQMl)K3wHVVll-s#b+hH*Gz`qjbe;km`j2A7KiC zGo6Eg$05r`AyocLL((;B&zKPjyk}Qg@;QW;Q|%OH3~ruzR8cvauL<|hC<*I_Z|L)u zn*^c!0diz^xP{GLJMU0C2-Zdw%!5-f*>+7EQ&2~r_+iw5Ht{3L+_Hd0+aL~mPoGD95G0s>{VZ2+ra~R!HU=Z|T_3d#m zCBR6nl14SQ&3km$GxIl3Cofxe-Db9#d%O5%o}AmsU1R8?oDY42znXcg2KUvaZ`BW} zA17 zH{l0vb-GR1NC3$WosHjPHUB`Vd~UIY=6eeGA@>Fk?Di2!VfnVuq)+8bA=pk;s{0FeBixvAH%>X_8hTDmT{Cu z?S8?BuED+UR#XffVn>~5_G?d7=b%ub@||_K1X7CrL6=FI+>n|=a*;A>2WWD0u~=@c zU`#VA1vMyQ)N=rDxpV9P;7UP_Qf>q_*d=a;5sqq-P&cxsxz|3~cu-x}RtDE`l~5DG zqm4Rua78jXr5E8Q97tI2Bch$LbK0By{*>Mja7C8hhJ=W_b=XL2j1^_z0@6Ng|V* z5{F8X3v!a{u7@3{={$FqLmek5pd(iJPwJg`oM4PEP-eN2|E4sl=j)V?Ja=OS@Q%7l zk@3jVPJ6}RP?R#CVS}ob_Cyt>3&x^a`;eMTqpF~}LsjjWfsv_afWk3;2O3>SNV4g= zf`-5j%#~d~*k&&T^}4Dq(Ctp#{Q5)Sct`8$A@_)Nz4E+_;^>aJa$V2lD(-2UXnrl0 zt4&NnYZs^Zf64LOQ_*zsIm<(77$TewXSmXvO_`h@;%5J;`bFGqUC00tMKK8)In_8< zh0N;3Dzx=f>6=F}{ax2?3%GsYgNr1Rb13C^#>J1A&Ls8Z?m*I7GI)p>|+_GGo zV;Cgav@Zt#LzOMLbBR-ZPn+RUOdF4=U&aP`IIuk-4&SX|1*5?+kg6?=9Nie>Daa#{ z;sTl^kJ263joW~VLTo#Y=QB~Zgo4#=L40~9KyGU%L=-5#X`2@9JY#M?TdgcM(5z^M z?6I5ZanLRB%!JMGD!K0nq}id!g+a^y67?x;p?qkzGLc9#@JcdKN#?tYlrNF$nd^6` zH&epP`Q&IrzdlG3azlsa;UA{q%EjU`k8)gwx>}3@CVjVNhViA+<@4%pAx0-S z^o`!w?mgtClA!g*$~Fl4oVvFkL4kD~s7~e_3W3xeesf^>Yjz=_%AJec;~AQa7_(#` z$Il6*U?LmcXD8&pEn;H&aV>Lofp=N(YB^!m9b(X-cVJ+owE(G}@42Hm2Nan4fz6i= zPNK!A0`p;Ysoy2wEH^D2a&LeYnY{5M+<;B>rv8M81t}VH#)D(8qq8l=;VIetZS#i2 z#T&7sy-R(zWt)^dW)8>Vb1$O(a4;gaArm$q>wh>SHHjYKbe^exO!y?G70}txZcuyU z+K~fzq%xPswG{ot(GjoE>ff7FvJ%TZCHrBYQzHLY&NFX87`Qo-`)#U@N4g@}z^tWV zJB;?#SJi0ySD0Ly^Jn4Rb-kVB`jMjYROQ-b4kSY+od&daWYcj17!8u@JNH}9ii+zy z84U4_z&w$@vP9?-k}^DEC5feGM5(sQiU^m?Y6J~ywMo)rBr(KgSBfLb&(ILVvsFJ5*l`pdB8^Kb&RIQ*aJ85 z`b(zi78yE2=DHFnyLD@itD7jp6Ybdm$xDOD*h(f=Q?}{r&pU(MSr6XU?(M-tT5kyN zG@K%@ZfhcOi%ujLXu|Ueq(SF1s}%JXTJqgV&OW}~0I{pz_yKhyUHuUIn6(oFy0Nd( zw8Ux3Y{95d>MG_&NrJeTE120ahBRu^UeC!cUYk&8B}^kj!1&Va5F2Fj$jAU5V&-^u zO*jce11xB}ZJ0#PXy*>wzg;G@`>#{j z(eA7cNtmk~;&e}q9IqxW5ph6aYg5F=F}`}cS^?st$s)W5a9n%1CC|XgQ^=a90e)i+ zx{ep%t!Kg8lSOa;#VkX4-DEPMvca%M8EN$c>h)Q4+w`<%_Z781=&9#1&Q9QX1Ds~Z zyX~a|U9^TlIxYNvw;XJ=E|gm6i*4G1TpcDC8mVduC0IB+K63m1YJb}Gut?8WlM9@} zU2yQBr`|8C<5(y8t>G#X-JCr6A|~lY3z`(=FlM*aq>>=Z6=+)Y8o>u&9<&s}+9kD2e89s%AWDvp8jp*6h6pUZplyb4mxTx&rEkt58ZPrz zWbBf0xeT?isAy?3WQ%X@&FV;tyKW}Pa4b=4ab!8Rojh5{8q1tj9wRZ( zZTCJp@if?lAgU}A+vwd}=R1R5VH18Y0w|viZDKis%Pw*Cezj7?+t5NaVG~&z32K%q z66Y5OD)qwFdAlm?TH~pG?n#P-iH$7b0#n?kO|}o+gQ0zTfy_j1 zLJH5WcJsxm#-&x5*8`n)2K8Z76nYHzy@gI~Ibn$l$vjS-117$2TvskStfW7oIwx-I zCW$dutB!+}Oet;8;Nnwi5alyu8c

qP?hI9tW>>K=hk6PTxq!0@40@oVG3Y;;BHv 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

VHL76Rq(U!gN;-^ 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

5Ws38(qhH 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 Z9X1S|RsMC-@z13r15-FdP2P6N{{w0M|9$`f literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/135737430.index b/.metadata/.plugins/org.eclipse.jdt.core/135737430.index new file mode 100644 index 0000000000000000000000000000000000000000..46cbc74d7eb00a59136ca035e2df566f164ea717 GIT binary patch literal 599019 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
vkH^=k$e|x7ga^Od41@o@hgKL*X`m z6w~=`uJx|BKum8qSG)C1zm)K8z`bg~tqyA1d6NpH=ul%7utaO`*}%kc zQ>Y;G;7{QqJ&Cq6$~XvGJ3-bVcfVZ*Wc%in;L6QW{tF@9?;yh!RakE*xr*roz&%}T zlItdt=Kr!j4&^h&dF7gYAY~A%UB_~c#uwZ+_LmPT&29tfBcEeh!idk?U2-8x@Z2?3 zhklmU{?Y&0#8_uTd30)xb8(JKs^!7I;!{QIq{K^!AsU!CY6tq~>MWoji(P_iXO}f8 zi&brAnEBeND7F6hCh3!CFUGl$j9XZguPDNNL(xsfpiD*qyJ^yoP8sm{?i6m$fdBR> zAuu+s5q|tTzpevF3tamsby}05E(lRc_dHbWh#m#0uD3iZ{&soOU>ksc6bp4%TYLgH z|L=xoP&#+Gf8RAn5717C6*r)@Bhb}%vwBTbzgAE8C@E@Ag?3fqn!i<(@8^Tl5sm=zu0P2z@gFdG&=mQiph#=&#&1V-LS*Z+jClj>mO0%9bsi zwZW;(Bg!48cuEh&3CB&puP@%}uD7dRcDY}s3hzMj4a`i*Uy^cUhGE+?yp(g zx=cq@Xo?((R!oE3;-S}P6bVrc8s16n>ltkqdpy~bD)VE_(08Nk>b67Hb)_TLupG9o zRT+K&pp(iOqH?xgFcdxda)rpHgr#$zzMlut6FJ@7u_)@tsu69fo~-~<)gYbc0eBMV zyk4mGqIwN&(G@brq!Z96HK*$u9osiLFz5r+$c~0G@%(E8d6DCU55K{o{S+ZY6;Y@v zzrl#A1N^O`&~2tCeVkHa99ZwNRIsvzoRdgd2ajPKGp zXb@Vl2`?`qdf7~DCr|Myk}O72z)JrQ?H?#7jFOUH`qQEV_ko{xgj3DI8Y9Ce59*;< zd8%yDma8yWB+?|lloh`SZ6cz0HnlIiqpOSwdcmqGq>Uesu|ZSidUuaI)V~ZBkb?MocUE6S-&H-A=k)yfhX^$ zoz@>EXj??m)fXXJJ4C=qa01mNJW%{q3B~yG<7&V>@cFx3+@m=EXG??}odP|LZY!g% zw%eSzpluhk|ma) zAkz4^Ojo$aoezEovWO`Q6_W5Hge3xz@+A&oZSzN*`%mWG42jZ=@2C+`XVG3F!x8VT zs^3=k2zW6ETZ>wiPI*67HS5Y=h334EK$D%>g?Li&#G2_zCLtGnHAfSkDw&@##}_@0 zKetsDhg`0U)@m?lqS5_7{KvIs=3X&S*C(Xz5{iT>cC7CDUv#+Wh+}n=#x38HW0gDz>~gLMjo?-G zINSA(VuO+^DGkRlcJM5Lw9i|^-wVX<9q!!U>AExY)bE!;@G3IcTgoOWm}c~@dczwO z$Zsc#j+Q#o@gwcqg-A9q9JG_y#jEN^2HLW8GU2%B|&PJ2o zze7Qfrog67UWcV39A@>+&P$H4vJGnHRHNy&1|V)2ButY!FYpt3w8g-Pfiw7Vvr|o> zfR|$m)FFHTeWCoh_*-Y7wj?2AXQ7;fr1Js#pV7KS3ONohB=uN3BQlD_7Yh z-tm14VGxRlI{~{_DvG}fE>;ijj7|tiEhGc8NsqR0R-_*l)#sZzh*?q4;WFhx$SA{ z8>QH>gR89i_vMSzN87YLQ`y>_Mf9&bRGd=P3|yo^xXLG#KBx{-z%qzvYt3FSvt>K1 z>0&I&zbc@LbxgT6J+SA_*Jd_VRH+hE~IVM_@`sV zknN|C%gp z;mp)AKovaI$fMt*c6;4E?g%H=A(I|1=&xyVus&Jv6j#-S0LKf6CD{@eV;^Xu$&1~l z;1>%G^VB%INleL@e-s0RW1QCJbbu5*9+oe1+&v( zk(b29)q^ouICgA#W+j5C5$Y0SPo8j)5?lBkw6Rm@dH?LvG9B_3Zax{ME{ZxowJMUR zSrXNU+LP-hHXLR9Rh!nkit|$RDYjYZnRZW7>Lp*q8jz&AOrD}a%e0!57e+}EkQD;& zOS8umk9_CwPP73j4KFJ@d1fD|2pxS#%=Jq?csw%a{k}PXtqc(C_RsH0EZG zRZoecO2NGSV0ycPxO==gq0z<5B|$9q_sE~Jqgud>$20(Me*rT6dzHQA;wnB@&T1>{ zA;01QzVR(A{39w4cjt7zu%VzM`f3{VjJeTc5Rujhi15A0{wehrwg^f_bZ6x+@ZRD6 ziHWMQb*G^KtoPz#U@HKYOT>%6;38JWFhk6@z?jIiQKg@EP z-R3S}^%*-ri62MLS6U-`T|uGzrKg-pcAv(8BQ=23S7_pM%XxVZwF!e8hDJ*!;ITKX zvNTuQn4@W+?c-aR|2FrbHk|F>U{$JYO*T!oC6gst^bDRxpNFxb>XlCvPjG@M3tJI! zDO1^{fUAQHjq5Z(kq;E%P(zzriE@0MD2HHDig5IzaBn>#FVEd#1VvsyDPNtZ6#QW}`ppH>bEU`gw^BMzN*0~4&G%daP z!vC%6U=2&+pM0y`eA0(Sp$0W;QRaV#GB<_vBfalgD*7F#dZIYr2UQ}qn)GuwCsuF8 z+BI>8PE3k&Y_&id-~g|&2cmJ@e_{JS<(3I2QZgO;q?44KS4q{BE>T?{ za$7GOOG#_1b5Jw9@yY1#UT|W7dLap26esrxCQJmve^~Tb)&=b2{lzm|46^DRE^7IU zPh3ssI~Pft>8bb8qqjI=38^omQ4vjqxOH=Z$Sc$4?QSu!QO}Ub3Mi7Y-TZ4sqL+94D7xlN;SEIa zYVukDVXI6R)_8uhL869u1@3ump$O4i(Ti_$l<3!L1MBXBk+z2U?w6NSN)>kp{;6d7 z9KqSdR*w`LNzs?fHVh`^uIu4JH@tX~1{Riw> z{eb!xMFBPCvV)RTe))XOh)y%7bm%zJFJuT*CQJo8R}p9K`AScFlGtS!uM_F;+O{+T z-NOdMXt)9EXogX*T*kg~T)Th`y#<~65(fl0Va-?l3}L?=wO7?@9NFm0G3X+zXcysy zfQ9liiBPWjK;cj>Xdy`8f*@v*mhw&Os_)6?{GxzBEZ{yAd?_9HvHH^~QGa_Gom@aUyn{z-sA(Fh`RI3ImOwy7$*B*@yW6tTnWv2ma0T6o>HF^9E+S>AUm&HqP70IfToOD59$S*wvXoIzua1iIhe_S41YRM48M zeOL!@Wn%6jtrHP`nl^QQ0h|)K$oO-9RpZ*xp#fcY@c~gc_4;7X+4hKGsyj1ORDLAk`LLADEtM=rbii-$t^OA zh$G`c+Xe>r_a7NPd{pC!#?>8ZRA+e`tPAD)D;r|zi9WdK$C-%34;}$OcewxX&^}ht zLGQxx!JZ=wJfQeL1AoRoaN@^j! zYhCeEQkF-YE@}wp#=icEkZL8MbX8emt?gyd<%a&Cgpnh|v8CM7M1C-DfbgdS$h(lO zuRVv4#z1vnfA@e{d5{0m7}|f}aQxTsp(An1tra3A+OOSMzn(>k1X5)FUnm|L zxpwrLL38u|{(Yj+lSR)!U37P`n|y;g2j7{__fdA=Bm48}#TlAMpet2e&3{nwH?${Y zPh;qM$q1giG3X(BBJ;_eYDDljgGoCIjU{~*tWe|5wV}VA`%A_-S9xpKz>%?|*N3`W zvr4X-&6e9?Sj4`P@N)MUz@h#F!2;`I(Kzeu;SWnhDE|PqTd%d@2=;m7n-(cgQ;2yk zOT|5?tVP(sZ`dmgQVZ6*XDALUM0Uq;I>MF;X__`nFC3f0J=25ms+V-`A&2XoV$L~q zvTSe?rxR4wQjg1ZK0+X3?$qR&<*OA20Att;9xowYC7OZX{D8XG((6hRj=awJ;Qpgz z7to8TNh8n07}#GYxw0o%E;i;n)MKwSHKuGCM%3JEuO)U^S|1!!H)>P3a%0BH&U6!j zlaBLEH3qWEH0V8D7j)elSxYirx;+Q_8EYxgeui|0=jeK{$R zyoPHAbtj}ACu-)`aU$h>`)&$(#)k$ZV6YKty==SoS6}Wrd{hu9zJhfSHeVRm@aCLj zTvGiX&Bk8rZH*#;)(Lv69lG^HSRsRlF#9+v2%e(c3In2GrcfP`_&-9ZUVX7|%h@t5x-ra~`6ksSltsf2FMje{_&clDx-Eux>9^1oF7%jIX3N&R3KgDDR~D(KI`IpoR-j- z&t|S^r)K=>I=SS5q@%a*9~xF>cw*=PzU>j>BAP|TVs0zV|By4Cdxs8R`dohe9(qC| zx`ylNWR_STPqCqYe7yg~!-FFS4j=T6J8?9#UzA46go18QOtCf+H)H--&Yu?Dgf*a* z5T+Xr_cM2Q;<};3`{E5-k_m6KU1!C6bM>)eW;!SSw>8`P5ytVCT4V5=>yOHjjh>Og z>%1%PC-(v7A6Q^`uNlL(*4)QB5||%M6rEHtx`pCzk;xfK77@NEQ_MExh{*LraYD`2VT$C~W>lCJZA`ed4%_WC9Kp0i%BT#H zUFH{cTPYrme{`Wp_asdkEg(us`Wr=Sh4t!)WiMs6hv=qTn}yuc4XW0%mbbsM>ZiiL z{;p_Gt`6ep+Wuj8QTx8sf{4nC&F)E(TKzQ#%^Bxp`=xB6N+qr-{&|g=TfqUGTFQIV z7We##!SSK~;oK48C{5gs?jIT)=8qU8ii~Z>y0FqoEfl<= zE_Xl=C84>UUBi`e)H+GNL6|B9x+0(#+O44kE)RQanp{?49-2o%b&e@)#}-J$3?0c5 zwG)(Rnq#;Dm7NCKLcC{RKv$F!7I%=$G@pH{Sfd_4RYfIv@Rp)|2+xGG>BM?XaijHA zQsGuelk%rKi(aJ#ZM3Feb!fg})3luq40NA&(|j{N0qn3`x=tAK16e(G1sRstaqa;$ z8W@~?zD|Cgq~>P(a(FY9EV!rWAc5sa-atqcQy3^?w1_$T{-OiB%YS{l@lZ{(@NO6AVaZF zE~X>JdeFl9SAyYCgP^IwxO%kLX1P?@U+4BjW?IBE()I7&jpAp3!URGLTu#Tx_$<3kBCq?qqP0D8qinXZ{S>{2tp%brM;XTXdxw_*GlRIq>Zg>ACov2(;2*q$ z7Hc%81~0~cf3TY3!N0!81x*|b1yaX$bviOwyW7V89HgsIUH<(VSj*0ofI=#^b~5c6 zs4SLVW89jY%kZnxxwUlFY*$G-R8;Hdy55Q*`v70c(X3EXs|N$8NI*5ffFzU1)g{_& zX49&|{q+^EaTXB}=@G6}5j#YY1&nE5#t*j z#~RdICsm4`_OCf0&s6*fRUft)K>D1`52k`65_v_~o^wVPxQZoBPlBK@rR4MTf*<^A zZTy{xue1_B`7y92Rq8BPrdA7vzGW68OQ2OpN}7a3=^m=7PGpu1k&{(R$W67DkX1v- z&!>iv9aLNL(BpNmT~kNkTE~2h!g|xfRlP9m_hBzQ_LHJf8ZYbi9URMOK8-m_ zRwtvDvXzihW&`de$M^2^IHdGFx?<(;twVa&asxdW3WtYAa`2~K@V}}?A_q)IWT&B^ znnrSVym)Yeb$`E#vc|XakCGlp7SF^<67DvkdDQ*Ih6Hv9-lv^a)s~;XN94AjfM$Ag z2ddsn=(@W9+J561?njiB!K~qI<`clCxuNAEYr8vD`GkYqZ&kB^ROAo%R%y8C%NbNXWVCvIx|1z%laV`Cl5*&=|~qPBIx2 z1=6yn93}zhz&VkkeQPNXUh>G zTdJ5`bF@7LC4@JZw zDchjH6j={V>mp#BwAP~>RFi*U0@b12uUPt0paYP`a8?k;w$iu+ZejO??7 zYFj^4MiTiYMA|e+(XU!BqARPwm(+{|;C@wCk#Tr@`Mk212M_yU(SdKrr+_^o$dpX3 zBrc!BpD?+y{mjc(RgJ(&<HIyM|H(#KF^~EEH4-SGE;^%*g+iVQdw~CEZ)Fd=buB*5C=DRe`k2LDQ zi?Of$a|B*WJqM|63Q^l+!PNWvt((p5-)$<`e2H9K@KC*fWJl^9nO-_EHn@+#7VF@p z{d*@cxA)ae?X?@?cA*xck7#>wqlU*vAYmYMpIWAt@8nEUpEvY{hhDA0Y7nqfzTpVO!8m zWXn@2D2pNBY$Fkn&7h^TVh6;n-LBWiyT-7M#{L{T+hiONZJJ&FE`G<&E5Z4KR63nI zAE7F0K+Se?4}Ikt=hhg=T4~(^#ZFm|ysCnVwpN0H0w@Dcf#A~fd0;n4_{(UQ_*|+p z=bT^=x>je%A3KVFur3&aO{fr}V=8ilp8|fi7Xa>3ze?oWgzN!D`KbRu!W~l3y}(X?77nH$V9_Dm~z5 zspH$$xG^oie?AY=zO&dVFS?EyJX(YAb=#*|5^vvG$A{G65n^p}NVWEb7*dJt%MzzL zDrwC&f;X|l`urHRQn)rL@qaG50i&sP8mB`S4#FRY!8F#>5j|r^YA)*P`m8d;8CegL z=7lr`>>TdjI~ewT=P9~$>1I38WVzK%u-Wr`D~+KX(ppEjJqAhh2lC6Sx+ir_Q~{}V zH)0droM2r%{knrgIbH^_EbFpR)h+GR`3#9Dn}N=wHG?6+IZ6wQUXjUh2^qOo6RdS9 z1DPXpa;UgaWPcDyD*oZ4w?%WHaAkxn;WJt!ipdhoVWVGLq5_gZ6#}A*c4ADH;rx0C zH{_O)@1bG9mmT|`N;4u+_yh&Y4cuM&FQNDv$E}~~GDR#*eu@enS;k)pNF1psdR1G= z3x7cDj@(n(L{QMb>uD4r@MM>(qavyi<+QC$^Lu8it-t+oy9=$|A+Mo%!7KueUT+DR zU7a|W-s7{=m=A}dbtd0N2NQ#);D?}EtnPa1Ng0HcZrc)$?-4Bt<&6NK*rn|B%D--F z?W&y8P7+TdZM*JWflM?(2jo(az@~2hRRcyI+8_*i3|m41f&+h~*p_TqFky%yt=KmK z`gHH`=)MS4ty#s}f!*b0XpC$J&=HE_D61L*s{!B(>YUzvdFwyKnP@ z*A~-b;4t=g@8&nje@)${LWE!!Gp_g%zKvB-r+r`jef9LyJ){EvFt=* z9|e*6BZ@26A!useTr%3?stNlUHrNTSMAfUBzK->(YO@@`(3Itr3ercuErZC)hW3#a z?oC*#ARDu02YE+M0HAkHKDX99^oU6XH|A@vpcZQU#r%-4ydZXuI|5<@e!>#`3s^B$ zq}iEkl*cI7A4XEgaL$M1DRrRC6RfNU{?2UsF>F`RH%-P=XVp_9<7-2Bttw)cHh$U5 zN`f?u<8YXocNCjlX?NZ68Rm1S@gIA=uju7Wj^YdsVsI!esXmrr1I8SYQqYe8()9)gdBr>&h_Tr_0U_>eTl z9TG_($fg#%4dIFW{BF9Q3Yfq@K3jC#9!@H1o$yH6*Zs{hz>(7a3UDYkk^b2gkZ3=0 zb$78Wj4$`!Yi$N&2{>ORQmMI>Ksyoj7ZRp$qcU&m7mIJx0Sv-8da!@uAb1gjv~FCl9}o2AYMvSvqU@l`QiyJ=@o@T zj~*I4d~j5pdkJu_H1~?VekKiNlO0tGgf-?8z4BnS@ca9Nx5zU>sS9gRD$V|)Blr?6VwA01mc?IN70N1f<%&hQes=mc##+!(0ZG^;Wl<{+xP;*QsuKTB zdr@)R%`S-TH%Oqe-+IQX>JU~jc4Y5xQ!Q1!s4j9~VqJTcje)F9H#KW}-i%DipM@(M zpOs<#BskChO|cEXFa@OjVPYI$-6_0uC`Ft0PEO}EjjAKV*^*FalIM-NQ91v7UC}{i z-iKRs{UZfd^I%6}%ATs8cByNXn_Ido$HtWfT$d@0#@wYBZ7a?@u`o@C5{tg%G5RkL z6;DJ)lv(+Z5m@`m-S67NLp!MGd0E?KMIT>V{ns99iI0=E{AKru!(lJZpPk2>n_cOj zn`?TRl;xLE#BgC15%&`Amq9__x8>!S+ptScAAYxN{AGXRN?;)~Okj~Axr+xqcDCqC z2sEFr7pr|W<3zx*g{y9{u--l>?qA%^0Lz}*kNPxy+`xwW$`;?FE zu402-%Y*oG`XyGFjE&ri!yi$lZ%@!qkCtniH1I0*#vjkkHvG+91hp38(sxM-ewU{+ zZp!VFd@*Cxpsu)koQK=^GZYwc3A~2+ec*oeefnlxQ|bw5OPDhjA_S$}X(v5}?>iAuHL$4(d9Ag#p(=3>l@ zM-fLH3!p{nvx9$3=IR7`Aw?BGp=Ik((Z`uJ&FRqdHT`mBfnE-Yd^GEK9nFe-X=0Ub z{0TKcrRjkhpNdAO7M7;ROFzVKS_j>AQBq%P4aoqV?%5M;JSC)2X)JgDSoX;+GeRkz zv?thw9xqFzJ}{fXR)7iRZ>hX_g zFL_(>6q99sE@FFhNxfuH3KHR56e4l`^38f8{}yi(GJ|*y9DfVj4 z%%a-{IHrvZU7C`fnVI&s_ZFQrf$$BtGZN(%9hvozPw=g)1hdFxhFmj@X;Z`Aub=b~ zrE1gDyDs-t_Yw+w5fwn2Szev@S@XXTff6rHK=rzo4%EU)R(4(-Reji`*YIZ2SqqD2 z)UwjVIxbbotxDvS!tw|q%;ix~bWZF}`>;UJN1rO+MPG3qw%mz@d23#C=iuqIZ)vZV zmAV5aeKmI`-7#-~Pog6lR~DPiK57W#+mz-7lcjUFIK8_AYo8 zd#VewZMV1fgJLt(>8}YVepx!#4a}REry2BY5W(%mhRGGw$|>ZkPw0OXy^}FaYzWK3 zAAOSmX6mBgM&*MAoaNpJDOymt74-UvKv3n=K9ESY5#hXxpb(Z_3cvqKLY?y?Wy?3-dV`*q# z9lHHTNIThNst2t-bsfDnW6qceJ2)Sfm|YwudgPto;UD_JbrY_EiFT5uUS90fbgIdy zi!;8DV21=S7dTXGj106zh#2ghLFzIu!$$V^D38`f@5=#8liMT3rXaV&@j&tW!D2g6 zLTw>n$>~qhRM^p+N_p3Q?nAzRuU(YAC&>tPSiOW%tg5=C)yL#?q#{k$L}tVt*=RcZ zC+YfRKYp>;SZNGjN`v5dKV9Va6#Zb@2GVM4tmf-U#mmqzIH7CCB7n}GlXt*4<({791yVPETxL}jW7>%=>xb(R^ErzF;H@)O)XTNTmjbZf;~~MnS^PH0P@F#c^?bJg|IAB5 z3n?6q7|szG3-SkTq)nfkA~%5wGg){iNcb7z10$&r!rQqbplc!gd^!J-mu+F);(vbhq0ZUR{%Qk_OA$~^2N)$2lV+YTGQQ_g%C$)29R~B0;pUOw1 zU*T6FP6Rip`8vMEw`rTYsPbMPOa~zWq3(BEF-NxZPVaY(R}us30VR@Eg_^TsMI(`9 z&}$!I_wqDG(^|`^I%|VU2uvkO3#VvOoT`|QkR+bfGOm^Ug9nOD$CRuL#kj}k{vd@2 zz|w~zyzA{SCCk=#Tq;N|^|1z(fI6np-jKlWF%Jk;s87sK%S1}iZM zkX_H=!yf)$ZlI^;dFXG1aD;|TZDDe4XH@bq{rAa;pI#YtW;pSWnz`MK zW0HW@HefV!^vd!&VjB{#cl-87c+AMc{B_6Konn*T;g2jI%N}076ha3mex+5C$u-?J zZ{<>+KkxJAWD%;93!#?8b($Si>LC}xl!~#BvtZ2E6f#T3uI0=|(l*4%W~p1 zujMtQ%jI7r;^OVnnre`Hh=ybz78x1SBwgVrJz^6ycYZ$P0nD-GTMz>BaQjpAUC~DW z1lKnrwBxo$eg9jgaq5QsZ2D$|+z%(3b^Lo_ZXf#y(%jc1Ex#i7PH2(vwAnj}}{{2W!Iwv|MF9mgi<>>@mq< zbosVVTdjq^1ykokk-u-!(WJi32&%@+E$Ifog9}LrCr@xpKi^V36XZIf;3+Qv8btSu zE;83@8Xd-x9xOI#0~xlO?pPkF8u4w=a{WhL^VuDQb!AE>j@H_rXICm69)}`NwYzOk zt*`GjlyO7@?RanaOH_07-ZXXIB)7#)mm+}v z{$0u=``40&%GB?LtPZB(;)Fo0xRrkQ}BWCl`qV1-09JVzaCPmnqLDs?Oo6M5L($hUGlF@qqQyKb3X zCR1mvoeik79~bnU*k#DB@Hkmz8Kh4#Z7T-U_7zlm8Olforigo}ShrxtxYXb7vc0TH zG|V?A2D$8m9twBJNAyX|1Qv4aOc-Ncj2?6al_H*{V^W$(v4UiSh8!HD!ly4``xX>a zYZ5B+!V+L-`1jke1&_}jTj4-M52^iPv`EXbsIU%vK?GC8pf%?~a_7$Cyc>y2j4sg! zRSjnAdT}F}WFUvWXBr;vVQC+ogRFL{XVCCEEwz&;HV`zKJtMyc#15VZR-jF{-v zO_s^=#e#Fv2#v!Iyiunyb=>AtAKEg=HxAG$RRMK!?ufwU>!|235y}4TDfV~*=`;+r z*^w`Ke8C&+P+koAD%wfrAXU<^y+Hf%0T$=ZczlQj#vK?YCl*)ERNe)bzuq2-$X~qH za4TBf{1c!fpNbmUB zt%o6hvfU2#My<^8qGgMoZ93s>x5hRRxL3$8UXBBcX3DgQxpi_xvPbv&am8As4`u3d zV*i!UNEq(B+mJ{nTMUdR2z+wH#)Lot#0g4WkUD9po_=z+d!Cl*TRHbU@K@IAOTQM=lJDOl%>kza;m4vhd-fi+*?DMAA@Xg}C? zHN?1C?Uj8Mq7Ltyn38pO%@pW5v2ZJYtIkI||i%r!cBOu<%5=2zZFd}8Pr23j!i!@4eI76gg&5!~%h&?N^JRu+;rQM{wH z%Ch1S4d}IUGv#JEYs2N8{j`lWhn4vkunn7}BHZ=z672uVpt|1mVL!pHhKR8gQC?wJ zpKjZ%s7M_3uvhhk?9AH@70K-4sxWm4#>uK!Hq+h(!>YVS0Fa7MPm!s6sCXFCZ=LDH3@b?{ zCC9>l+d)5>;|q)7ziIhntJRS%@+}maR47zM#}r)U=9DG>7xJJym6QaF#U?+zG&7TA zf##K|o?w~ujnfxIR%OqQEzRC4Pee5P`PSXz(_!RxsdC4xw%h(B_Djul37(Lr+{>8| zJD8L`Y%GSN|ju=%3c4#@w zzObmZ+zs%9v4*wen>gJOfC#849&nXI_TSb9!aaDJ41Cc={^~oKhAwwD;J$teU44b9X(!7|FkjF5SJ`Pi=kgC0)s;US0IYTv6S!6KgzkOPSt8 zs6>1O!~F@Nm19r7sbr;C+HpUo7G2nwOsu$aEK%T84rFG^z{#a*CD5Vf$iC=&w*nNw z9Mwm|kmm6lrp+qUx(&jLW$0}ooY>3D){+{c^1hrj^}@7{SR4|LD^I!<^O^5H_Q#mk zNEgSfKwa)s7}SI<%WiIloUgP0JoQsW>Vt!&B3#Z$nQGo5`YqX1(7$S4kCJ zrHq04j-@R~;wxbx0jW3^pHSS;DlGKlgT)s2O|y4X+JE1x*#SYLUhQsNZpExnJ`ru@ z(+;og$q^intIz>8oYDCzxDB_}7>&dUm@%Uyh&ef^DrsI2+9gCJ+Y#-OqYXi$37lY0 z$ub1HkN{fFO~@4b5#*vC@pC5u;CZKaw=O=Y?y9x}Y8H;!LI?W62+ZpJGy>-4`d8)QNKRdv%CE^?#p`@7wM>MMk>-^6C@GmCosz~Gio(n zUhmh5cqg84K8C;f%uD=0%nsk|p<_Q*v^cna~tZE&aa?r8py)|V?7X3s5{GJ7}cabwP$xN#w( z`kybhI9!6A95Oa-Mg!0+IcEh=sV%bFp;CbNQl$=bMeE14ucdwM0!GGP(lr?gI{pS) zo^hAN8I;#MlBSNE9bPV5ad3WWj;<_{w(JY8cjRrq;>n4b#&8n0NETF;tNtz{MyIio zh+TvMY=Dh7p;%YshPBd5q-G55BadS{;lW6nq}GIC9ff?AtCU0=tN9oKaCEULB7KV; zsRPNECGOa$NXpA>0CdtM=dT%)|jo!lLP8)w%v2E79U zlihWp)Tw2uxt&a7J7~^brPq` zUsImY@xxV*>P+8xUK{CR84^e4X9*7JRS{GMkY#js%}&HCOcC|aHL1Q&?g{-KX!T5u zx9Ja4EMJDXZwsfnmGitD|Mb;(JDT(UZHB)7k|+x)@`ivmO0YfKafCj?eiss(J&0R4 zlG3-Q2tO-r``g6n|1&tNz{|wQZUSa)Piwmv(f1sJK=skxLqHl2Axy7Bfb9%ZbAsSP zZJ?V;o;gf9gcNJdL9Qi>G>n7kg-D<6KKh)?Ecg2|#)0S~i!KHr2L*|jvHFx0C z7totdbtI{s2#p(Sgjly|8k5%|seDCofy1ULW*g|PU{d}0XNsNvvjs`(A1_RQv=VOp z3Hzk=0G<(v%~ECg5R|mrS{(Ao-F0Fw!r~^$2Sp$?kp!*~^WhoDndib2 znxFb{6x#n_`r+RcUoZZ)_(t)M2J4g5fvITca^o4O&X1yeGAdN!*wN@a+s?;4Sy)*< z1>y}FCN|Pz{SZ3uo?=JP0P(lhUHmkdk630Yfc%obOnZ+dxBlu0>4}3aE|^H_>51Yb z{>T}({`6_-r^;8f{_UxDuS;dIuK0p&>4?udI$QLfaG)ccQ?ct?6Om3Fr~an(flo|- zG-tN{@uIX6g*03L_EW`^d}Nh|YW>E~78f8Dvq}(c<$7pSQiE~CSGK*0>35;21ID88 z$qv$Q2VD<7yU@{ltswD>mu6kIHaw7;W3E1fBM$hsTo^h4?A>Ftu9i= z9T1fUa&1t&!2>8Q@<=7g3R(jZHTi?toA602*FH|*G1*VL11qYp*l{Uy3Q|B7EOR?-mThYxXaQ!rLNsEA z-HuouSD+hqdtHH3*8-uDPbA7L)pxs7=S1UbXXUFG5}}U^mDAfr!SxKODidJ9qCOUh z=3HfBCJykwvi-`-sTn;AfrO{Wp*so=YRD9Ez(cVasMTAz`YfKH#gtxE}){znh zrUxvn1kmT9lJ0#r;0Ce@S8TPQvVT@Ra9iMGBbs}8+a$m_#Zs%-xwOECfB{8miEO$0 zEl3Ojhj6i|spWnGTgj!)0k}9F(fUB(sH(lUg9!hkaOn$+W(z6!KPfh^EQBlNyR?wR z(m{RMgt)7Aevx67S@eV;|1|G%@4`u%Fa%Cf$97Pbs-I?}VnyPE6w-*C)`!Fg@<<~h z8Vs83bgtfEJ3KGh*nWntZVWzCMF~-1&Re#c46vucr&2f1G?Meu;`t6K24ZFe4xU2^ ziSTYGbn{{C(ocf057d|KJEHf3b3BZB{iEXlB}n~r}7J)Mvw4Orl<1DI&d zH7CmujuP)NHL=f82g)Mc%3eWNIb+RnWtE*^z9RN=1VLEHjZ);Hsgf$knp5N+IPj1Km$t8E{GkDLlnHBBzRM zG>Xl^XJyPMoyR2#l7Zg$xSdobCeeX}WQWWx4F#oLeU|>rCr^x~fL)lH?<2zG00eOk zSt~TLmvce9*nX$t6QvKFgy&U+HRvIbB!e9kAtz7V%+SEB0Mtly0}#!_3qlg4V=`nF z$VHHxHh)Dqnt{NzNUU4Nc*=UKE@3B3CgdBkwT=T7Md2s0K}#pK6tx%y&;+;D-_U39 zYQMLr<{>$WCJN8VmFT8Bd!tNYEn-U*Z0vMY?bp#|?e?rOO75Xbo` z-o1K_h(hK-ghUP!#`-4PSgTjkX2A0{ZAQy@qL&fk@j@aCA5lq>#hNUm5M|+gUe#1F z6^LI9drae*$rH)ibJJI1*Yu@anVgFcIqJaIg*|3ypyd7)AiUIfCa$DK9}?>+g^ala z3@~YSO3)5x|3S}CsJ|?Ti;%^=%s2nfz*<<<$_$j5gV(rAeN$4A(hwNC^AePzVV)t* zSSBrS!dXc|Cnkt6@hr7|RM3TdI)ssF00TBGkN%UV>-QmgBP*2EY?9IXw2yk@1*mc! z_=QO=zg&E1#qSU9GcvEVb;R9pEEm;T{46?)a17Se+M+ljjnY;m1SY3xv(KOiCL*hf zDkST1vgWSP51PU>C-oqEb#jU-5OL=Hr11H-?G*)%O5v3*;fZ*qWG2gM!^gf@Y&E-= zUyRiXE!|g~;L3VkBS@>*n?N9G88Qq-oLKy9g;29+J6(P23Da-Qu#{20#X_&dgj#fW zP~9_5Z(Q~Glc(#Yb-*CcPyz`G*MM<9EMpbeR+L=&EOeTiz!XG#&6iVnSw|BHOCVrF zD*f|qf2!CzWr_h9ad?6M?>ZC8e-c(@0nmcBwVlMzX4@H>+5AF`r>pFRe7N|sl>JsBZOhj^Z5>UcjzjdUAPX^w=>%u#x?{$6{W`TAEi{Q@6Y(LhI_G zWj1-RpsV*3d10GvXXn*k+{EN;*+WJ0C+g)JoHQ1YQ*d#Q7y!>{dr=B)gkve_f~EUI z>0<)YRMF@l{8|OGT*O|5-#As{``9*^C1I2} z>2}N1^IFg+L&u(*UYf>3Uli6Asyd}iNH)KG zAir7cFyEMrno)L-y)1!+wd`=k9*Q{OggSSmWU+}v$4I3RntGqoV`?7l?GU8*ZN&DSau{i6}h|1f=fd4L0U#)586h&&q7c^*Y%w6@q7unyrzOD)RLAr~>EU zo1z=OIMtZv%aZnDSs};0bm}$|@1SXK>{wYQ=F9xbH)L3T1+o zk7N;!!HyK|xxN2j)Mu6m%5JDGvXLMOT?rX$_JwJ2Fj)<_9f;k{Z;E_(E`(>8g=1SFEPs4-mQcVoslC%@pO`4ucpCn7dE)H7I&;La* zgoJ}t??3F{lBhhO2QrGZ-4+B|@Rqy2`xtu6@~#FWPHzydpJvuEDSq080aC6V$u?3n zLV3KJQWFbD_EWh}VYDN*k`M|jC+1g1kva+BM(7m`U}T$7vdK!&_0b?q>1Lt@>>V&E z`}5UZowzzPxb~wMB+0u1Rh(rrIeTVZa5V& z=D2C%gZ0+gmm^QVO(^REbhQ8(>vTT=$^9z?(4?G$pdEdL1Q7&EmY+#j^XH5*7w@mL z@|7L-9Y+gP;Ttu0K}5vH$psiA?PeHy-VPsB5JDFJPJbZz14$pSsAeR+vZpE0Eh4z* zoS~qwm17Y>QywX9AL%+5cIooqyUJt)-YSB8Lv5k_l7-S@ayBZU147*>=;b^)y&pR~ zx=pl`YPi1Gh`~&(-ZEEV`MPngklrWTA*TBm^ z#c`bDP8fWFB8RV0=0LS?Gk#nzMSZQk+2`4^8~V7zLHb~SDfR>zzURr$H|C5o+zS&k-&f(cuOvKNW|_ePG)qsBZRC(-mjL$_cb6tg zd$CB&z)dt{H_C$d>4Tz!XyufZrsO(!@9q}=Z&MA|P7R4SB#@+rZ)m zC#U?~m7r^0lWONCY9MW2Lex~3@!A}>5Y;gD9G&IN6dk^RcGdljFKd9irKXr7*2xik zG;s^4mr6akcHKs;kLk~_FJ_M&GiA#+*k&Wds1wl~(^5E`?^K4lD4-KlAUT&9J7DLd z3zDg$g9P{SwqwEL^%5tQE7t+wA}s{vyygg_B!V5B}tN8e-oArPjgrGUc@#_Nc3fhaW>PY}{rS*XH_c8H?RL2~m#nS!~x!j~z6 z)#oErF&;yDn})NJs%rAW%;;^qKH^2CFJqyF)N6ru>ps4Nnvj^1xhBB?*@>N)ful1g zvA?>3gQKuSJg)}y=>Kcx_j@9Aw7W=77{2dp7O3<|N5xdM}^D%}gQDp}r%h%`go zFWJ4{7L90~z(j(6ZGlQ{UsjM(QaF-wzWW+R1Ym^IpuYYF>B)B&ze#<4_6v5GaO$@g zA4QPR&jT>VyjfH$O-C=_!*}gM;B=hJVk>HF^_lvSf5Sy5F9-w z)5u1AOT+}==rkkTX<$}Msdw;s0iBI5s?a9#_HC$g)eV(zGLBGuu?=V>3blW9uq;ANPXsa8aF8m3%-w>ZAk4Hr1PZ zJ81!z6fGN(9F&+W-2)@Vn$txR2QpKt_=67bL+0bFsbKSNlJSAT%}50VQTmWC-h*F) z63;c@i9n=AhRl6g1!jkZb5xp1a&sq*fxzo6QBRtn*Cu@l&pYbz$_T%h$+gQ}DGz>R zesbwd_Rke{$7HBd0y{a;Wx?4;YmHs7d!e(y^WMqYh5tT4`){?gm zzWiCNoe@N+OvcT^pr&k~%p$32&6Bp^qAF!kHiA=1u{_nTsk4A;wnCU)D6>tPm_^hq z2>3-XIpD{sb|xvC+SQ+zE7qV@vJ5^cxe2T`(?k?G6Bzc{yr}IJYp5GZ4`5#oOB`B` zMrc6QwVZ^wa$2f}3@vS0ASHqhUkKo}h+q)>K1=Tw9yp=FVo3m~9c9-_2V z4b~Yk*9BTB3W6BIMxvGA(=t(L(SYuYoSi5FP0&vxYutOu#&6p+lY2_>h(0;{bu74( z^MmMs6tn_>!4k815K;S$S_2!&p82yeZ@bLim2rIQ?9vKhIvWq&giO?DNugksbDqyp zmCaacamQHvMfgz&b_=Kw>})!mpxkhMjo&<5Y(RQW?3|T`l#7Wo!EZyxtH{Gi+i;1) zUlX5`kRijf7(76PEn*vYQTc%HRj;HLsqH3tMcbIjRdf^5*S$^v>O8KRjH)Kj94Ws} z(bo~2U*EHK+9a5m&B%)MB*|Vp%E*`ikV#oud0ZG9?}6*s|t?J0kIM7v6IEz zRea2CEDUlUWCx4NW<{8oG*wU+gyrY~t?VI=Lv-&dQz*{JVmabNLRX{5tSZCB!ZUPG zs6Q8OL(ft5N;1tyW6M=XCauxpM4Z!cK=5lE{6&>d@L~6g(+SYY`B%Ah(W| z0q$UzsE!pzgcv# z+HlVvG5W!M!i14Yv=DintzZ<;+a-hfjZr#Yl`j4SIZCw&OXeC%wb2EeZ?b@q;&>vj zE0f+qKtSBfFSi$`iKvuy1lpHm^(Dof^eQRPq=Jw992!KZvT27bRzF1kza9e+EExLI z%b$OA&+bbTNB4$FT7}1@)(#O&0e>|~J&;nu!-;IDiJ4uQx%9c_pHYb~@;fh^iGG)A zg&b}*If1$8#`A8ViwoBc4GbnK>tzUx!ns*|F}S#EaRJ#QT6u4=DR?H=-mzUZZ{I?F zjT?gO^8}f&_f$wP;A>sz$o`3NPQto{jN&mJgu7%jsrgr&kPOFKF1DwP<-MS7ulgb2 zz1nu4IKyZnoC{^L5j>ChkPp_UocQz4HBa&AoK1ulfL*l_0vs%^Mi1Rg#Pu}lPo-rKaDCqchSyqA$@n>5&_5?+k!0;t zAi~w{Run$Y@h;4l;xSg9%gpHE1_PP1GGsS4 z75O`<(c{3IfhdZP7}(^?cqdRPJdJcexstC|QmQR%GSMGm^WQEvtt>@!C33y2z0KTI zTx4>aaKypi=Cy6Ut5gvt?t0j=EdnGzO4E?STQ~hs?aS6}xLEw?GQv-@M9d*8+*~*56w?SchZWi_E>{5kFfFuS2nI9R=hxJS z+He8dNdrgcz4MyQmzj(FF;l=9MyCTaWKZHf!lV(oI^=BHC#u88ao(&2_u_yXrw zE3L3OR9vP2My(AR`;>6{Ua`>zO2lfsTDZ`ihCQ}L#|LX~oSYL$Mw>%Ep&`zRR9m11 z^nCJ$=wpD#!5R9*I+J`<(=^X3N@|oZzdA}}1xE{d3RR*7VTH5MrcXH)077thHf!V> ze*~`XZQF!Gdm%iy!Ge99C0Z?fuGnmZCvlu5=if!m_?uIhz;)@rVJbttlIOIQ1{@n5 z#S2efJEKiO9dF~kMOh*P#>>!wx=&sxdFA zLtuj$OiYQxfl?ecTu-#2MYP%YN-`XWZ#uiEsT3|_L6tZBLt?e2j=D9*>vTqo$%L-Q z5OweWt>|VE$xe7b9-vieB**L)+lfjor+mCtutBj3nw~dvtDBIvxOD&sx7!4{){Vn- zMAoCR{dW@cQIRBz2p4Q9ggbu|Dj;KIEPwyf?t5-YriXWg zT_^upS*8+yC+CM}R=-ct8o0_alei3vF>35F3PwRcnQ9e%t{FC@S^3ri>6>5_JR`wI$fNs)?v75I6N7t4Qp;L%e|(s z&wU2>nIU9zg?&&lL~b*ukjg|<_z-4EX=BmPQ&ZYUpt&rrq9KWdR#Xir_Wd0i*QoP! z#=f{k2_p>@RWqm6ZTb$3aaF5QI6_<^@u0!KG#j;hZj~sPQRdIvu^`k;LIP6N1|x#n zMmvfi@fpTp5K;{o6`c@%EIN3n8iRkzX`9 zT;`I_v+q%SQ~|6~8<12&-;pPlc|VbB@7|m-QF~|SN3s9K0&oub?#WueW>Yqww*6d% z2p5wHPV*F8n`q*#;(zC%y@70RwL36HIKV?Wf+Iu=1Te|4P*X8WnjttnqHppio7-gT z>vXGA#NHIGe*+vO_j>Y18C51%g3&X#v=|ZKNljd3(=jR16^xQPW4goE!eSg0CrQ7O zRZ2uBe770ElFvb{KnF;i0Lyk@;5E@4+1^L%_Zrk$9>ETIU8*7SN>jlI52vISPJ#7| zBFJq9swzy;&FlDIo4ukxmms74Bdvwu=5KTadEnK{)3F*$L%&QQJ?q{cPJMZO_69j-2a|d#qef5zhba zYSx#e;V;MAX4`Hi^uCY)xhl%JO{N_EzMv<10q1h9pr?9uf(W_Oy5WPx?-zgQ^jCCr z(@A!uIN@f`?~(~(&XULi3m{!=AYgs_m;-{*sZ8~K&v3nJ#{0$k9lXI2} z;Y$RM1*IuLvuYBBRRyP(*eG=QAL9B+xKZqJg5vsHYh9Q-Tu1iS(sXlu zj((V%>``r;Lr_UWw^$tktE@|t9@yBTuap>y6;WDTZnFo5RSjyCEdFirkM{MexRe$k zu!GFmXT!KZQ4Nq(Y|cgaETUdzoE}Hz7-n1Eznkhrt!Nw!=e`%ur1B3j%D)ub!#H#? zQ0jPPr%Ux@bbMy+hJcWksz_-?@gt&Qdajw@npsL|kWab?ar0Ut`!W)0j;_BQ67uJ9 z){jH?ziLcKcGz3L+X2JBg@`2ujD!tKgF2gZw5AoH5RMIJMlAbQVW{Q-dZ#YW`cYus z&`@!7%I1a<`@Z6LnJuo~tYM7#F#FV($MEu?Y`i|5L zh^Q?GKN8iGn|&A}qPBNd&@TNB4;nnwI3BdvV6y7s8d;`x)atX6J6YpA?e`0*8*F9o z@*$3E#AuVvZ7(Ti;~Rj;xhHdg8oA{9p~Q{bz-oWos8TSx^C z{()q|M*iRVT%WG%D*-gQqPi`*5wTv`C_1UVw(zUqh2{!Zwb-dQ zgetKsbTm4L16I(kWj}h}B^fQ!k|gR?Gi~u7({!!jsA1s=2h)vVKQTU_Dy9l1(|)%Y z`lab~$MLgQ5}4$*CF~H~5ziSTDsAz3C#5my9UX*ZK zReBO1Em>50^Gv=;e$>!0yep;KMQY?}SVh@RLCPYiN$_~<@eLjQMMU78H^D8;~3rT!PFJ5Z$tf}!Ufc8Xs5?YCh*$}8!3X;of=kmf zMTq3>*s5OMb%obQWuzhl-b=ECLcH6*$$qlD9(GAByZZJ8{7^sloscy0iGi03W6TdI z1QHej+uJQ=YYL0Xf8kjpTuW-X94^orf?j%svWluUGP)=#TU`%oTdU+$ocsiDsVsD* zLywo9T!*;aohRql?1b-=F(_?O0a{VdOmt~ZXSOw!9)>8nQY9u~d`b(MAWlcyRk>pR zObm@@uXSOP6B{sxp1m^Js1Bp^@Ge}EvEq*q{n(+DYGJs@>JEAMX|O4`R8bHLL^dra z+}{8=S(7(?7HE)bzWjLVFkidYY~a2=RmtfXzF+j9#hu>Zq`ze2BmqRqFkQQ0c)1gi z5Cy^bis$9KH^bb3gLzt0u+mG#8}D=oBFM%fRsvh_O-)E7x+HO)+L-Hx;4L zqIfcIk@io?1>Ho&Orp!r6;JU(FvcI}I~!JbCQuVWXm}6tPFX}H;7~gPLGGYhQ_;Dk z25}xOQ(+(dlLEXFoDk!hM5T`w+agt*kOZ}4@iw$HVG-uCNNB{l@(XMXB@=>uah?@{ ztzayYiaU{uVRZ=Elbbz|x|Tvsp_9P+L=(VTbzkr?7y%73jaan`x=ZtmkX>|}y*2w% z$^27Gm!=+ffd0r7o#&u&iBk?+-DeXmKXFq`1Fy<$&$a#r1w=o@@xM-KO~w_3MJkW! zUIc*cNyf(oAIY32_@Faz;w?NrGVO@DlmXHgw?R6>>L}Hv!tUJi{e>>-R#TxNH+^rl zvUNp7(vtM{F_^+Qch?tyog=`bSh=ZGUw^PL;=3ljSU3rEmT0eQ9Ib`dnwcW{J30aDT5L-8%7=EwiNc8qP<<@7IWeZZ@(8V0)3F(2C;!HGW^*e2%M$LQIybMOM&Xv}o@-ZQ4di`acufJX53xwN! zi25Wlb}{57x!KB5dM02UVy`VVkbL3)DEAg*kPIiD^elUUv@1BKF;mfZ`}b0HVF;Cr zRS^KiZ)tAn7XFx$85Y6$tdhhmksK*#2^o$s3L+{8yba08Ey^wCiLe>buAipbdcK2# z+&Nhqu}!Pj@sqPsAfEpEiO#H4|G~i&+1@HNP_+;*!vO$Ok$?CAl`4(UJBaCNGa;!jss=E(G{~wID=2V@k|+K^MV+KH=Rd< ziL&3W7F`uoTG!O!s2R;$qL@`|Al6q{(DrA&W?kF4Kb7nGiWT7Dh%XbeU~cX}MJZ%N zHABX1LWdLYsj`}*u1QQ*`uK5DhRjoQ8mNHJ6+0J<+8SL72wKc>i=IBr7?w&cGj3^Z zFI_-oN?IwV@dJ=*9{rIsdGSmNzJ_n(H({imUG|Ea(Flf2k!TE-syO-&FU!eWyK z@&(v((wXFrk4h9|q=Dk42VH3uqx((~s(B@`*V~DWYH;6&A=W=5E*c30=_&PmZ0fqf zh=bRl{TMZZlPF5OZIw=y)9|PRPo+_<1!b8e{8Nu$k4RuC6dJ?OML|kFfn)=5aiwu- zoAIru9dnmE;=9JLex=qxyGrr;7;l|apemS2lX6qkPpJ8B81~;wo_{nla3Apw z8qOV6^I8J~;3Bh&-wBXl3RfuA#68XYc0utZV^369c5@2p-Gx92^oiO){TP{?`*}Z~ z=z|LK6=hyhqRtODo14VZ3YMjjb&14;cw|>=AVuF+lZtgxeo03=$auZ=v_kD|2bDJZGL@Md_U$;?H7<1(c}2A%dc^%NSRZdgt- z{|380n;JtUY4#B=Y8|bMPr_oX>}d$NKt*dR{Q$tt;|6YuZ9iP=a{UwPM4qO!oKiV7@03nEJ6V@dyvF<<<9rtNCOiXJcHyw`<8>SwWB9+(IXtV!k z);JgCiSj^~8{j6IrZ}X3U?xl$8{8d4FmEYtBrLni%qnpZ}Io)CHORS*0rdLdf< zLBVk{+%QeWRU16q+y>$m*mD3hG3aXG{)`?Ci_Sg`YEI8bpvkN?qqDpmo{zSa{&b@L zsV=Fhfb{}Q_b6Z$RV|*Qc=di5CQ4VIgX`A`Q#p+JE6_!Wf?;2pJ&-zypmheVX>wz! z&p>St@EA2?ueV|sdFIS{33vfok z2%1Qxa2szZwx$V=slqhqh28gj`OsW&nQsmAE(DoY|vkwc; zizYK5PFFBv)Dk+aQle4;xt!|A@i-qRZ61)W!waWoqThssK|99dp71bZtOe>a6&M@7 zsB_FM=F5QvA%7I++@5Q1R8Ufm`1NlP39~6YDH(CL<@6MGYOYYrfP6juKk&bQU*5Sn z>zvy)RypUlrmS=1oZnf?I)ALpJLjx(>&OpkiLSrfc+wi!8Qg;3?1 z&nr#-+Ocvb0$ukZxi=Dm&~y>Hb0x`@YgcnUfiAbxG2jPC{+{$W8iiSd@gnyIya10@ zd97nK|8zTZzeCW$ujUjW!Owj}f-ZFkn$koCUcjR$8rtQ8*WW-L{}u%mpzh0rr_0c| z^adtb9$q9;dO;e~DT;V`(Fw58F^>0vRpGf2B_@dHs1Zub(u{b2mZVm@l(Ax8zXtvZ zgRx1gqwu6_VwboP+2ng(?)#RZQ(65s){P4h^k8WbJk`zqY<>=M_Z0$cRCU- zBRg3(ULUm2&JpC$#o1RjB{%9IHs0TDi_8bwNLJ`f0?g?=o2wsN7As!qq|TD%w%v}2 zum$DJs7!g;maVb^@zN5&JiI@tdHhsTg#)-+20(@RgEtH=CWJlT`LgEBoXR#b4+5ji zQORDh24xPJV~s#!ckg;W3u#x&Fp?RkXQpJwOCqCXlLyd*Os|>}mL9-au+t6?hxtg@ zE@T!GoBNbW=#`4BY0P8TPt_y$eAZP)(w3X^+8vlXmvEa^F{X6UgOAgCR^|cdhb-D` zG|64wSM)`J!H__#PGvjf!4m5T{&;-U32M2~-H9m^@@y5Ejt>=;KJF9sP%_I@kSnzK zM*d1;IRx;#Mfb|Wk@2Begr~TYB_@JqiW6Br_SY(f(Zr7C(3jZl6_~VSuY9F?Ya~$m z67~WdA0|BEUsE^j-F*H$n6fRJr0UtEC^%Z1NWmBmnR}sih{sT+W`nmfDhi_ z?HPBc?R8+&$mNZrkpNME@?z|qgU-&(k}X@drSo#!Uv=KQr}&*_(7d=-4p2;86l^|v z&e)3eHkg#m>c$nB@tJkXwE_q9bl|f)ELU15>T2m=^N&@t*1dH`Hp?$MPZHXcT@ky<>d^bX!B);~su>L=^Khb)YOkKiSblXXh@m=8q=#mwuPzK=1u-voY z7Y&>ohs}hfP*VD}@Xkjl7*&Www!i%zqDrcAIVjj5g?bABDAhJ7(++RApGvh!aMG+; zMF769fV-uxVbVBv(NOW^i7M3|-c=`zuIBq6ghr8ZdsN2hoBJ+_I5ISr?DfK-D!5X7+@HsKJkWMc0{kb<;e85M6h%bvqxUY<*Y>fW}3eyU`-3U0fO_qYgDOk?WR z%@P!~ZAd^$8~>H&f!g{89`9^IgX^k<20xK-;PLpKyg<$c_D{;dWY1b|-qHeQl}=JW zmT&Qlw)yZZ<$x}`z*6#-Ej1#aDm zNV*kA#Mv8%vp>557FXaA(dVDgOA|43L57{0>=*RY-YO5Um&3n zEo5aJ*`gxeX)dT&_iLSdnI})Z#fpP})IPhFqlAe>#2(-A)*1%79=}(c!gQA^uS->! zx}St&O{!f<6+VSazz6^}NMpq1`z4XLcW!b%HuL@%czK=bEm9UfZ^)g6!~B$H1D4JK zM~E*mEDcN#leS$;buvxhOS~$(R=v;B>_PBBW_X(%X7 zU0`)(KT>e}CUNF+32~6XdyuO{;DPlF7P>}>pwMU6(E~W?v*y5&Rv7)Zi8A6^F{(U= zGApHob1Dvx!Y~~qe2jEiaqz>@EMJw{0UpRJ5_+swx)rurG^-w<=H1Is%y~@Kjv}Ce zq$X~knt z2XS~|T-!)8SOr>M)X5bD9X>_IYV=hVQ%RJIItdP2HAg>H$=)DvrO_2MW86#CdB)60 zdO%_9XbLA~$h02#$W&^j`MD+}xv1hi+d5;()_FXzE1-13=pmMPG@<^0b(xTZJbdh# znD-=*bSFIZC*(6Vha7CM;ZnBNV9!JxuZ1`|=cbJjl)_lm@=%iIq2h@lH`j^~#mV&I z4sBXF&K%r&Lhv9mKi7Wb#-B1U*W0P`#05mGD*9vz69v2uDB={oEbY}C_m!#r&(N`J z7iL4%bUJaO=rK{vC?@!ifR_<}^VS;0lk;PtLi(|ngcJ3&wQ5m`kWM#4_#z_y zK#Ckj0zf&F2=$VVQn1cxkB}gu^>>mW24K8!;>eMqfn*&C1smKOQBSH0)Q!C!J5+m& z@zk2XU+@==`3Nycku**EX@?XlCHqVrNsw_vetWA%*$C8NN^&S+4LYzypU34kUy9@t z?J{_K2@23hj5@O|d-_b;nPh=u8M5J;^LX{1+2YNZAz5;}$T5l`!h04-2vjBF>Zxui zeWXOVHhC`*s${C>TGM~ceGc41Wlp(PE#NF)As^b==%<$Ns{cv4CRVsrf2yk>eN0jY z$FwHS^eDwTH6#r~fj?rt*m?+yf19V733Kk_(agk_P%=*mH%%MAx9EB4^3v4=p+&(zj7-1X3$xvu{9ao)rEGZ^tt_n@o8TFnBXljF zz!SpMXE$Vo8Ib4xWuWW9eT37w%k|K~7k=@BwQ@Ke{YD@P>PB+NHkaV$fxLfx(Ko%| zkYhj3j$KMB^$E!`G|!lu*%c4h(uW>vl(H5!4MsbCV693SH! zO04LY?Zr)4n5z|$I$Kg8lw)f&LWpYj)g5%QnVt@pbHK83Y9ZJ;4x$^+6fF=IqyHd4 zvld|YiR#^wiPPuB*0w#?yp^!gf^#BV4%`TC`6meo&>buK80B!NcSe5hb-6{nK4<_x zcpt%q4`6pd81{vrNWt_tkO0tRJrOaNVMR!68JqNU#iVv5U{evY$ud|7MA5M9KrD)M z60ryg2l!dOmL5_Y=(VG@br&ZPVT*R4M@yJ2VNTU60oUVsU%*wL!Sk-F0jnBDS@Q=C zw5_=mtE9}LHH`#uQ#EDoQS^<1E*W5WVln34+DmPtJuA77X*o;w@2C;81|b z>@zfaVs&bnjwA*95&x&>^tP~3SKrCkn`Y<%`p?aHyZ`|xVgWFH#ONj^^nc z%D&0@h57%#x$l6ptE%>1gQ$e6h)O33laMmZ&4dI(6O&0G2_b|`0D&M*X6__crZFW2 z1A>)a>|z5!1RGXtC}Mlh_KXF^3ijTfUEiDe{%ft>&e{8%dv6H5&)@I+9=Ws6-fOSD z_Udcx8iGIK?bqYrt_5L}dj55ah{@%&8bXrW7$Q**X(;#5DW?2}6TsTxq1#yTv5iWl z!au{uH9FSLT(1X8MZ4cwrL%Jyu+~PMC6lZe818RyqPf)R+#6z3#j6L+$4(Po6JB7fZt48DIYEpa~=eXn8! zq@nhFawjjK#dYW5TjP&CInAkbYTaoZAa&*%CGC|ahF^Tf?W0_(HqbrX&Tz3(&|1+1 zeNhnXk4fURpMnskfHe1{#Sv*rnyD!M`b=7i#)E10z%);%dA63qgKIpnBkf?T6=BhA znEDf(_yL_@YLWa$_7+uGP@e{cH{6Atv9h9b$8A`asH4uZN&vZaAEIu?QEFdKU36#J zT2Tba7xAA%@I36DJFW(J&!?k|rrZAh1K@5QSA)Qh(1B|amCiylkDVcC= zl{$0`MyM|Y`NRJaZR{Kxt|3O@F=HvPJ;h*Jai?TFlX7Z6xGg&qNQE!>=?OluW(1+$ zZ3xtHUT-C^6A}QKX%=+o!LP<0;0%H7R>?ej8BMwT8r16Y6Deh z^IRO9;g8YxTj}`d`%{rOIyACvIr{Gc=cUVEMQ7;enrCdBeTfZa{$4uerF3!x5fl|f zf+;L7sH=CG8T6?7DIfNE=vKLLvFxi0E2TN?eY6_d!5Ss)aq!Ux0I%zHm3K{x_9Dg40CG_@IkxEd@y&2;Jv|4FIf9H3Lp3oTuq& zX3%NjAIeYO3-|CFfBJK%Qf^uVTpkQZ@6=s1yF_n;@rIUNxRX4beOiB@XGe^1C#-}T zo#w8+s1`6o$9aveaY>=W0AO&u_u_5sB#r zYG$g}($aIQ8?a@R6$C1euDYeVp@Om`yzbPc1IlK)g}SuHBACXqGbdfz12NRfNG=-; z5Lql}&FfibAh;QV=;pRoYP+{)8=4vndNIwjin^ynXFn;?*#VC1P(gW|6s)0pJ@U+g z9rUP2wBr5>lSC9Ap{Guvr!Uf+<=tqrj|ev}*{;T+h%x*W;6o1x?~fmuvly%Vu9Y`- zjHd-}haL|teKVYU8>{~CRZr2SMvd;0#XAdMpyFRNJ)-l>`Iyt-cUtBfLETozp0Q@3 z1@S?;LO6`lNzi#l4S05hj0Wgr%!6LI8nrso3fn_!=<3gq`7Xrh3Q=wTMyKe>;!+j4 zlw5R8A+sZu2B6wazKo8oJ4w;E+i0m;?Lq*eO{^a38t>U8v=STij?#r$NCOc=9EZ}v zx=>iRxop*M;95E+I`6Q=uT%Z)A^JMi;qgm)mH;XZ58Sn>bRp<#Lgw<9;LG+=`P(p9 znF5X~^|r2U0~_#fH$l6-cVh7Cw#>a@2gG;i)Ck_(lEyNKT&>aS@1_;?<^pkYHwu_g z^{0C$&5Nd6J~YPdkWO%@ZUlnCsc*lk364ilKf(rjl(snSw|HI0cVByRa*b|t1N8v(&3gIeE%=1=Sl$-}rX{1`s&`<{P z=7fHcpxQo;A@p+nW3&l#ZSSPH5!Eg&`{3;bP_9KqA18kI#Y?r1KtEGly{Z7+3Ili( zyhAxcG$?mdypGOZqKUko5Zw(IUSWJ*trZ>DajdeCa#z?6<{xisd~R(M09eB%Lo8dE zn5*#IZ=%z^4(sT?vbY}=8XQpfe{5hzc5l9&j`u2Ja5?P4F5)6QuGhpxgw3%vzdN00 zoQ?@RcA36{V$!!(x@w5`L3tV8R>}OOV80CATB;RK?=2x8mTIl6TfFl=)zfHw@p2iM z5gY02<7@$LM~Cyv{IO(1=g>I~uVDSljm~{GomqeG0{9NiOo-};|##~JOv1Fn9 z>Ga}-EDD?>-~LcCVNVmNZuS_vXsK~V`wQo9qjE9-mk>zLh*aRen$|Y5ZPWfdM{VK6 z_QHZw@Xfi9Ry8tjp2kXMd|vaEV4^NfQo^Si13iCcC7@qK$H4sT!97iIsZkSBuE6|M zd)isGNH*#%#$sw)t(CP%PGJi;_16**KS`|xCaorkIGFHwHJg|$%>8CEqTCn}{)=zW zV$GLajy8X(uZ-4}_Yl}wK~iiD??!XV7nc67e%WtPn`kel)Y0D$^Fx3Q)gzD>bc$8W z-QKLC&WU8Kz*km6+v^Fwbv6VhT6-WC@|Nx*|Pg);_C@_ zww|_@e*{=}CNI3Va8g^plh~z)({ZWD7Bhl#;HQSso0*a9hKt$a+Jn}>;e7+ zTkggiqhRg+syoJD>&3QpHFu8s5JZ~jsE4TOlfm%*vaH~&ruhB}~qt?bN} zNjIYclFg&$_{8EsO&MOkiqt9J-_Gv_ra#AYILSFYl$6KhjZ`;v24Nj`Khh>WrFpEQ?EmMTk4p*#>O|m&1ch!0%Umm zNPRu8ppznW8_!Jx9uD!D+(}25qTO|%^w?fTHLJ(Rdn-sWvmdbRYEt=MNv9;8cJ{|= zZ)skPNRWvkYA=c5GE|-BIVH#7Q67OMkZp)Ml*PX7M?}zR=M#9Yp=N225}Ja+jX`Zl-zg<+LFlj3LI@AhlzC} zaSco!K(jb=pUp}9U-mLF$ed6IUCCb=2u=cn_%99vlpKoUm&qW9-Aidf>4zMFG@Yt) zUv8!jomHwEJU*)&jFmaHpi};=sNty9XQAsB%45T?bCVhG^k---iW)dMzyv&8MT{F? zSvo$9${nN*s2b$iVSqBvauw4zi+^Bnw0`h9x0SCXgh7}N>Q5=Z5@|_woXgRd8>2<{9wGGO6QAx~C?8O0T7JCY9YI-qE z{ok3b?LoawuO?gL#e#5OeI)KzH&Z{8UTv+XM`)4LDwb41n4vw?lh3J;N3)4ZmmHrJ$ zSD)|>wb}R_<8K@WCl4yPpQXkOaLBsaI}_NiX9en)A4*6K$H7F|(rn!VUdD^xkVt%X z=r^b-_?*xG-H8(a5*pc{z z7H&?ydm<8>(H5MLz={3nimPzqBj7aJ6^d6-M;sK-&9$DY`8@a>w6N;UAHz)hhawq z6n1gH*m<{sF0_HJl4)&(9UWMEHrerZ_A(=#mpF?q@s&u4MRKCj@pFWd`BnIxEv#BW z=QV~ivpKU;qq{nfriv}$Hzdcehv*cg&(T@U(1Esw$~a|n^DDi6l2$h}tx7mhtr2y} zIX^;cnweAjbkv9R{siAcqNg^cOwnb?Gg#kP00Q-i9Uk(C^vyA1mmDAG5K5y*c`kJ| zwnQu6`uyyvO_%Xb3;-G^F2Q!MJX?2MYQY~}!VLFX5gNqb!cO*2V zw89b+9yAxIJiF0-^hH`2iCvpx81BmIOqyjVNuyt*vt9mGf^I`=ycM|S7xLiMKpJUz z4j5zVEszJoi;dGJ*C!#I1sO|{GZ_9B0v^x-&-_MuZew@BT(^|C(FFrZmRsXFPy@mT zuoyY)c3J{u9BMANJu85a!x#4^PLyr7vKW{KK3*uMa!F=`Iu^yV1PH9L`>^=*NbA?e5y!D2^PXmCJZpyRWp9WF)JW#tCM z7^LOu;&&%BYe>Sa+m<4|wuVPpx`q)0<2*Oub^e@+eB$79@!P7s6p0LXA03l(3zsW*v*>dHujv+ z@z-?nAsC~D-fdQ;eH6x1 zm6cBBy8SAZ8-v!z8~922XtUreoPRKJ7hNQlo}bq8_4c@X2lAS`N2@YE{$sd=odc_I z4fHTNXIOOlyY82a7=ozGd3^pSwF@b%;j}3Cu?QH!zyG5;IHs|O14$1|KDlpl=})$z z@iR0hHClf2e=xISUlVm5C+>{20?+wd{A_+BaZZwj>q|7EHtWp^waJGQXrMQq3>JtczbRo;hFzR$60~Ft7{PqUSj2joJObd#1w+XSNQLAZ2YmN3f2AgcVLT!cbc`L9$-ay zfJiLVxcg$rTx=}5AI7=wP9E*~I-H3u?nIAicNeYYWcUuNCFfH+Lt?b7#5Wl@Rh9W5 zElQ~}OS*f5!HKE#>yM=`WG?fA37^%%uTnMW)D%zZ{H;OI%EWij{=2D=%M_ZMx|DIY zj)m7C>fXzb{()d`xLW&t@@@XKi>^tqq}Eg)4_rDkI^u1?KnzhzL^&FbnXp4{-CH4G$6or@De4SszftH#7c zWrWrpiP}bn9hC|QZcF`!ec{Aiy#V8(&zzyzn2M2Eqc9Br76SBY>Qipr3~lI;Ut6{tb1nExvg zZ%{>gXv9`i_+!a_Jc;Hu5oty?Xwlbr5+$ycT~*y$2JPQ==H7`$Di_ruwh_X;B(XVD zOkxQp#H*9-s%NjSXT1f%DHco`cU~KzbIH&UUQa*+S`{so+`oP0TnQ{6P3?qV=7rc?D?VyLAMaw3W#TvTNuBXU&xRHN=83NoT67u~PZv z#Eo_um8|8D$d-mEqPR1WhpzE{?~$)R%fhs~ghR;o>4gNr!EouYES}#&3H*D%x&>Lu6F!&>o(&CYh@Y@ z;PS)3D+ow_39W>7eaU#0)BBPGo15>&G`CJ-rJlI+2K|s-D$4Br@=$l3mql-xR95`C zZj)6x2q_QqhSbj!N+WJNmjQ;Takp{Q76O_+1N+lSi4q(~vVav7VCr*3g*MMuCL9>!Pl8nm)Es$gdbal_ zy6UNfX?m*n&@}6)2ytt!me32^kAIa8rUENsin=AiNDz@627Qj zTK$n$*|%V&cFtiSIAXW^%t)qgKib{M$t&TW^{n1)96UAVq#U>UJ)IM&wvWE|m8#l* zOPDaq8J&B8C6)U515m{u{(U;hV~qc(h8SFE%g4rs*H$56(E~h`H~9d?&2&a?HMd5) zU62&dog#C`fNkxLRR@NYv8#YBMb~gQpRyHzWZcOofzoj#C zn+d^FTqC_`3>}sm-}QHBRRfdSU~nUN{2nqVQi1TL)&A~nP^WR7GJm&n%wG#|b3Twi z(V-%#Z5UMZH&{hueh+x4M-B#oKdp-%rvYjwVHBXG8hr6#{En7|Yr3Uy+swt# z6!Ql5`Ey!YXDX0eIHC}!U(`jv-iC%Id!#N{kai8t^b=IZNOG_yEHbW?!I_R&0f~*c zmRPJ9e4s%cNUnw0AWmhHJHaluedwGp6yXob$r=Qwme}x1SX~tl4K-^ff@jtxC}9u{ zA?e5IAh@!zT*c5wsnez>c_6J@Op=or4_3a^mJiML4H$nVMQJ zrovfMIa#+S3@2=+ek(JD>`e*ns;irOKPBWK)aRgy>l;#;-0Z7vV)?fwpl_(GSfPJo zQX3G}DQh>TFn23;xprah7`$~ChAWT>+}BuBF(%jBZBH?LQg>p0xTx`|-)doQY~o|) zHxhMWm~Tt?aT+Q7)pK}7q7g|k6}jHMuS_J0)axpz3%)8rH!3D!S(J5@)6ZW=XEoYU z4o&yZZ4`;OCSpxSlh79ZTV&b+0MojyUkP%q+ViF`JqvRJfvm{$geeKo~{96Kj zu%;Msy-wTkq-$=EoEt;=dRmG+w&pwahMEmLTlnAZE!VbO*K$M4O?0B4v3|?nc%mn? zT-|a_%k{J%oB81PU{O|K&ja6W?ObW|5>w53SmpB*1eUxemF(HFz2&l&%VlBS#r3j} z^8(T4Kej^9OSUEbL&y(;4(uym62pVS7Z$Q7*Qv`Em6{Dy`~0QqtT?mD*V9^Cq3+Yw zkSE%ZSHeRUV8J>n+QeDthgeK2aUv5+{_f1liJxe%nEKf?)_wI1c!4a{?3 zqStqD6|Mh2HB;dK6q1;njoOKWsjApt9leb(zcTHSTdxRa^1^!7Dn8fsoGiay4bl^X zUz~|?;_P!O+_$2wT4{lIW8$?o@j70tqp8Krymr>{tiSM>N=F9pih?WNmi3vT3bp$K z(?aGau{pYjc^{)AJ#D@60vcFn+W>ANZwVgBi>-IAf^~lyA}qJA^4rY(N`9H2>M!{a zZFgR);OHH%101=7vv)QFko|GJddm?0IdO#^Vr^(Who*u@x)=dH!)=3YcvF>l+oLoG z>>||a=2fOrl2&*;^txxnj*EGfJ$`(}6`1W2IysXr*io66I=~FQ0it1~4KsNuNMEJr z2EOF^l^wUG<|sUChYmd^78tVY{_aaJZ5ya@ucqC3=YOWB3D0mzAYk=VbQ?o-y3a0{ zUzwU&-J)2zA&L ziRgyqKIU)vF+~0FyL4*Kc^!SP?0{>)Lw1n4{1=&ve>3eXjyVwy^MS8h`PeU^`JrPc zTEHGjWfpI2NK_1L> znY7Y*l|7Z*2WT(7D;0a96aP(5#C0J29TwO=cn)P>_aMssEo0uQp-T!>*~b8Ng0`CS zh!@epuIcH#%CvxC>2>=et#ACg$!RG+u~%t5TFtFD2@oeT(e^MqU(F&gxRNtX=}Q)Z zT+t?MZ>T@EX<8X)vD($-^CoP%jqSRm1n)2`Yr@n^IP`{VlHQ=VAoocJA0J!25{ z-*}k3a%AP9D}$Tp_5ca7mF8z2*@{F&ppr7#vqqxw>lPym`0jZLy${U@YEb7@=B3tE zR`5b=yaUF3B#X6GnV+G;8L{SORYRq z(|U3Y&|*Rl;KMqpsbncQ0v-AxS|K4jxuOw$x@kiM*dGJ!mr*gS`@fFPhpnx4Uh#oB z6E8Wj{p)%=6O;c?f3K>MPopW~|D6vVSd^h#Y5!~=GpAPWL5rD+!{&R(lnMZ>BSMdP zeyB`trkTcdo& zR@4<7APSGqo`D=O2J3HWrB`gC+t4sw1{`NQU7+_y$}3g6N656K9ZUB@!q6qeSZJm5 z^N)}2;uU7lKCVvG-e?qp?gJN>))+gUHcZ=c*W7rnB1$OUGh5JM-c6{I+OM+g9onar zn+MS|;zSk;^W?ATLY%LSbVo2{`DLhIDP5m{9imWo!vW3J-U}r&xnAwD9I2{fu0{|g5r#DXgd-$m99*%qq5`H zA|D6e(V8-yTY>~y8$IeM5n%qy*Td-4#!^mZ^thjnu_EI<+M=&%M#iJP>=G}^*fjPp z)?h;hTu46oKXbcv5#PgY7i~goi?)ln<%AyNgASsF7NSqNpBBhZFot)dXVZrWPX20t zudyVuPRfRvhLTpodn8xgdFZaArOvSj4pqKb${EGSpw1w49a<{Pi9-~RcCHUlXMsB= z&x|sxKjVBcl5~;|a$Y#+25Iepa6@AtRa!>q*g)aW`xOJ63%x3<@2XvD7I-1e$vMH2 ziW9rQL}|L2p1Z{6Aw|S!?_Wmp*dGHvCH6a9KB7O40+u$!bG!RDadMK{<3fb8ay6fqy>QXgo~g`dHSvO?G{ zUv8VE;Pq0M7gl_nK$Rul`lxfpj8OgTUb-S*DiGn(@`22mne@&QEU7fMAFmJc0vPI^ z9>&*3>uLQ5&4juYw)o7OTy`SpX1}Mc&PU=8Ebx{Tvi-~!>;VL17aXr~5-_OV^QcH0 zrGunWuD_cfGRXl7OYpOFR^C?GH7=9Q^ce?4na9}+v03+GIo_*oz~Q#d-TmW+@}|-jkpt{%gzq$GxLc4L+Dpk+ zt;~u9)(_C>-NZd1!Eei4%?!`=bijJH+O2=Y>%``*Y)z&ag;t!2`~-O%68gD>PAIGm z5$=`asX>tlGn0vT(s8-(!^ez^KNgPsZaO*&lh^s=ZtBp)UqpOLXm=$`jQ-HPzJf+l z84VFrv6rvjjcnX%eGTo;+O*>gl?68Vu`&M_=bPF{>(j{(5kWQzuZC2OMHm9h~?7ASd>`8Ld(CAnjn||=DBa4Keqi!2UW2EklTFWRV&u3^alLhG%$hX3s zD^jmB|9C)w{-Mk~idZuzcX|lQB7&-#{6uLFX~~QelUx|l^o;3!c|bAko*F=yZ|#YN z_LmO-%i?U|eq+0_LXm}rii#)D8uOz#lJZw6b@l-_^Lhtn6f+-|n|PA`fO+)*(SmTS z>P)CuDioV(?xO%XZ=+2*Z@zbBgn;6CO&T+9mMvLZ2YavT-{TF|yMr!#)a$M2@2_s` z?$-lLZE9C6B1ch1t#_c}W=uW0^BaiVH+0H>p*^^>i*p#d(ehq8JrkRV_-5e43eD^cWeWpCYKbZ#x1bt(tZ$LA z4|hfWz%n{b)(gBD^~gE&U3hk@0KS#>mJkONeRnb^(PoY$O7>WUgU3>t5$)h7cne0A znNltTb2&_B2`D6U9JN955E(wRz-WZ^&OT(q5C^}NY5+x!{X3R;^<@_2;YAD|l@*7Vt$=%{uI zVd@~r61w@#Qt{A8&E!6}b@Qw3`e&uxui}O-lp6}m<9}#G8e~6aT#dbsfa;?DYTsDf zMF4A)u|~f|CooTyMxSh>WxcE-SW@~E=5n&+F1p_DH@qK5MC>3J?O6zgPkm0h%sh^dEYhAHDgsP?unpCKcAMP>N~ z)okTyo*8FAvdVmXtn!OmM0OAmFvfvqIb@e1tB3F~T~rU_7bK=k{Df78ZOQv+fNL@H zeor?!T!Zfx(`JMxx=5C%+S{JF2lmIndI(6<{WYMu$PURR%q;KK4XuDAqVm3GjgNb#?T9P zh0l_{mQMF&T@gt3obu6z%<0tN{2l2-S11!?nNRz#!A&3AX0ukDO8zQZn}I#=*vK2A zso0uEo8oPpAeW>edqe1mmG02)co&_Q@f#ItE~z^c(3uq->v6`+Z${fpuyc~08)dXb ziv$Sw8EvNq)7t^Ty}}}WF3LPDOyqWk<{<57+vsJ3d`oG+pr^3&aPCQ41f9)C#Rb$1 z>DC3_ABW8_Xr(i_|9$RN^+M{jCjv`VNDhn)FKh_%^{oxzmRHfns6kJJe|vg%%E*_R zi%*%PWuuLXOf#n3A8BELJ=?J$7xr-k9|T1Z3OdZb()uX;X`Y({8KZa&T-2C52$?x1 zMZpNYd6k1S;QLOn0o1Uf6 zttw`MK?o;9OJZ((_hIyH%WPMw7|&)*QQEVj|B4O6msTHgX{pi~qvX z+PKy&y(aj{q$PfWwkZX$_l*mi^NQo6fGW6D0+-Fe+R!E;QU&wRv`h>4os^C79eCQ} zs|#dXqhR9Ibhzo@UPQwn+;N%_bZ>?W@TXT?5mYu==B4V(E2+&gB`7UnML~Eiy8E|{ zqIjA#^e94oZkX&<{y$LJz094zS4OV#-J0nLQf(%oO(Tw3lhb3odWceV#>If@F)>k7Z|0Yxzq`IA{P~F|Yb39bi&9 z(Arf4A~s8H;v+QE%Fi61us{iBM8JKG*1>nf9ZF;8k2?;VU!LBJ{VThFF_AYKC-;ZZ zIE*elWBj@+mWcdrd2VVL4cjfkp#xON(Dfq&HBIs4B6HaCnp0p}ziHhYbZQOs8j?=ZPZ1 zR&?ddAdTk2w@o9}O0+l9G!B%Q-jb1Q5ra=i;8S#HCJ8&}(hJdLa<4C^bx~X{y1<26 zpsFP9IG99&s>Ux+m-|y-IPZ$%x}Hwb=VT*X28U!srWUnI2HdEo#OaYQqP2#}=O@YR zSMI8DIs|l^xx(<@!1v&ck1xZa)&o0mRNiLJ-Bk;q0`Y0O&ih|N>dV6v>H^**3IMY6 zuJ_bgkdWs_W^Mwf;3-UV=;=|5K$qA2E4l&vKp&lhQ&`Xd29OieJ5LW{luXW;KYSun<6LM+(MQ!Yt7+OU%*Z5Y)}AB%b`?9oi4%e^l-=DT)^G(-2t9V0pZ1-O9@G9ZyUG3dN{w4J7F zyPk8ZBco`ld-jT@Nk!>%^pvo-Y)9olabHe+ng)E=MiX?cuQH@*T`&21=e*HmIb^;J z4f2&l&8$(Hj|nBKSWLj5nkW;Wq&Y!jx7>v_!YnLpdLuo}OKA?O`l;@xr{`)uP|W7E zi{GFSQhJfrbI|B{G^Bi;fwIm-``X3*t&Q<TZB#cZ9 zn)Ab7O)mqWRCB?;O{a7=lZu(weoVw;679W3x9fx_b0@PF%^m=nne=URPC*}yU7@DG zh!z+XJ3m|YpqybS7fny*%k)%M4FY$7>G{$}r!Rq-Ekvp(z;A!%Z+q(KB)wR4nI2xT zk86=y;EcupjthEdMLMJh>UNHFZc;jE;e;>8yxF)nxWLG>c>C(f{e?&lAUaGNMp#fUHL-EUJ)3^@T|#!R9t;zO=$Px4tJ1Ts$cZ82Ev$yt~>LS-^q&aym-w3L8i+9sM%X z*DpM>{QXPYtIgUwt+apFmfBd)rmjsjPP76dSiQl8-HmRid!T=A>fVWRn`Xh7L3=_* z;8lx?y8NU;mG+%dY@c^=GLw~@Bh zl;6RIKa}#bYJ&L<@<@CSLBijLYTwWZII+CqAwGluqGN0!czMCkQugKbhSBy{&;hy5 zt{^cZ=RQiegXknF`q;ectZ5wuWc;XdHe!Ncprfu!(haI@a9C40K18O6W5^NmBHz*E z&Izc4X>CH^E?lG@;Rl+=Dtb!D#9^(gb9C~TbV1i9)CWC=yE=rPJvZ?|dVVu~T5>@Iz5mSJLU%%@#9VVaGi_VCyOcx5!dX$_gniI|8 z0UC4y1t*^K&00;fGE1$NjJXkCe;gcVN}1dypM2IfIzC(->0vELWyA+Ur6xtJsRPpHU_uo$u8Qx{_1VfCq_Gw0N&(&3jRY$53N#^1jc|spCcDYy*I0m-#-nBf z%3&J<-e}IK+qsK;VVD}AJAFcm)Pyq+aHxrRBQ0yZY$uFrGjkqC!A~eumeCtb>~CR| z_-%0(m@)yrglh5;I{Qfm&AO!!62>VLLzU}a(A{=x7r%nY{~@-~Xd80j#Mdh%xfxb4wlUeTZahGB{?E47dMMi;gfmblen`{RNx>;g=55H-HoirN z$vC5&q=q~QT{C!X(v1x3uN7zCpl6?3-7u;V-bfmihAcq}zN69&v_@Cq!{3GK;H9)y z=T(zs7tVYcQfHWwJx%4eZ&40>ces2o=D8(g}^9h}fna`UyGAr6?{|SCsK{06qMxe#LbAF~|mj zAIHJPk4kMBf>6TwE1hZIB+j#foF}F}DAG(riR+hmM|G%gOnhF;yGJ*%c#4z^uU(@F z-l;%nO?wR4oGxjbqx~#&*1OT9twGGLs3)+P?SO4ZSbK)`O!yiUBhm1lV(Yc=`l?R2K(^qA&{gTv!vaOoqGtj`d)-A!k6JZp$%r6JE#rO>!e&NyANpA~X=2 zF*%b>tq%xHmN-n+!Vf%rS6YgE6iQw>Nsf$kZ(~n`1puA=@C!E!gK({ximY$b>`W$H zk{a5PFsJx>MJ`O@-0FRFr%HLzjG}sPdt~**OJlh8D;aY*SGF|Z(?~KEOw92_1K&>D z?E5i~0{uJJgHO5u{1owzT!ba!OcrOEdyup@Gqi?ebhFEu^t?onrLlFw5TgYod*A#z zN6|CviTJlio!|CnwD;O7hru{=)49`^(7n{JUpb~8MDL?hu`tvlpbKIOx`5fBp8E@E zIeYcGw@M~R%*8Cv&#Yp9w6#V3)vefzu#ex;0ju#&aqwzd2{?#q`|B z)z{d$bOjQ~;v{=6zGdhk)XgcgwVtZJg$h=it6Iz3Rm#KU*Y!vcUGGdXbI%5=W9z%{ zSX)(?%9b`0*1d_AG^e0vxF=4>);mBapK?a`$i+Ar!P6f3H3ag+nS3>Nd~Y_E#TPqO za^XOfxcm?G?VOx0l*++9iqbUNXj&g$JE-=St4DX@DO)j%0W*tY+^^&_KnjB!s&^^( zqtzaf@TNBRziB{RS}e1`4b#}n@TmklP^~Fd(8K0#L-Q#{5^wAOA{fPSQiMh zl%U}2SM>Da(ERVH&&o!L))ge4X4Xy|q+Y{9tJ|L6cAA6LY#Zpb>TB2;XO*F&^Rv}? zv{M*n>QPqo9op_vVq=@q?gxsDO_JCBIJGUnvK@@Xa+7S!hsP+d*{HxM>NCcWZj09+ z>3+E7TQ9jN6Hwbf8@ior^-L4>77iQG zmKXiZz8TtB{u(R2M+*Ao68wSol@vX`?O1njy$1Wz3!Smz)sbCcw#1ZYFN#eA23g~V zijp`=Cn!G=h77wwc^NnBO->xypg9(lQdW)l%QaDX8O;`kYPu`4 z=PKh&4}Fp%^Dnb)H`bvF%d44FXpWg;d9@!&20T${bp`BMrn!nvj;cH&{V640KyTJu zocscHW{O(tTeYEB!c0Eoc}wQ~HD@`mrLI(W=V+lE{_|YZ_N@@5*Ep75gI5QK#*w=a zMji_%&iJnafod1dx-YEr>PUJ$*jw+TjM&t1(KYaApc=fe7tJWDgTrmr{?V!;Vd6(< zhr3hhp!H*~+;3l5{R}$NJXW+Ab;)BX(p27gJsq)*A45exZq9mkwi5LHU(+##IaASh zJ`{v6-$hepen61XldY^#?c+BzFE_uvoOz%!lfQ@dS-05r_As8G(+~?4c@jk2Bh|^$ z5WES(<}LSWm{2_I*0v>snDB zTOrq}r_u7gHka%Heh0B<6F<9Xp3C|nU6?NtC{&#@>}_RT{`P!#w~s&=j3Y9SArqZN z&-1u@4A+@M2WXEE@Beq?_H(+FwP+7VR$tyZGcqQ!5`Fnpwu!POAB~-6{h*`pmf%G9 zLIv{0{NiLS(s;1?@kAa znqBKCT5OOJz3=4Yh+4p^h1eg1$csw5KhRoH{WLTXzNr=|VxbmjtZTT@!cSPU85%e7 z&`Xh`(bqq;B`;|+WfmWx*W~i(1DXbD?Ho;Ckm4PM>$K+nA}#N_@|KC0^Mq_( z`U!Jxl)NrbKHoO#$^wYYxm&X~u%A%bO~U<}woERk0~A(QI|BpT)LHcNy5T-{ok6sX z*ig;uQOoJ2qC_u+yG8FCmpj}}uzc`r5kFd0CaW_3bmQJ|VTu$#Q7y|jywt`xo}Q`{ znfJfF2Tv!B4Z!M%lq}1bO&&5cP-7K6Nc(6B9V8wo&iIetMCX|pToNIf_4c`6VcC_da_^41zFJ0 z#>8&OtN#YEtKV{L}-g>O{-T3U_y-NTp=1ZmyYi?2|Bw>|Ee zPL)Je;+#NhL?wv;&B>MEX4t>jY+RFRZR=Om{q#dRX=!alu7PRqp3KL{+&+MY_t==7 zt0egvT`L&X!WRicMA?jwlj77ip!KewrR~fZJm<^DGF_QMy#o#q8XSKxwZ?8TjmDKp z-bLe?xMBvFQnh&(Xl*Z|ZJEWzpYV7-{&FRaq$JQzpF`sc>x=0B7@8= z5W=YQi!z5E)^9}n(HkB7r?egr_4Ov&nln$c%66KG)C0S5tbK&0tj3LjvTdA*CsLa> zEn15>a-`0hWDg`cOQ#i+>-;Jj$WWap`G{}rJmM9ps_URUdGbZHOk&OvjCP44PAgoG z87&S7U6mz@U7-VvE`4roY!mCAP`uR+o%lEMAb}#+Af=GC7oAGTHF()>?N0Lso!9l4 zE_pb;J~z^Ng{0m|`>D4_(BrG-pHD|;KOzZU%ZrN1P-Gp)R7sxJr^W!M6`*X zvT}4}iS6y;yv5I?mvG~Jyqi)zvrhzDWKUZ0)mW8Ds14aKbAr!b!)%Gs_vxt9tJ}5= zjr2BeUV`F!}*wdh|VmVJk z{$8(i#wc7Xahq*pYi78$`7L9AV#mhS{U6lnWnzTQP$mivGui=WsY&*mTIjE$J3Gf< zJ`EuLv$-n#WKqsQHh^Vj(MWjar+BIO7Y+5Y%)~Q4$imx#96;o4nC`KvkVtyo&@g+Y z(YcX5H>1eFQ?ZCf?8Zr|6eb~;JLtXcX$wbq7tpiAt{sI!Ikh>U$YpzcjPA_E#rei% zuegthXJ!*x+?B0Sxbz_EjnY;dT~{42g@O0bK@gTb)oL#~Em`UYlduk}iI3A1d1uf` zz@zE4NEz2hMgL*Jh&Ps%7-w%$0Rp6L&*?<3SE; zUyYliSWWL?+WdbQV7-sdQb%#bMXV?`j^Y5D_AfcT#>!~rD-RO2Tu$?fZHedO;TbV7 zy$OuuE$Go7p=nE?sKKww<*KP+^LW_3G?j;m*h!9($v&);og=TdCx=bt$v#BKGV60G zqN$P2GwiL2Dg5n5njUhR6u<(?$LI(KnE6_2dfog7X(qo#otPw}^2@?^(4v6F;NEYp z^+Le-Z@q3@5f$2I^gMJm;GVdW4nBMBDw#oCF7CUEg7O)fAJrncG49Ypk*(hyO0BA4 z4vi>V@gG^rF)KU)n5(G@8IKXVlNl#|N^Ry=&JT9yCR5)#4eQ(xx4TM)P08Go@1VJsNB9rQfcYyOYs)D82bNn@nC_AcK)_o`^Gm)h z{_d01Dr`tnT>YvR%mBGRpbnt{7QO*?EqtE!GoaG$UWjiWm}R)3NYwI)BW|56ihqQm zoE+4^&>vF=-;pqy;wE*65|i9aS^!3q?@8Lomq&qE!xu{YH(rZUBD{s>iRAPn9Et+D z<4;71Q*9G=(|3&z7ey(l->-K4BFd!*B7 zmLs^*RTLXfMj`W1Z>_HuGC;#-zDP4|5l>xO{WYB=5~b8ecJK&$z~P#nAi`HC|1J&- zqk~Bw6*sy*wp9g2-nTa4|14Cz9tT58Ok-Z62`fL{8)RTD=Xz4H@=$i54C6C zlk~&g)U0HW)P^}oEqvxxbU;8TEI6P5u_tQcI<&l!v>HE)&8X3f@d3AA+Y{E0bl@qW zP5hn?!!_WXs??YcUhfYy$Hn=@5u(jR{dl(rMb8aXDRi@@J`!1c6U{MpL}G{~cy+@F zw_8KASE8a6Z|f$;XC$*=^Q}4@4?;II{5C){Qsb^NiQx%o&ZHSx6s5k?>vv;-&A>~M zSVzZSPsZU>43J2RpkMJpOr-CjLp90R&+N~h$#~*7G@UQBt>sLO*19XLv z!ZtrHckVBzwzLN(^@SYz)if)vRZESQYxhz*x}XlC@ROI(;pXKgKSad{CvE9%xshhG zU6y;Q(~tMN6qv7~qjH_7{LnzX)48|OGgJIV|M)p{+c9b8ehPm^A_$OWKHcSCV-)8N9nV2MCDE8wr8Bg7Ty zC$L)!RGlAYn^%|9*JaeIGRtPI`KkRG?YNbR|8gE0CWfVk3Q=vNBhDB^viD%EC)kaj zPsQ<8nxXUYg(-*fQkoVduote29Cc^4G=8&Hp1qIeDKt)j2@W!~q7d#20GQyU5Pli9 zon~e$c>IJBd0#~xNRk^t!Y3Skw(FZ8Z?WjZEJ8k$^XQl${1A_?Bn-P9SM#|(U+-!V z9q?Z#$m{!P9MO#yf>uhEHM|0gf@`d3ov;)P-ze>xq^uYmiZ z7I?#0|HcF-ub9R|0v_-kn(KA+MhN*nSO_*?T~5m%r@1!#;z6)jaB8$_6>=zD)ZSGa z!25`tO&;v5?3=YTi!Iv*EsF2r%4FK&HwM^Q)Zvk2Lq`?~DM0n6JpfHLNI8ku%9Fwg zmeJKWQy-#fs*}r8dGXXn*Z(vvFxo@21_x@RI>$#wp%5n~Pq2tR`8E#FJQs$GKl8WV znKE+c_cnb)-K-5RDIX8focgv}KxF69e9_n#gl5(mq@$Zap;}>w(}Lg|`vz$OF@eQw zOwhyVK#7v{^P`>~&Wic-XK7&+jr8*dq9Wty;#)Rx1$9~yt{eSyQ|2r?!TjH7x(ztG zaqX511uW*5;26A;MD0sQ{v7W=`Y>wg(4W!4nFJ{}xKa^!=+|f_ypYSs#)j8cFB#`r ze>cLs!t8a>n{k)A*1>rbjLGgpj&tG{G&?9x^YcagNo~k(IB&W~Ydr;&mbeXj^Bvk3 z1j=GFY5sVQ5potej+1DfXHqM`MuXj02xBoammkq~S-A0@;xF3h82`m+q4pGiIGg4R z9RydRArNQLael#OKb}K}sRm!{*!>b6%F6Zz_>%&7jQ2=S{w^46!Q-95upW~vi}qHy zTVH~g#*X9X4aMh}8qLby#24U{vZFy*0%2;fO#MZwxWUT#1(}5_$VWTqNcU0Bpm2Z- zC|{vzEJjP>0&=TfNJkeW62+8bB+!evpsqXPh&O-vGCG8rLeaW@s7Gjq+lYC?#IKm$ z%74KlXR#{SQEU|=_RBQejTdSzN9ljk5$Z}u$*BjyUa*QfVXmN#44#+;IISu9nP~r4 z(wtOsUTPT`|6*!&pf8qZe*DlZQof4z

PD;ntE2s~Tr<;M_1JWB#b`rTl;PT6B2EN%+G2V1O~ zb*q4nC*tof4^o%-5&CuZ`kOU>7TJyndfQlh@Ro`QEdPIkDKuEq!V-eN6$1~7K-}}M zxKF{LAS|^FJZ#~V0}#X#Gw#cQ1k~2*zM+DLZ=oE3xHgp|Vl-FOTKI|i8o&00?4z!` zFKaaWO@Jv_^M^K4}!KNW%#X^Cd?M7%8*H{=v50XFHic!H}a7QunJ0RN)6w4O> z52d5TUvYV`U`L`&cWcF9`Q-H}T9lzS4@|h;^9`yi2M+wUZt7du?DXpw3ZuVY6tMEF z^jA0_$^oznXEnU8STg*1@(9GFb4j3}cfiRJ48yVeaQVvghggo6Lt`l zc!mJEB|_0J?C-=1W%kW^D`>{tocEdo=%+}GrSv>b`qYs_r@u&L6AqP>P$9xfue)C9 zcPY*$_kVjR_4%`(XcB^I#rMh%q&jDEFC{+ zIeez&V+D2s_dcAc!|Gc}rwA1sr$|BQdD*3XmfQoSA1DY0U`>$aA1%BeGRf8iTRNtI z%H6+BpylJ*2f<$0K>z}z4VH4S`PC6N?dF6f1A;#)dMgd`voF9WUs z3_89HfWaro0in8#luuCd!BY7wH8Pj&Xv!ueHfC!irpLq#VYHybZ|T%3GZ<8LLg~;z zDIigc1F)p$4}Y8qZ#)7T2J}tcmf^22!87(P@j{qNU4uSK0RmKL3Q|ZHr9gpwM3I1q z-B$`AyeWUJwPL6grGaU;OwVsAU|=`&Sc9K$t*(`g6D)HHtYlgM989A@prB+pcs>#K zTFMQ9u+eCF7IjZ0V}p0=$RT?TPa{b*KM7MYC6PA0mi-=WW0_8(4aF8 z?n9YA8)INUOmi4W6=+_i+z+rpX%O0il?;b%U3)rzDR{x3C7ULqPqc?-IVGb9r$O9d zTnb`Pl;b`~?v3*7XO#f(FH~t}cz$KV0+qy(qnKnVxc!{C4w*FmQP0CPCqhvBw5~eb~fy|vHjgvpKVFIx5gS}K|!(p+P6}Ohh|%ZR8Sfi40JahYdK)> zT2=R!vJrx;jk(pStCh?iC^R7adJ5)8o$94QLeXFht$7bMG1OSj3*=!%Bi7bmtr5+-wRdcz-+F3Xun5Q`^?>_2dsPtl!+1TUnld2(!vyxZYz;) zeMEY$o{_3q+Y)^T8$n-=4z(IwzzA3Rs7gKknrA0sO&iqjCe-iH;AofV0vDxZQu&8x zfV=uR<%2`q1HMj>;Wg#M0?7jwCjgZX4Ce@7s-@dl!HwxbtD_tTG(5iQJSs_4;N+30mw(bN4n9F~1* z%odCVe}cjG$AMiS(Z&aCOuR$}hsVPtPdidg3d?5sD&^?7b7u;K18p&uP9yR!OO%Yg<;MC(P=mQd5tde2O);_Skr&k<~j zdys`nKsk8fzIxt9JCf*M4kXACoYeYIw5J?c^s)ep62;0sKyuvxRM}vVG@!H5Pi!DF zY#Oss%7)3@aBR>F4ClJ%$AjTFsLLT|5Q3HXv+FIMMfG%NH)CZYYrCBL8d9;vg4ah= zLtFboZH#m5UIEyD5FP0!e>~F5FzAEm81Q^@UuHy;3ev*!M)84keg!#LvJN8fdmca0`5L%Vi$yw=y|p605)F%dtZ-;{nAdTZoG zp=oihcHkO}qrtTO3iI7}^-|6|-uasNY=}Vwy@Vkc88OifxVcsv?NsmLZK zs}QQ~RG(DjHyG%0@4o*_Vf7=`YUGbuu&NnNM5O?-Ov;FVhg#nzz46FCCac{II>t(a zSPRv-SJpkG5jTzh468RQsK8iu|;o(Z@`IKC-p{*`fcB>h{rH9Ff?6W|zP3nGx*KSbR*RpUewbBC`uV zFFVY{E_ys&E|WVyavaPpz9~-(E;FyULYn_SGm;S>zyVOBaBA!*Stc=M67iA48jWq{ zV~HGfON+=vb|s}BjDd6Y9uokz&6yv1vKf7td#q2AT+2?&N&DEZH#}LT1$l^3l9bD| z77pV+^7N8zG$xyYf<}X7pRN9~EikxkB&@OlsjREgt!07}P3|hk0YC@m)q7^3Q@X-w*fPt)`~8(`z>;k_qv0Q(MP2mIFy8Erka-n zh4Q9fY^M5^0|vqg#uIZ!}wvD}cL61-S1SWj*$*h&hdd3U}YJF zs^x$IEi}4DDN$)q*2{lBz-7IDA>?hP;nMD|mJJ1Dw$kom)?vV@OTz|5gJnYjG1tdK zX7%OLiTNM~^P;2@UOhc{v-*|SVQ`T(S4lMlnW%R9VQ(0 zTFX3eqNp`%!4}!$)f+TuZ06{@yeMkXT^{n-0X_PPKQ+7}JkwN-GWv=)i@T{%3;7ys zY+QP?Gdn{$4JX)KAQw4o3brxPG;68bTV0ZucHUdYWXAO+Y1Evg;ey?sWB89+a>=wn zPFC01k5*wT;<371f9H0}q9qwJj#oDZtp#j%19PWJW>hi-E`*|T#!5(a|5Hj-h^L>I z3D6o~FGn@ErF)bEi9-3XILfy+aC$AD2_Ym8Nf##fE1);)Hc^I$Fk0BNOpdtg_H@ZW z=qXP~56jvmYUhaph4sjXSZS>ef;MSog9L>jm6ncj43LmSI1Wf`W*cTNWr>x*IzA=7 zAzSwz_0BJBV62TM3nkrfruZ)@P^PKJZ{jfPpt!^ca7d5n(!%*xzp=*Igf6$O`t{N< z!2Q7olhx$`YCu~ZV>O!MEsggMU0aQNB&0JbM9+ z641VD=*pqe#qoD2i~7QOma0{q%y6 zXOHsq&gu`c_o73*dECu%UrVK7jp^q%Wpoy7wB z1*)};`A*A%h3kr{v@@_xH9IL*oqar&X$`BhWrBlca30PY-C(#(PpjULT=zmhjT?|a23zDz5G$}k;Ss2`-$gq;#+WPWdVZOS>M=b8(mMzf&`8iZ_-dMFic4{`xKQ0?37Vz z5R!(TE$GxSv-%^p-$H!B%6_6{*ai4Lw%#q|$%cek$;b#=x-k(%<#6ONy)4m(WPu#`WV zJoOAd--?egQKKI@=B>|&6Cofe)ebLAH8C55I(wx*_*%l^+xPBq@tNesSN61X!zY%0 zPC(^FA+!^y`&wyrs4CETLL=VC=f&v|&WyKGAGB#I40lMD-qdPBU@8EbcyiAajSz;J z#gl+e*FBdY>5}de^P_`GL}E`XCsOTQB1TwKy;b<^k@jEs3GF;qyilGH8dyL|5KEI+ zk_#py#N~+km7}|Nz)S%o_R8}w4;HN#H#zm57f-roEMCZaNWAc8iVJLc`4p0uRgWzn zMX?WFyz?un&?aEB%}vC3Tb;8L^#8yjtJTLyU##mJ69^$u%S;6B<~#2tuEu0(q7Gk;tOLH!F$+?!xTQ(*O%ClDl`kSqm3@(BdVxfcs^TyGc0 z`dwC)A2L96lB@<){f{!w~c$lJu(XNMAEiAQK$J&e)Wn|cF157 zwgcPxkoZa50vS_a6GlFa)=)-cgZ4ep`>|lZ{RQ!PzuiR?jI(G_{G{0;PqcDkZU`z{ zrnkPDh&p%pu;pG3JJQ<~fF)x)2^yaI_Jr|msCVBKzeKGcxgb;iWh4_zhTSLg?bMZm zZ{O)#gojw}Z0DSMj!M^d)gNjFq)J+5asY~TWGvk3bvqZ>{7vXydb%bKKeHNmjhU#5OvJfZo4srvzu;lZZFGUubgwSa8 zVL;)+f|FVW$jG-wIIkSwj#K`{(fZL5ph$D>7;C45N(2pDIEHdk2`$UKB54U1juv&u zg@;$Y=xw9raj-Ti3fvQ3lIrXpD?L#K^!zgI6YlHeQO6e>nb+SFBnQ0a~CNRAn zYR*xLiF2h~!K-3uMbQ@szD(9$(aYii(y}XDyi?>U;HA*Qg|CY{gAb(WWB4o5bvcN? zFjyv1CU@dU$DvHiWdDXV5j0h1`L1>#Ojaomrov1J?rk}ZFoV6Qe-Ee5_lRa_nQ9yz zMyC|6R5rQM8+J#SE{~fPja|X>Ki_J=!`!= z{IqP0Xo96rQ?N-mfUlzye%T=5D1ziHnc%6k44TBz$du)B?h3TWN=wNY;ig)?|OALhdIWE1HH^@eob?l;ugz#2hWSP?-RJy2L#uX;`SE!DOqq zga*ky3>Swt15G6{Fo%kb;7&sX^@-xA8*5(U?4k#MX|LX%@#@V}aGcWX7-2uQ&=KJC zT+yRIk6g_>3!MHDPSVCUaPTB~`>^#Edy!_dtd|#?UHR9P;>I4uu>k}>jb)aXf*F!+ zqq*{>Kta-IJe9K)NH0V8;cib_XQV@hLjg!r@{d!F01e8eG*72jVCczkE?Z!#(Ietd zf}l2$>AJsK;T}{tGCl<@brBoT;tS9H8Bj#5`WdNYP&P=?>eBf6;^e z6bV<$B@i|240k}#`BHo61@MysZLp(N4b0J64ZV1=g$<7rn1nQ3*ibS=unyAnrd3m? zP>+xVRkXJLX7R07r!nI-LMC2C4?}(TPLfx*f5l(E1Tq;W=thpWFS zzICEg?`<-RudcLuexDbv^!4%;nDa^mRa*Y>uHRp2U2x`iwt5r6dZ5%gwHb;e2qP3- z%1pP2A2o!)_#`=iHL}FL!DhFlb?`!gxo6U4QpqKN~u!n0CTd?w-hip0#k2b zNtJbhKgfii;18%HekG01i;9o1aI9Dv{BCg&0v{(!OkHyam8yCFEon$suc*=FKQwev zn#}gU5^uwLGu;6Uh?Dj9fPHwwh4cvx8`Wv5wj?V5J#0^+{;ZM!)cM+9x!)b*%nq1_2gf#C5FTP%n#j6NQbLly4#_uXjbO(`~D~Kx_Yxo zMh@9WCdbg9`PrU!zzzfL&t|gd7p&P54avj(Q6}$(N-C!Te(+*T<#78k;w8+fBJzg-XI`P9F^j z@JX=?l9l28{CP@+?lg~aTX8z1qnM+LO2S24Qfs9}z8t4f36b0MmIu)~6M0An(5#{f zxlu!A-_ZH#KMm=ak>A0!`9tFMa%hlbtteX^3zdDCPPvkw{5PVbI zfkr4ybiDq=iTODQ<-ZgkZVuKr4s7;0@rbm)8S~$n%$_7NkNLYD%AkH0Xv4RP_{-7^ z5zHL^0pd7)Aa?ScSB5lIWk5YBzA_Z##?#2G#@a<~R6Wh|odgwjUd|MjN^E=0uk`SL z=n>oAWW$!tsHSBsCZ3M*Q_@%WtwURtIvkIQ0-{OHiW77^!*I3TAn-qo$#xh>g~Tz? zF84{J2f$7t@F=%WXkl}Gx!ZQ!v;w=7wCk{4^N(Yd%K(%lYVg?5<@rVZu2lb6n_eKR z27>OM463BbHRKWqv<}v}MuFZUC&tS^;Ci1tIwVRtrjueNy;Mjuc_IBwXq3^Jy&r7)mHHGyh3Klr8 zg!N=`z8F|G4wP`j#s)UY&%MwOCa!4dCG}B}z*EWjVh1>6x5L!i0+gr)k;A*Tgw=Um#DD3abSfC2q~u zAfkZvDlj(4?ESDpM})q$jHznS%7}^=RBwTF`65wY(LAWW)^_?qpY~jvdQdzs zzA0*uooki%i-Yl1__Xq${42$w_*x5Qu4@kB`b8UhVAJ5>Iac|aZ54{ww*e#PEkUVqn)o zE=2#GzF>Pc{EB6#yjgUZJ?g`=BA_!xvieZk1@aM&B^fF{??a>zdG@qV{>7Mp> zhj^~}@G=(~1XeW42X5rlG@KILLA~qH=_;@{)r(8N+K699n?k1F5Mh&FR9%T`odfMI z{QmF@z*?8?iWzUCzm^n)H>^vWdjt+zUew`d#h;ZQ7B>DeL9h7imnBb8VDIldAdVOp z&F{qQjyBqbzg!%P+z>_9?0Gub`Qy&xL<2jO_Lz*q}hJa?Z?b4f_RRns|hPk`*1o7iI1Zqo@&riVYM>{6B zzAS!{k`z(o!>&V6Wz>C?GvFzojPlg8XFz=d-xZxLMK%?v;0uPW~u z9E8_Q~?*6>Gw1{ePk+3>E(o8(0GG`PDxKc@;e;Y=f$fL z&Xsw`H+u-G);cR(J_37$@`TdfeNr>(Zg%*Mj$fhd` z`5{1)r?Q`0?5B7oHr>p2=EJ|0frun(F=QMPq9UgQ+Bqs-4OL)z(CeX96ZPbx5(oGb zNtDvRps#ebV*%{f!NeL^ch&2tRBqdD)Hf#Li|!Ah;#S`+J}DK8kr`HB`)#-@kfNXw5ufQ1=}rIQD@*TUK}FTZd8`pymDz? z5#)Ze=e>B~`Tc{`7@6X<{4Z`T>0)l~GyrTOOrB5JsS?+8hx-*o%#Yrh7pY%2kplZG;0i}1!~Ep;Zgy@-dL$N? zckg>VeCXd#aFGB4<7MYw@nUtF z!Hbm#lSP!osXqRRGG(~wHrk%DPxM>R#9KJ;r)$E| z=I4YqKPPOd=RwMyv4`L@ICL9VRT|GC_<<*P_jTemRPzDI(+Kt;A<$`bE9+!WP9wF3 z_AKEtsDyzFLc)fhTMvqBVc)XnANztuk~hS`Zh?TP5Y;i)V{dgBjmZ)t8d~pFqGs&R z@Y7`Wdk-ymTV#VkIB%q5XuZ#iL&gTNUd}ko&~l#^hmGaTq^ryb&qSX2_5i z_>+J$#d2g5&7NQZbwwF^MT9@mt?CuX@ba`U3BL+~w%)IFFnkyP>pPVpZQ=z#gr)RK z@jOubB0JO$wE8DKwlY%vN+^;d8V`tIdv4#p_(4L^E&3p9lC;Y`NtpKNn>Ol!9y8bn zv)_?|g+pBF<#Dd0G9^dlN?#Ixg^fSw$xf2!Rl+dDxIP_N7Ms7}=VewvV!K04`D z#n)vN!lCJFnQ8q^wNWRMvntJwy-g5G@C5D`e+z5}8*`W|alk{K2e%!bLRR=DHE~F- zFfef*AHMAUfM_2Dn|gDov<9-6=KZ0H-`~`-9_XbmjmTNn?*M5h0mAygIrDlfEjXi)Dpy=JX*jso0j z)`WXCG<^E%z6oHhE^gW|J60^ob6)Uz=UN~Pi;5CF1*KJLjYMM}9(npX z>PWNx?dYebh~-~St>dTB8cKuvZgQkR`J0c9mg~rtJv-hcFjU>>BMEV0b zZsyntXHJ4xRo_!~uHtom6`=80fqGB$3={(PtKuMk`Lx1oi zjeI~4?dzt}pu^oVj$Lhba2dulYK~fi&&|RFz7m`lUBJOeVOcWOpvB zK}C)rwFE4LpA$!-2q7;9=PQe=bud&|3#dR!KhJlo#H_B#2WyDQc>7dsE^3) z%1U(IskoQjj)ezqTCG2c=mH?RY;>Ho{w7ZP7I8PWxQN7xBDR<*sX{}?L`wqe@}3Ou zbMs6uh%MGSebORAgDhs$D)V`wkFUk-G7OAZl5uei&0NCJ%q7VRPLfL;9aG>(T$c?4 zusP*YMy$x#z%g#?HSRsULA=!1gQ{!fO}I&_@Pqi}$U(>){&63~8^uo>2f<|pbI3{O zZCrY_GlEw5S==E$2NySW{z51~t26XZw|8E7TO!)C^y~bv{bg$pmCW^*ghx%AlfP|j z1|9?U6(Pi6Wxd+}WBdf^FyA5W-y>@55TEX%-vy7&ax@;&=xOLVQQMH+*Cdfc8CA0mA6j2%t2NoTibH57IEul)t2gCYd=1Cp_H>XvoKCNz9r- z-?(;@JLAazJW{{VS|6-ed`xm_t4=C8k4W6e(MYg$cm+G;8a_Ho91_SOPlKD?NfR0_ z^^k-Akhs}k8guYPj+<@0NxaC@)4~=pYvVi@)gGyLFwCk~eT$QFPE&u9Oy=QO?jVf6^?GqS*nVW^`M6!u&i{k>U2nbB zSK_rRr3=r2;2GbD38@j_oG?*LCXA8_N(azQgY2(F72U9ZnW!gJ6)OEc)e%T-0ckYv zfPujp8z=2VQ)d&zLpBYN94pKfYH(81Z~zB$)p1!cRas2P+7^C2LBF2RzlI*z67Rx> zr_eMVp8ej#YU2reem?fBtq_hQ44<=u$k`Sl#nXNiN5i|r!zpG>3VBSS2NYxU<=V6DAa*|@?o|f?y>`TdC=|E7A@eSnxM+XYMOhn7x0>T<9`ogy zO?3BaHRLA;(SNqv+f2CUh(<<@)}AYsc73>^AKSbpbViN9Ar%*yKk*F(y2|di#9OiF zgLojz$T)gf*-gx{nz3J7n-eA zr2WX@z_T5E3kP_u*XGevsSHhKX~;o=++2d7kjjob!V|wvd;*EW3+G$tN6qQNWVsbY z;l`>XFftZ%)<}<}CHq6&_uVlG@Xwxi-M44nl{I!FZK>qfZ$|Mat1O#FW62oQh%7Kq z4QA?XMsqiD>qw%*`}+Z>8KK`BO-eXfrI97nQ57ROxUp*R26z5MoROed4J;ANIoSgo z2EoWCU(CeS4aj4EAf6j)=;%QHG6fwC(fczf1Mamp!2U1CPR^#?taMKXNkdL1nDvJ5 z6{|@%Ts*k9BhP*obL5d}uF_ehukOuhs6-sN%F7$(ohp2n`sC%6?R@Qao8^m0$ETlN z$x-C1NJ0cj`8&6Z>!GgC>j~To&>Bdtp@kCkgSq-} z*(5tp6E6Y)OhNE^>{#J}3CAIsAnJ;SbPAB9L47S|xp}=ZuxUVBnI=ICX{rsf8hVAc z>TR4|hN^I_S#ci{=?{G-t4VZop?P2!v`eZHTqts^HcXwhgu;p72F#3w&pjv-DR_U0 z+Y7uXMki;57;o$o!N&G*aJCFv_@Eqks{B5qDX~831WX!m0apBFcETr|^Gi3n8*GC3 zCpvI-(PJcKB4k;JZ+NDkRANT-o#3MW;lQTfx+V`IxUsn2IET{=arkN`( zf_rP-pyJg3lqU>>FCjP`#c*p^EUaJ}HRZsf zKZP&b8^}fyv=dppC;tt+S}UA}tv z{JbNrB0{%<L-e3>{c7L8#_hxZ)xzMe zerp|W##SS&1dyU^9l=&_gmEMsHCjlmbc%Gop4<=1f=PkHLWlUuehXwm7UHp)M9a0{+r{Eup zo3ZS%^BwdSW&g13!5~|;k3zxEIBlG)GC8WCcy2jn*}?XQ#R_)7YBss5xi%E^11?s_ zpuu>=M2{lVKBzFxq3hFGN48IxtGw$G(XjMGtZ90BSMF}(#a&bFt5ztXF2^zx6(Y%X1hxIz`3 z8I%{%&q)4E(ljtI{=j{``)PqPJ2da6zLMC5WRxsBLZRvQfoWrz!bGPJV0e3w?uYCr zJrfU%b{QqX#O8NCCQb+7K*=M6i$bHvVu1K_^<1vPb7575`;h3M{V`Q8T$SfN-6l@-yDG7pxWeHaLn{p$kypTkVa7Eu zsPaG4lwI#+x7DOmT*N;>qB6fgE0+nLboC;Qtf7D*M#xfC0Gj%O-V##l*GN{QyW1`L z6>r@lu0>v7Yem*cWN)c*`T+cHL?lGB26w$uyn^vO((?U+@l+4ejv7UGEyx{^l?y?W z6S4?l-TMfPJl$as;i=J|jn-V-b#bHv+T-vINFyxmPak>^nP=fsG%HAm_@wX$ofZsQ zHZ`y=D+e1Ok_5&bun2?Z)WO7Ew=nzgl!w()@Qsg)7XdV_HS0I(auOt5Gju9W*{sgx zifJnxO8Od7e_<@Hh(Q!ZQ&~xzfNf*NHo!EK&w=DQaq9r)DdUG1Cncxe0BoCKr8^J` zhHwlXnR-OVsq1HDe55Wy=BdX|OlNNTZfhF+0dcdEM4^;u1m z6ZVi^H;yX7!f-#rCEq_^TQY;Knl;a4Z_#T>_Y2iHA!W*c!%{&NqvqOqJL#ePa893w3!pbO_ z?KH$0QVU3@AdkMz=}*YJObgpY!y_uvc$2uZL59vWU~s>G(yR8EooPo`n|+enWREUS zrGYL%XkFWFBZ~!&MLajD#<1`9I`P3Kioxdf^T+l`;c7M5@WJnTT^~6+l;V}8k59ma zY>KTxeSu5P)C+9CVcrmGC-N&3(kPVrGVJM3h`*8jlF)v7G($S~zHPV|pIOv8D|XQ8 zSGqkC&YVzH>DO1Ixe!)_x99i$8%9_)JEVycd&E1q5CaM0Gus2x6sKJlaQ1-ZWc_C9 z#e-h?TvQT!1^)&FO3)`i6otZZX)Tyo|t651Faon-Tr3v{#%?ngB&#zQPOQ#)l6e8AcfRx ztNtMj)Re2)`9ATv@!}${C^b4@+@$SDR40aHx&v~5A-NGmIe2NOiKb-ki*k1^&UjD8 zo)z_(7pGK#)N5NuKS!@ey`Do$Jna^rB>psZi(^1|M8d=rPdLmgP`+g6X6Z^v$MI{I z1;>I2HjZ?}sbJ+aJ5Lgm9@x`B57>e5M~9M^IYSD{q=DPTm}&L>;@panfuwSeNXg^I z;X&?^lTGPWWs#id9#$NN!Vm zNJ`yOs^Z(kJ#^|M%V)gh0esOt3g;lrzIvt8v17P9k_4|AF@uZ_w4J!2pjb#GX;Xbm z&eI8)pZpZM{11zt^DfXnWi91NP!4A_AI4Wz^jVkJCD<|ATGB!1_%2Nzrnl5ZQUJ8s z@D=M_ZM{m&d8*AObbJa4tGzg#hx#n5)ksuOuekjr@j8j87Qu!`o!amD(jlDS08Gcx zdhTFcm359bPqok2kzx^X*y;Uky;QtOw1$jgPi$1i32g8;9I5xvRF$|^JCR%%k)woj)6U2V&5g|J z3w1{}BFes_t-lc%sU_<~gU)vga%oG3M=Tl`2#=(f6?N-tD%yRm_%efrj8ieegg}CE z0;9+_wY~Vk#6Pjo8`58?4u`Yh)d-Xdb$VP}Yx$M7>ZNH%6T=98hta(H;f3ZYt8{VV z@aKdBDS>jJF1`BVF0DK0H9V*yIc_%dS8dm6XKT2rcOWgb-o75ATTz}yTsHK;vKlrT z(}>ep{1e+YnaizTRaxhGHx_pCx1z5fuc_2!Ohz*{F~aLz6?ef?s~oc@SuChjEfc{@y+CS9v|mpgh*Q zehnGeBn+pq&oHmXZQ-P-e^6*J31WlIEju^CHx74Oo#Q>P2`9JjcY9`70CTm}&nxR_ znSfjhvlOZCLCM%WBnyS0g#pyrK~jSli_b<=t?ke-FWzxiKOjCpL|j|nXiFt#kBK|_ z8keH_verbTQRq(FiQhLDepecO#84u>*g)3bCJ>NC$YF7<&Xet!wnG~+$ zylHvGVdeGi;=b=_t*;OIRP(2!HQ;{Q9L|+inD}qlovIei;#3vzY$J`+iUXRG_V|*)u6SQZC{`#t#sI- zrjm6@OME|7y|Ugl=PAZO?%pBZz{x}2iTN7Q91qbV<#`O5xDrE^XEx}y>=x4YzZG`` zTYR|fEb!4#4Xhb^%9pqt%F95628Y8OHFj~^PZ3@NY1IdjEi(-Z+dr@=7oii{W8N83 zA*VTatg%+_spPQ}aGs%o2dZ6AxrCkp7bu|)9cf@%{xICvWN7H~q&R6|bnePS879q3;0nrcd;h9g;MSP0~5 zf1?=`=VkkV6G;ouaNa9k2skB!I1vYd)ZFNNdDl60RWy32o=EKq?3yFmzP{#9aqGdM zYc2&2wWgZ)C=DiP=s==r8bX&O`c$9NOwhxl)u=wjiB!s^|B|p!)Cu^AuL)0VAs7BiQ{6Gi|n!_#@WKsDax$a#N^7>C+wWS-&xi z)}YK~2P=K6lW@Q91l#Lb8JjD|?R(DfTY0#{54^W9!> z&9P?Rp;h=aEuvehy-V0lM^@$!wVKe>^f_)9i+^DvH!-+9jL43Oe@x460uOlHd!7%P zLq*FuFF=O>V}zkDk@zMr0!8EX+I}LAKfHaXCaa%Fom!~U6Ny^p8rsJM zhSm(TzH$H^k%TbtwA4o3#o}NC;oB6kjm_I+=*}m^bJx%@fTS2*_=)*B?t7Rjn&o<+ zE}ZsXMAw+FpU=O>1LDWbeQ2MydkCYt8)F~aj}tGz@dTncAT4fijMsBB4Sx5(8n^};2RV5;6n7V zJA^}#FKBgYi-!?5n2iSUPj`5%w?H{JP_$LbLhx5&<>ak&W_4=;O_mwHXy)Z6Tq$YR zeab3~^qAuxK$;E2>#)P?QTmVI`onU6)N&oIz$o9<&<3RoB}cB+h;u=DGL&h(fJOjxj}`ShPQ|urmS}fFo`8h8v9=H zq8_JZV7$gM_>mE_41$F5sAYPP@MM)MVxYjQj^D2p%fo=ol+n>Mk7JNl1+`3f1tIX7 zCDo@p!xM*@JJv@q`wTfyDV?ds)BI^skt#Eoe>b+1qd#gjWP>ZNOF~%au{<=La z*imc3R!_fQvMzH6eEOoFe7m)kk|6uyO|l@IY?Vk3sCxu#@azrVuWoO&PryBJakAkn zm3Tjk{@=4hhO%?7crDbB_9i@enC2G{AiFNIklu*fIwkwb5W}aTeJh-JlNJx#w$x$tRp8Y>MiH z^6TJihlKMJg`do8ct)JlT^9(0>K6@y;_h(=GR0M* zLn<7~PADpDVF}E7AZ3>AVDJITLsO}YZk;2{WDLwrrE=JfG~^_r(}T^ivE308XQglraKHOlswXK zKx$a1bwH)A;zwbDdoF`t+p&8b#|vGqj`^H>Oj`Itc+uTCRF z8Jdby#BSVpFD4~**my_cDZ6qnG&~+#LlP_&Gu8@E;2vvYka!#ZRNWfe9yr8c^^_zz zR!pVvc5utlRjTzguYj&Ub;l1G_=rx47l_FSC*@K;=M%B;&@c1F1d(troZUwGm8#LB z`(|_q-}dBoKPe8Hn+scQ9ET}~Ky{9NZhxQnHSmKYXa}mpc;E@hk0EA%qQh1CN4p)& zf0y2T*`b{NhWUZ;?_=UkAlc&drN{c1epr5m6xK7|ckr2A;#q~=?(2Alo!sqQ*Z13~ zG7htBSy;j4%6N=%uZ^oJjiD|Aitk{<9J$cCLyt* z*9>oH&s#~kO6s?)f-Y96t@dQZX3E}CK-x?(j&qvl(LlA1&o$L5h_#4rH=Ki?P>&am z^CergyFtPdenU_|*2B0s%}y|DlS_mY?eLyx_OBZDXW1PE)rKrG4vJs>oX~(7*%G52oR{JKDu5P-g^g?862Ol2ujhef7bM_c$BaX`RkI^5Eqfj5)4~1>Z6q z+`)$q7qc2-rG&2`Tw>dD51 z*>(kYq9h2K?rYz;`IW?(wt69);-|z{;~mn;xu7zBOLS1%kx=HJ5i3zU8L>aQfeU=T zuMxii?-VE6(vxyjMx^-i(tLMj6c5y5yG>1FLthcR$;X6{JOinKB~x${2TQBVGgi@KzI%miNXATu@H@jKoQH_6x^?u_QY+3AuH zm16>Ev-^j4KUr-zkOmQANXCmxFej`7#K73WxVhGJ4 zBS9x&=FVP-NxC|dw9gbW+V{9IoPy*y8J?SQD0_Nidp;KN_VYcJ=0jcmm6@C*Dzw5S z^)jV4GRj!MoTXbsH3E7lJ0zQ?bY5m@5lSAojXXc}jG(ksjCe<{(@FA+!WL7{@^ zwasVI%tyGuBkPWBn_72wAYvzPB8CIqL8s{l*HF3eEIA1>B2xJiUVZU(1QNBhN1H-lze_GhV0A2~}D8F1tt zC8wNCk5pftkY9!Y_hfM+QszQ2O9!W;agH@q^fl2U4i^NBI=k#@)MSGh`XO#p$+Msh z&pyPUF~Uj0hTY6_*xiMCBv2;K)p$6$T#wjlFXSR}B^E`gPg zE-36q5)2KJafTvc)7--PD?*Qbrltw5hN}9RhQWI--JQmK zE?vYoK&KN1h%a#TlFdiP;W}@V|3Ua+TDU7Dp&4?QzebrE@$GN5_fdAq?8*unf1y6e zc~Q_=i>j9(%$ABWRLm^zIN1j(J8mJbA%yfB$XA}37A0DqQdjGsByF8@UNEsV%m50n z4FwrDP#y$EFksw4joeDC+(Y>vX%Gvqte1i4dy;sYQcB1SyOM;3Cip;2xLjr!D^kNc z>r;&llV1J^*zkWS(+ZQq(Oq$MzX zo=*`?Lo3B;?mcY5DY;f?h(5ejLHiMT7N$Qua{-KT3@F1{l37A{9+7$|xtetwyQ|#$ z!O5l|PjnOtao~#=?W(H2moU{Pe6~CPBo31%5~y4Fo>KP}jV zI?v0y3B?pI&n5j`M7fNUgp!x=)9mPtf^3dSNsy|_z!zF{lI zqZs*YuLn1!yN_qEk5h3V@lPD_EwzY>E(c(vb$ILks?#B%7Eo1q!2-bTL2(LL43N_R z?tWbhGqN7Mc&9VHlrtAyUJs-cX#HF>Zs>P8(!&m;g~jX1$&XW$7J#LI zYC;ysNugx(umBdp;N^c*{O*bxEg9CS>79&tHK#M*jUr!4b&}zEdr*kvGBOMZ@#EFk>9{Z@ECji=BUXk$YNRsX zD%t7TpaH?o5H!t9A`YZsy51X(@GYGgg32ixoF?L?+c1qX8*)3>iSt8XPIO}KtnzO1 zbK-xkKz@<4q=%w}8I&=sQSQ}2e8`4@Fmk_M}t zEnpEHD6CO349cpP+ug?5iodzO+-=hYSx^N;^#h}4PsJr>oV(W=vYd_O8jf`nJ${|O zM#Z4af=@W^g28TEC&iokp5H%6{l7?*&7gW@z15&P8LS$RVnFV?x+J0#A~e!Cy9lGy zb0O=4W@Y&V!W*U1>Okvo3UNF&t@`gF!Edx3Pl3 z0e))PGfl}{$W2x~&`A)}DnX9Lo;(s^8iD;;Di*QSr>qB=bwc?ife1rPxlMydPAndj znk|nM;ZvRGc_bl~#}ox4!M}F;fbs{kiKA$Es8x;p6fEGG;-!cgta_+#UF<3nP<|TY zY|}+&JGl93~l&4~+-y>w-lI?(wvp>qO5#i4It<_n%$$#~^PEAIvUAz_5^ zo(&KB6OT=X{Nk2Wk95p_SCgLhi67hWtM^|l=W*qsKiM8Q^CP-jTv7~T9Ecd)EkBpY zjoBw-?`a%3=6F=OF}mb@PmgrWK2Df%+Xdo#k92I9lapYQR89gbY&{%P&?4eM<^5(B zym@%TI`vKU$G^QxOKXHV;VDkIOfP07d#}Uy$NJy)xOFE@siMm#L)P;opXTj^8Ya!X&RI+Tl zb|IAwWeHNls_+T)$>m7-nK-QpjtRQ3|A4|C8eMUhxHp7yV(_kdv%b;idDt?zH1e!e zj*8nZD3$Db_49fI)C?r$)ITHcRGHe;c!5m?4(O|lmGra-dF7G#HYWq5zmE%7s*>yE zEpD9?AFKOvHW1k#Y-;RzkG7*VNQF_L#+#|fy}nlIa38h|FC3^Wsnfn1r;RjHX*98K zz?ph1MT8$zs3#v6jiFF5sG_877*sJ+HVi6cC>sWq=#>qFs_M#yL9e(h7@rCGb5y9* z);HQ=+K-k*Vd=iDwQb4+jQly9@L8*Onr*ML((A6%4>$yq{8o0~CcY?f(min{n;{??h-{~2rUUW6>(uT>=8GaT+^6hBVt~OXnxKQ&-RK;;Chw0QG}XzQ-OM5^TT-BG zkC=FLRmHZ+P(no;a$Xq+-K!$OV7N1|`tX3uLfD|!2!7c_QWhC>C)8V6E2&za!6({> z!y9!Y?pTCQO15a9U5t)tt_rmCYj#Oh z=xGi-@!a7+obI-194|_zAIXS(G&Iu2bQzIj&nOo!-ID5>!eh8m2}Wg{^B_%K zyqMNkDWkh&>q`L?WuBJ|MH%QNLs2f1lAyd>iC!xHyWVT9u5s*w|BF7_TLoe`Iumc( zCihV|$W@2cU}PpmJMh(sSWcQM$w!IC+r)A7$R^e=g*vT}LBEofToX5SJFN+xH93s{ z3n$dc0_3fKBSVPfF&IyHWh@c5JCGXVs+SlKnvT0y`9x-QnyT4hrOQSGkrX7I6nKX? z0u7tyRDvL6y{TK-4(o(jqYNW$)IZFKw9N`?mOnq}^jqs>eUUDRDZ$fd4a$@kDF#h9 z%H%wC_0)!!gNmtY_rE1(2r8AwaV|`&e^N>@H$rO7>J^6%Q*B?c*7lq@=&!X_`t$sz zLDL8Jw%RPOHs`HyhR_}tJ2HeOw4;147zaAkCt_aEoSPc12e?XK{NaTuis4ZB#;FKu zkNg#=CazV_dYiD`!?uZZp0KddJmX%mwx{I{-9|Z((%|h49WLxmLg%CBs4t6bX{*#F z)dCbPT3)YX@NxHoEbWE=FwoWXBVrb>e-Oql`3FnXyjA*P_eY^cd)?}vhYn}{`GoW5 zh_(K;p!vhKPCsl-#a>^pv)W%f+U-*io{UMfoFZCCkAtzD;WLTVaQ*0-Vke5N_X`>j z8-t7w)OZ%^>|T9}KFpX*3y6eRfDEa9-DN$f+<$uM!O#P6VlFq;9h#h2y*G z>SB@lym(a~ZZs;NKSCAR&}+aY7U0-udy17y4ZC{jZp|uyu(fTmh4hWb5STN_veY1h ztbt{j+z6Wev{$V{l85b(QN2{k0B^D)aA>+>uEQRauY3&pie3xpdJ;b&^{RO}1PxJI)tQ+Nz;ms!`edngMPrBJh z(T^G_SK-Cacq{cm8&f8`XcyYwoRU2Q(=k(A-YqGgSqzjELVKow&PNZFhgT=L$FaHas zj313m1_yh$_!&YXWTv`3Py#7*Ir9-3Q+!t$H!9oN1uj*+8}zJO=y+a}X126FkJ2H~ zA*tS$eQxy5SocwFWL&ZmJ|r}63k2}?zZW-PlKN5aJi;zst#i~{MUUZg=qW=m7B)Nm z`h|qHwwf&(J_P`Pu@C^*s)`!#e8xjSK{YVO(wafJ$2aSD6!XMEo9N!v{%F84$XD7?@-{}h|2Rd&Ke2HDJ9TcqM|_-iIn{0(8x0J;JR7ySqoO=Z zu7>mmfQ=v2?bsa!Y8X5zpib>gj|9zo-U@}n&~V#pH`PL>?=!;QVoR};Ei6FzQPbAS zeU`~OFpkbJ^bY;Dov#JnKWa<6P5fg#`H*TuWo!{ncD(d^D3cPkirr+o@B?Ihqy zwVM4Rq8#URmM?)TwY!zIRs}tu$R=WDg&ZVONk59ACz1{9+$(+^X$#;d{jTECszdb^xXxMVwhfwVJx$>sa7LCk*CW@47~^+2 z8KXXN?t=$1gzIClIb!JlBVJlx9hi9%njW^sw(>g zP1c}{Yk9GVG}_B@6q2d=OkHdnL|;g*osHbddWKc7FuDUQM_#KIUu$8#-a9+xhyEdM zTPbOa8>?{}Q#AZc9ltUpFaAXQQJBMkMLJFN+;-Xbi4M^WMbn&SXTHcbC=D5vI8jOtC$7DGdT zp1kP}OMUM|IJVfeR>)0O#D1)Gz(YfN0wOi?+#p>k6Hbty0!SA8OzK=IM$V6eNEFaP zo@~~>O$+TxXV8-FPH$IP)ZQY~h$gG6?e22DO`e(@XSn@k(FQ^?*2}6uEd1+OPiKemLVl!Y^_RbzbH>1U6T^p}pfE)otcJNOZLSteqB5KsCDt zEDmOF^AUHNFB6|g!0Hi)&MU=c4C4Zy05q%nczp~uim#tT)&SjG!fqpAeRm=0K> zI$ogXK*KR@bBqWxY}N_K1XN|3$Sk8V!6YM>!t^Iw-uW?sBogLhmD5_r1eFdq$U7br zOk#&5ThP0qOC`5s0!w##V!p;BD#rwpPL~{5!8%Z?I_ijcuIo@RfDiUx^Ak%+8to(#$+{U_me2K`O8S1zgqY>!eH~`JVg>HTuw1g zpl1P88UUlcihLeKs6+G+b-aB{AW5qor_3S;A9Cs1s3I5*!`wP1-J)!|I3|EC0ECG2 z#srS=lU;yk5)c+(=P#V{Uh|t%?uhor4 z2Ma;tfP!OgLHy86zl=mpWdL}R6BDw92_ri{^hnzI&1xRt3>9DYF!vJ8cS!G&14R)8 zcXrg$2_p z8|eAb_t%cJZ`@I48&H!LV|4og1LVB%1k%1rF#!iw6c45P7w9vlgW~AeHJ85Jx zyuC@3Yf|&yUd4~B!zpD+Ja~8^m@Ur}f9yP&kTVo{GAaJ`;XMY(j)vXbP;&C{@@a#U zA)>)Of`SK}*ZUO%q3#mx-S!a$#X`@$>b|Uk2J5R+9Sxi{B-Kp#RR6NW8?5OgQ_Ec zrwy1X=D>mmenz~Xiio0x-(Xlpo{NeA8z&LQ zgah%YKB`imcZ`;oiIHKgo}&1(pb^u*yzcw3P=@H^$hojmq>k0?v5QI1#VWGG4jEw z%8saP*ttjW9IK!Jj`r|~zyCi{BS*?c#Nad`tF)1gz6paQMjZD3Cc)F3iLT4W&gC;o zKqmi0-8Tumi!Mfkpj=^Dp> zzgx?KgJtaZL3OgM-v^IH&9*Kq-gK6?YWtCutsD-s?fnc@dYi@xl{&aAP}0^IFeFbZ z(!59tmVcb&IFGp?7SP1i_c-Rm+O1ohX>wvOW|lTe?-U1{9(XqukIr5|3wwHyhZk6C zK6vpSr`*&OL%qOiTxAV42bTMj#i4#zMT_VKQi3v!b5MgDB}Sfq+x zf*BI&jrezeM+7kh5-vnLOz<*;gmPEVw!!HLF7ckLmtK*g{F>1flr%m;Y%UL0kS;Jf z4#QT8X__ekUFDqB$id3L@DBdkN@RH2N1=LmdmZZO=1bdCkC{qOY{+VZ8rsANcFQpB zq*sG&{gj?RLd@$?is1{WJM@7~OwuBz#ff0$*Q_bJ?f^B%DhVtD`nR*?6q_^KdgFkaYUDHLd4NWZwD)yYhobz%VMw z?>T?`^BaN^8POP}3xC;A%sV%1sB}3rFra!}ze_QSXFqGEJD@uAoKm;;j2SI;o4f!^ z@nh@`OLVk3Lo1pfIF1}ha_n@tCkJU6h>SVaQfO}u#a`DYdu=WEl8V+Q;eXaI4< zTVIC41TA=K88J}UA>TCJ@YX7%+xF1`-HP@MSVKVUoavnS4C*7{c5*4?=QLOZQ)E?Y+-FRcD`b zs&q=-#W3GD#9gY|d+oK?UhhXB=4q3NI#EUGKJ={(Oz$mYC^HoE4sXBr(zW`a8LI9! z&Z|t-snJ)Xbqv$@?88Eo;pT;MMW%9q{y_93NMw^#(`-lL6DkZ}AC`$H8)~894n9aF#g=9W^#~@=gwiRV3~PaPz=9 z88)KzeHk8jTh6xoOG^eUPDD#e<-o-|zW}+9s{`;Ug=d3l8utLd*&H%M>SBF(^+xt` zHK2auQR&R6Q|b?Zm$^p!GDHhfbr`B%u<|xK4W0y%se`c;$)3srd%sJX#M}$Ow^TXS zPmOUg`;sP-kzXV8?doA-NrD+-5)wYTZ{7B-0nnTQY{*rlTh7H^K8+SLP05)4|Bj++L+l~{CI*Wic?NztJ z^3=^k#QQ;o)8r*)mzkYa*k!eck!Q5i+e8*2!DY?CN26Vy^Xvic(mq>lR$E8VH?2B` z_OR^#o2obKvL!pN<}eJTx>O}1G)iID(ZG!siCUAWk1CRB-pI&eb+s80;nvgDZ4M%# zhe{Fm4iR~(8Ypl-nk&8yx*bqu{<(x{?@Sz98IMu+75&O5#LUBu`(O5#Bwb~s3Hweu zO(n@QqZh<~49Cd6JwF^jJFf5&o;{ssapBdGa=i?my%RKz1dRrk@v41(Y^lH1*y7RF zk#kn?I$6hfOZclYh%o(-mSDie&doR3Ue>-weKCC=z0$%6N}s0dJM#9c)c@SQBPTs1 z&DVPhX_+jy{TxtERP9p^+>q3dF{JuztcGpQ9*RF4ug0fWg~~^Pj9y+MyotXf`x5)< z+^&#OKEt!AKoT-!Y?Nf;CJgB3#Q6RVijOW=$zIf-BT? z6Gonljbx=kz`fFQXQp5)QB81`zgxYrf?D;)!CHBlxS?Lvs}iI-SUP;nJ{2KC0Nle% zv~h}Gm;nM^-M#1g;tw6=0ddBeM++G6L-(E7@Y%!^Cl^zzafDNQeR=+#E!$7dDk zlNv`fL}$msO>26tF3_hHiQGeU^2H>de5KL`L42eS$&t|5q_WaL#mo7C-PZBL_jvbx z9s?lsbAmFw3n%KU)bAY~Liw4AzXbo#b11s3I;(?+#`ENAat3}kr*-Q))z2cQ7R53c zDz>-?ERoDdd2nDeS}DZl-$|1dDP?K0&BQ}c(sr_BHXNxoIl4~e2+HUm8eW01Isn zQ=!kJX6cxWL}I_D_IW4xlDfH$BQOoq>2P;{McrY1!NoagySMHBq}y9;0eRLnMR|+6 zx9$F<8xRykFq_{|7>F}1bZ7|S`?Eo9f08JM4EWd`#@)Obstz z>u&E$N4-S1y4(9MRgmFb<>VtSZMOsAyt5yT#^7&YufL%uqUjYeQhrW-5QFV2XDXEK z)Ss@<8Po8%+Kk!~q{t7w;d}kdu6O)Ibr_bP z)X_-Wg}zFDZQ|5kbt48rBFSM6EjGdi5;><)B2>e~z$%Y~1gl_trZk(=ph{ZmdUX*q z8u7Sc*207QS#?|1@-f_WYbDk^PTS@|^;x+3BKwo`vQpe`*1^|pSmyb}L&hpD=bPIzKwdItZQl;qfv8+Ce| zOP?#K^`!C4BekGTUVpxs?LbYeIP)>ZwJYw1d?QrsO3UgioEJM;uhhaO%WjM+YXZRR zDsU%vFv|z(<|=|;Nn*o1XYJBM^gTfn25^5)iItolnVn7I062=DjndEHB7dH0@R=#9 zXAbL$3Yo}(vl6mNo|OOF@qIrixIVWwcV?!%PFdb0S_}-{7*Y}x&+y5Ybet_W!Zw$U zB*wWCHi{qM{m}u25cyLJR3r zeUpg#TR!$|djWL~Lv`%_k9>}gJQFMjIC8(@&X*dJ^(NKnwRUqQ;ytX3nyRVnWVd+9 zD~~p=E{?2$k3s%QviRoJ>N&Ir-R4xiH4(h99r(3SQgYp#yzPp*8~QkPgqDH1bB%xp zY>(B;HS}yw%fLxEdoMbWeZ}0~#+HJeRM%Eulk`>6#G2v7Q|c`Uo7XmwO*D=$`a#44 zN$-SuhZt^s`MRKnIBAM$`r>6L0~?8spH9TfyP> z>e?K#9;hCga-bYjhLptSIL5-aYuuQw@6;%5h?uxc^1b06EX=~iBWeyG^xJjU2IF^sJ)=8l?Z7p#L<`gU&WI2R~|Ex}e z9;WalDEGigFixm0F~g!KiLX(VGNczJS(Od`bESSiJN>SwA6fpt%};dN8L)SO=cxZZVLHE zcEmr)chSW`U*4`aSE@^_9y-^T=i(gn$`KO-uHD~41om#Ag7T1SNXyW*%xo&ZqFrBa zz#TxjIL>t&v$oSlilfkNd8z^G-W(19OBDJ`QXtR;4n~K*RD%PCgljxH&6R}ZH7Ft} z_|Z(%WNXtA=k-oWo3Dhcfu0%(yF39aSE!#|q5y|dB1!JQ08;z?%*$~%HCGYp!J^%_ zv7{aVFL2#wAd(Z1)6#i?JL7N`P)hNhb2Vuiw@Z4EV!6MH%m(%uh1}2&w`qKJn-8m3 zHQ_oBh>!K`HA{v7X`zzd>VeRRF?#j7!7AnAIE?B+b-0Cmm+@Ma6=He)C`yD|qVu6y z=8F3XDlNnsCvaH$HBpH<=Ebk5drP zY3%|+m#IWg1~PWtZ-TWPRsW#_GIW$=22Z|Hxp4Cns>@74fhD5+fLa7B0v}#Yp$qEG zZFLLOAXa+S?~ye#M0~s*&m;L4 zt@uT?w$=c_jLptDc2-x++L9C-DcrC+&!vNemvjm~5dk4nPI9rVuF?7f@WX%ef^E{h z0R!}{8`WK`Wxy|4s|5`>50E-;w16x!@lc>4l59JjHiC91dxODlE1HQG`_$1!s5JS) zg=DIaF2fh0GlC$tIxz4x)m#mrdYjk*E8HxEN$JQFKuCVE8X{3J_p$|uK?q<%_SUvO zyXU)C%Nq*;P)-}t&N{wwh3QdQm$rhVmSW67GqSH7&X*3J^FU*`SmgMJgc; z^(Y#nqI9F#qMXzltKc`S%utwbLBxHZq^70K1zkUfMW(A~f+@&)HiEpwZ7vzmlsB4g z$BWGe)zN54VS2oiP&uT9NdwohZMW_2<3^- zYg*-;q?Q2SZ~n2H;K{b!-@~5x?^?r~h1iP>)p+BrtshjkL@tpjB*z1soq0v@l$uf> z>N-W95B?F^AJbK$n3`sYUglv~qLJlWr_}jodtsKGDm0lCZKe+D3#=9 zF>4{RMy+l}0u)`uR9^Q>klD{yck$tlEs@$J>PhDQRzYz#7h#s*kLdmm+Vijq*F=#| zWrfC3ki&xI#KkwL^#Q{(acQ?F>p11~pW~p0o*`v#gdbFXYyVU?&f#{j#)rNt4;$8( z>xOA%XVeA->-g;mgAXrKQ*6wngfzW~8>W>-Kyv?#hL>8y>NG2$#+n2epEp3SEG$=a zizlLGwO)|aN|V{%-(pXI!mbx%AylpGY`w>;|AH$e`*AKb535wVp^dt8ZiB)+!`}+U z2pT6mO7TK+v?j}2{e!N4H?lYFhJH|K1#X@lN23LxKs{AWfC1VJ3*j54QHe*s#cs~9 zz>Duwr%;PTrBui2GXYu8#Ikj3zG*h552Bl3*w~2N&Q?jG*)RMP#A?B&-9^CkL}%Up zy86pTK*4WBx(7`PNtg%J z@ZLFb&RQIYPsojXOyAC9V0jY7XM&B9n%xUwkj!I! z*UM^V3D0Aqx(tUR4lhn0V{|4sP%J6w^JrHo#8RWYSUnfHNq<1yMtMMz9=M|-3U*d$ z+!EEsdugd#X&aaz1MS$QZlPTUy~#Q?OS9nykSzvKAw(jt8Y*0E7J5_Zv43^1$JjEg zh@Lo5;`$yFdm6Z*r_DRnC-m?(nn(w9Qr!_IccJ$q)_Q{1@UeuD{(P|-jSfJ!yeXVzJc?~+ z>xpidPlQMM(L~lnP1aawfKsE!jJ9RJpppCI*X+ASE3U0-z0IQ!c)Xln-_L1U#?3aI zIJQ1)+^Lc?ppaF8?H^EgYq);Y4pMZi$%0cH!5T@a;`=6+yFUq}C#u&OkZ3k6>-Yl& zDM{!=j?82bF*t;pOYZ%#AD7#lWk>2GcY0q*Uw6o>CSTl>)oD>Es*7Zy5Sn&wjBq5% z2D;v$PGJk`w0`w-qV-8*+)1ZBcXrC7>L%MTNeHZ z5HkeBN%by~hlhfeXgu7T10{&#RMbEMgPlf;99E;WLVCW|$JSF+3)}^p@;tPO3g_5j^{kA5g5#ir9sJ`P&cA}4yiTtd|eYES2BVlj$wOT z`%ILua5&ByA)Ak?&q4>SQQIN9MPUq4SkrYGczK1fV?Ca6eLCH3?ik1Nva+uYql)%N zA2C3k7;4g<3{Q+7kkH!wy%d#kmk!s&KK&i=3F>q14W{^LF7*ZWf5ykFPq}AI zxWIg(EJ+hAj66vs_Dr7_AE&-flM+{T=$i6>Lc|AxIf_Xkoo?|^yWF5Wx|jzj#q~4V zgh>~oILoyTIgo*v^R++1mW~xz#$Plq7Ug{6W->`2rr2Y$ge&**E)ylauz^P=0%A_@ zQm-*6pihVo9hZWT%=qoKb3ftuXEbklo<2F7A7*`dyKU zPg0ZX+Zxy)@+4q2U;{g0)brM-%aDo;8Tuk9Z>~0$oEQ7P@(ui z;U$fvQ(s6SJI!aaQkGpEN4pbZ$!zetScopps88XX$Z!HE(TgG0**uQyG(1!eBlZ&=3_hS8CE`WOm_0ps8n%U*!o9Zlmq;%$jFA&3<6nS^`UJ;iEyY*pvxnP}iz)9S4?A{Ujayaq z(>N}X13QLjFE?piXoC9vrr_MaX#)9PHC`fOrbAcYiUJS6S-ln@$WuMoKr2)p;doS1 zW_swx?>wqGG!9&+v^b1%bUtRzHHYz8fli-*9YAIj$!R9Xt}js32Oa%s#xW`bn1Xb( zW6IDH5CwAS)^37n9r4w8BB{in?557D*zD(dGaLYAw&az?KnLdw#D8PDo7wP6VZ%lj zvvd5wb7K$ASqqzeUA+b;b3P-Uz{Fs9fnDFcxUL-%RYYD=H#xA}z}bgeGN7Nq6)yIj zzXP_{sapVBgl+!oSbfoak|B3A1CVAF$++Hpy`n+cNK0%~(QV7Fi~s=jizs@pN(ZWO zmB+wvkr<8Mjrvk0v$mv@n7VN-^W4%7wf#qG1{;A|4Wc-np~p}767P&WOA+5Hr3zgIE@W%(Yl48 zt`p|u5Fx(BS$<)II|S(5z7zv0M$~S+F41+6bmZqW$yZ>sdgRIaIE0}M<`Ar|puffe z^J@dhEKJxkT94!Ldhi~t13ORF`EOXK7D_83eU*@WO&%Um`qG8>cr*T@wZ6-&^<{p) z6#ZsZ0!cH(Mt1gs>sZ8c2)tiPsX1!g{{z|KG|FX=)Crwe!gNQGj zE7{l;22RTO=3(_(9vp`Y?mO8f&BlN>gTX8FGcp)=lKw@?m~&H*;&20!Ams02aAa)e zocc*jrbHbpPTJFGLib2a+FBISy9 zhQ1W+r6G(G2aZ-l4GTz4U}0yg0nj5&4CjmV)~*ZrXGJmVfi2#S7PnZ8L2eAEF4w7n zos&(Is19wD=ndjcv4xs&vKL32+ZWL5<|fI#la^$6Q_!3O#7YIpSY@&cO6czi&lyKa zIZG+Kpws1$&!C=Bf7fL8Ss;D-b=93`U zYhi?!fzX$f$!*+K=?lOw_OQBHE2sOA=EQG=2R^c;s#|htA3ztO*$R+S>GK!v($u8= z9V7+F$+7iJ^-J||qK*7L+$GNkCdDbMcFarM#-Pjy<7yjW(ddu+F?^j$s}|4>HYnF| z@NM;5)OA?|FNl0Ro?GFaa%pr!4**cLwRGhCJK?Z4)l4E%8j(>(27cs>l!YU<1K8~+ zs#j`bggp00DSeTLS?gow8Ik3t6Z#A>Lw53bI#LO_I?Z~uH;<@QychPrveOr&Bk{1v zv*uIP%^hY3%MZ`m4Il!apl)h~JOYRsX%HFhtbNBge1`0z6^G&G^?anMddq}vjmI8F zLyDHHk26Y+a{8tl($wk@Wh3!0CiD#y|F0>X*<7GQoxns7^ko{%p~koi2TTA;t^HP}lS(r_v>*;LR)=EG_oMoTu1p3*Jl`<1{zB7=g`)unD8Zy0T~0 z`L#w!S&vgo#+eiIEE6#n(h&uZQnuibW>l8>Fd(4*6X(`yU>P)rg@pw-c$tlj>q?=S zY%XFr7qbz_uBb3{`&RWKk?~`u=nVcC*7p(cpK2T)E~jn>dW?Z4xg0J?)+KfCfO?!N3^+bla9{u z#H8g*WljhTM!863~Mu#_d>X=r9Q7Gh}pF+K7TEahgdyEPB7Vibdj~ww|Q!L-?-VTnf6=@#e55$5)*d;`Uh*t5f9V?J$3>5 z**VD8pMZf-jZYK0^mm%vjLmuVrEXe)oTx7%na9OpoF@Dw0=q*J4W23-{b)H`D&G7&75G4LG1o|9tbp&qQ(C}qGV^mJ26Qrc2~WReZ@_B&LCB{8X{ z!o0dwbFZRom2-3rNgCc76DiQr@8Hf9aC4z%??e-`t4aB>GTmS5*rOy%B+W>+q2IzA z84xp{kRuJTtY@!W%Z5bqhLX84#JwSNM|0^W7HdKJ)Y>_EU0jEFk|Lw9TS?HR6x3rJ<=(b8G@X zMF<*ko1)sr=xB3A9TG=cF-4}`C{Ap_;(Y|WjN>n=U$_k%0xSe?N2?kTdnpJG{T_Db zrD!$6l|A|+@xhBm(1_<8$TuMJKdgS^w%h9AY`d}|#B|$jariJL9vWl6+K`(FkqM|R zKey_d1@lAd4F*hOe-#U84+te&&4bMk(OfnNhPiM8`6+lzI$NW+aoS!UBrP*K*W7yu z*-0xMhRD;^E0Yl>nSq0(x@6pJJx;YK>i`K36V+w~N(A9&yfDX#<0Apr3C^uGV*J=r zxsQB~BfpRYo1Z6ZeizfJG))&nJx@}+`CpMA79&w!0p~QXa2Y9E$3wg{0zrJ9V(@$Sr+hJAg9V6pl6sOB4ae!{?;yJ( z$#n|FDf%WHn7^d%13;{2_5w)q3r~>L9vARV0KN`o;#G7`fH`e7xJT~woY%h@fy+I36|vs(_L33RaePuha+FA4q{G5qC)@;k;q#kZs#~i5`sPXnX9+R zsFSyzi1F6^fE10w9snkW!if*u5n{Z&R<4kv%qslshfPs2!k#pKG#a5%J80o#cS7Vq z3MejqS>2PsPNo)-l~LStfVVx8#N@Qd!*^TphmjMaqHi_7jBlw`jQObt)cc0QBYF^a z)NaU^y=D|fcF!lG#)#LBHDQ;1hx!e>DKv|YFXZWQGSAWlGdmo?cnZ9}>Chy7*O2(;o?evO|VzB~n`PgAt@E z2i=P6yF0;!^J-w=A|jKNsb$1)99|is=K4}R2lq(d-M!c3Z+7T+J?P^I|1l-DmFOTL zxT7{%cwwwzKk`PenWaf=lrK4ED*NLqbrLK-U75FPKzh13gB%m=^ zWPwrhR>~*K6C){0r`Km>SjG`NrH{oDSu_;raPTgK+s4bNAw!UWedBQdAUPJ^@^Lsg zX1T!c+r5oqz}^eXcNj`v>EBtosC#KdDW0ONZ-M& z9#W|F;l?~o%Glp=lpZYFCQ#|%zYU9T&Z^t68R99Nn6k6I*mn)fziG0>+-*)#r#zX4 zVW`0xxjm*Hkc&LwAb%2#z7Y0}FdZC%0!R!+J+mIG+6AGANAdmnB}^;y`-oP724~>9geqeMbIIa4FGl`FxT852In=+CxW5 zRMW2VJ0* z0c4*yFM{#o$CjkEw-p`xQNuv%n|xpnZF;|r$NoL=y`niFlGGQ-lV7CY)us;71%RS- z9+7>Nh=sjLClTtVeatqm176s6&_$6cMo|>3Or~)>7IBOxE*wjl;BV|l%}QrZqGsh= z&r(*@Xhsj;z71A1Swx1Vh!?J)Qj)s+*n;>&xQl={FJMs>7uP-Nh0B$wHB#+b0L}!;*92H8nA4`fzfWTP|Sb-o_}-6adX;va#o580hv?GryO0ltI zWuZ7{1pYGvZi=UwzYl(Sw|WQ8JJp=S@LTHBM4Y+EBl;#aH{zHgH446z6!%>Ot>}BX?&A#_(4vVa zH=OzKNnplX_Y_Gs9%<(idOk3Jw~0D0-R%t*KTH22$>;aW7=_y77_%TGi+cRo$anHt zXEPaZ00b5&V-(c;cJxq`IE~6TbR6?AF?K{asrHdbW!L3H*Q*9b5>OtMw6@ z8HC*KL=8i)pa;7+D?mScwYrrG;f^&W%!HpPtq{I94nI0Or7p!*IQLqSxF zu}-ks~Qvzu~s8TnQBl1M(MZ7Bx@8-`R2S`9A0}L!-_8+>%4ovdTSiyDNGl% z4)V(n-jAq1TS5h+o`7iqO^G(d51-{g@4{-&x6sBbXw)`PLS$4?pRJ`YJ9ZzRP`@3& zkLWUbIAcH50||}6VKNcT+^9U<5PlH}a_(fXqGs@;ywYA?7(Dhf zs^h7N-!j71?@T`N#oh<4N9IequwhL;mPODTDDw+zaxS5%4U!el#kvwhGDSoAH zH6GTk-v^x4Sw0PCJsvvr{pvyO1*5)1I0(v$iR^O)Et51x!`fsWpD>PpD?W-Pa@(dk zXJq}@FH!FIr`&0F68JMEnK|?PlKC`L3-kNEW>MdfobT>O-xCdi@AW~|Fe~FF+^KGX zZa3BB`q8U#yp{A^Jsp;#1JU~TUPx9NQq4g(7dsPym|bSJ z&WjXo+Qx1t3T5O2)+cgf*CQ{Ef~83$)`_-P0d4S!MHx^9Ljw<6w02(Hyca!v9oG8t@&=O8Y`R*@44g(SbEs?@v@(}O;XVv?<0f*m& z#wPK${W@%R0rr=ucXz{1iCPfzI!KtJ^`!EbexNTsav>+uL-pQ40p8&!^XQ))G*hd1 zpHL^ggzEMV&^de+AG3wAy*{a-*MsQDNuij|bp|_1b$CPG*5J3KU_R4;-7rQG$W-=R zHA_WrK5r*BU(TIcJsUYxd~e!rKJM4K+0Uq3yG}K`UTsxYgh!?A;m>95+~pwmrJ9ts zq9i+;!bW`ESW?x9&c*LgGzqE$Up4Bke`Ol4`h@C^~FC6w>2f2QYsM=f$Ock@!c^-*VF_i zdgOVzQJzeZXE}r}{)AD<_Y~21k*NG%aHlu9sczUfioQAAt^rOLlPv`y(~Npy`m{hz z0kQa-jdG-fKDx99z0iEu_IpXa(~X;TG{`@q*brp$Dv+mNR)06JbL+Tc!KZFEDchom zlYc7dgZ(Oq@OkQ& z5)23XjT94`l%fA&k56`%Ayi%--ry5_1*@M$I zyja!W9yQ;F_xwB5n+ZqxbJqKx0_UK*Q~S^C*De_(C+p!ssO{(x z(WVTRT_y}b-*eE~R6u+z$ z!Xj@6JR}m;Rz!7@Lpmef=u>n+jnkM7Yann^rp(fmuOAI?BB%MN`4bTS6?JzjG-`?Y ze9+K{P6ntbvx2Cnx9&~|3xKm{XM{4LbbnJ*|1^pKW`Y;C zp{MKj;{9ru%VfXgLpJ2+MwvCgk32s5fpq;In&OA{JjU&J^-X-JU(=D^XG^44hpbnb zv-FiwzX^6h<&K*`#XL{t1Q zYK_LH7+QtLO-m(5f?Hq~ZIm0@txv0Wn&`O>pT{y^JGMxX(*+zLKhzILP*cBm@X+Ca z`qdiO1T-{(odX>s$qoulpxBXfS3C7&5z(UT@R54h8goPIeN;B&<+@^88eSMVvo+i8 z;)TLXP12+JT^=5as)KLovR*ySuvFn<1Dx&`czBBLL93R?K~ZUjWdhduSI%S-B) zGeul{lKSa74N^r#PJoX8;7B~ph#k~O)$%$pv^UCQ5XxWY?Na+sk%2@uDF(_;2TLuw zJZmOhym`;Jb-vL5z3*g=?*y?ti5tqGvoTgF!iH6jbJWlwdG{3i`?>7Y4BV#Mf0LC&h_dB?pi+9oUE*tZNWTwZ^e5K;z_V_PnDK(lt zBGu5cf5CRw^mbKrD8wo+lPI8@<#7y2I5xE4Zm{sR@wbIj2sxdq4s`4 zqo2gjG!m}kDUMJme}oGVtF0wss@g~UboDa~J*VHo+t8VPpmS=v^(ZqwSEt~5zK}mX zfX74siMoR+lC?V4dSO*hhszi%{>a@~j@Hp~9eOFJG{h&;=zDZy*yd`%C#al+Gx|Pu zhr=W;uJ8GwsCzyNBc!kgPgO?0`rW<`(WX+U4p4(E^L%ahC%@Lc*;0rU816tp8H8=N z_Iy_iSs?iqT&3TjsLGF+?Qh>xiXmnqsMMf9u`#Fn{eOcZsiNuIP7>~cp0*#`fwqK6 zL*GPO*E8IH{GQPmwao-kTPJQ1wD?V|bz|+{?0IqwYm(4Y$gFCsj$CHU-k&zyg&xfE z{+dOPVf!SS3q%w01kB2ub)GB|@vVfB-W0hIA5mATNawOpNk{Yw-dI$^`S(1-o}Vft zVO81sg>OEmE_`kO+dX?@_+rL0)@*$fSKYXJ+#WP2HB-Du$>ctEQP$Ttan^;it&4lU zH-@vBpiLPns~AKSoIs^?^BWXtJ!qYK_WVc;MexsX+Veqp7`|!2lxw41RJHw`d#;Y5 zjFYw|g0;UCrjw~x)LsqAU!rXH`1a%k>gjpioU2m z1?U-S^5N|Q_}#uQk83sSKr{%F-F4#K?mF3?XU87D4(7M26>{%=QyfR_xVjnV|FP$} zG2C^A?#z61~;^t#TIHj#(ccE9 zz|@zgx%VxVvr$t<6yau6df4Pt;qB<|jwoWibz=j+Znz;D^bxgo}rvEox)xkh}BAA$Fl2T!kQ_*pvz0@6n{yEYl%_>q@9#p@qRoih6?@7t=4yOVnYgC4t zxUpUI)tZksCiSXPDSfL^r!YO>cXWo=k5Y;k6vFXh1Lv{jJYgod$fSp0^0Dw|aY+z& zJhu-iVI$|Rk*qL|Oe2*3dg`AhQ#5!E6ry#@)Q#QyC^f1^Yxp7cP*-TPz*3d1wpI8 zFy$Rg)msykuIwv=G8Ha_Ll+T2-{!N_ zo7a&%L!>BKGbd0vfh3wvoR!zAqs>aAijkhe@jCGp#}2+eZ@(VvVSl7bm!eBGoLZXL z2BQKC(1&R~@(VOySW-1g0)fhei9Vd@LuPJaGtp0#%KR#UoG9mKMS-&+X;AVxfF)8F zi^}JqBrmF%iDd|`s|N2#oFQNyA;>WCrJPfgVs$e~l|9&eb%mObMu+{XI=vWFFs+4% zkQkjipvzPGWGW^T>!M&RMoS>e;^)+PDkG=S5Yq9I*aTN1PLuXru1&%HT}2Mhd2kSa zf(n(Cg3l!xMUeMSY5VD^t4>dG*%p{6alEaH!hAaRvd`z6Vs3rtp!TKe zEv6{7inFPfI3KLqlmto36fn;DcH9vR$yP{>U-jKYJVM@OuLA(&SENOXmD&nRC?wZ> z=uvgfY}w~NNz`C2$z>;A0Pd#qrgWt@!Ot+-kU3F2YfIxBoU!u? zN*F*&Q_Y#*P*EYiFzN_rWK7*<>^iKJ7wCNdE1*;3Zy;rT5@i7F0LS9CC zrXm;oWQle;hHPDQd#*OMUv^bD<{}T0)?+@S?!p6@1_{mt%V1$ML9<-NsV=lz!G2a`@LHStw>%yOiLKmv(i%>f z&GOPFhoh&OD1zm_9$mg&r=l!Hoyxd+$H;`1%3C@{{KIM-B1bn*;5q>?hM>HffOJ|~7*NdlATbczEH!zOA{(6)cZtO58{ZUEJ^|U-mK8HT~9qM|$J#>TE1T~Lx zph*u#5VZ{HUhsPq^3_+vvzX7=fCXOIs>ftidQHVG`hp1cv9ouo%7%nT&FQ%}kQD(I z%RZF+LL*qKl`8@H(Z}IXK~6KQR47U_!8$n^omBbEt*@Q?iS7%2UV_1e_}NwX|HAaU zE^2d2-O~sb+m&F3$_@w^v9efq%g35J5rFsJ`H?Fr4Vs+n=DQPV=wH>V1hmTxsxJss zQ+0CPShKVTgrzAo?2TwjBl_v;8CziQYLps-v9baESx(%OPA>MVq?fX!+;gBaAn3dSXXZ;9sK`k(`sEH6UO2y18A+GEwt+n-3wKs`aY#DlTA z&Wy>w@7C;#Vq0Y0^-;>zeF4eFp3!WKB*d1cs@g4oK_wOZFfcj@q?opCDQQNnb6%xw z^3zwT3qxrrEJ5Fq20oDKwemtxi{$#&)76oVyFgbEuGfI>PjfavUyiTDY=JBw@h^50 z-&R|li{zDS|A;%Kn`g%yFfs3eW*SM40BH$yjPCunm(}|t66vjJ0p ziTUt9rs^=sbz626JbC4R4uzG*{BW)^z)KP}P-^+lsqO0N8!-OfrGAG2HlPg%W_S6N zlxYEbNu!BjAsS77K%@2uZ{Z_M1WRRYcomFs1}h8Mbs&^NY&oHofl{E)f?<`AS{ASi zcuj1cWJ3F1#w~X{=D>qdp+QiWbj2Mk9hF5Ag3|;A2dlQ%ST} zqgzBfazEx`Nva#M%Vt8|G?F04d-#6!CV9#H^6?PRfpam+G~Ss=DwgSdUfszm9T6lK zFtgFhGk|;Sc$ZtP)Ah>T+TA-DX|DJpouWwGxocuIZ%CtdMkr{vW$-J zkp7^IA~CI(%>?~6{1I6~ZMRdVO@NSfOr~okKx&omb zr#E%6mtYspgt%QVOPAwZU<>8w=D0;uj_J9Zr3SWo09f#h4y57wAc);AoQY>{N5UZF zA^7((!Ou}1jy`O`B4s?X1d(8dfxk zJ4Q)aM2`2f#N>K_tniTj@lCKz||Z1CN0=i-V&HZziNIS4l6 zES(9yc2efXzr5DS>L{9SqLs5j@5P?ELj7l^oJb8|-zBG87R)RYw#YmSX#%31L}2B4 z#V<#$Sp|J@mug5wL$aCpv&nH8eKt;Ckvf7DpPVLyj`{(1RNLN7lrVt)D(BB5SAgI| z+n~po6oJi#)^8^%&2kWAZ5PhQrUfAn4nM$z;W{~rCTe%>OyGNTpcu1aobnC_fp)ua zHsltBJZKjSE}A7)EE6~D<^Wm`GwTKBT5T|xmUVN$tO3Xavv6!-41<6=S~(N$GDq7O zh&+)0CO=Hau@ zipLfGOq2G=JWQW4KckIvF3ljW!!De80*>=A2zjVTxTUV87zp4}LPJZZx0IuA>@UHY zMHM%>;TNq&a)AZ`ezbBX;zOwm7~rmuTG&^i z>r`?YtImX-XSI$i$DGov2leZjyZQL!v4h24X+L~45A&Ba)!7pV2;3V3)Z>sMu`@Mb zKtgrvKBb|(Zf2;UogOA=$A$y9V)Gvx4qzo=@95-hvvV_3<8wnn4uasLtXvHVUpR7N zm|ohEV-rI}2-CwvwbR2vwPJWp9i5#UJ36j4hRgn`X=f|jv_k^yp<$xkL&HJ4BGM*r z7(S6UdBae!U0pvmb#f@66;?KW?8uR^nW;n94ab8M8fKuUCl3w>%;KLpFg17EO+%vm zO7ST{JR|@|C>}dH94eZ4We!XY3An;6#5I1~u(%%LKo5xrq66sRFpq>`M3IxrUdxPO zd2C`hc!o|hoDu>0$9^#ekk2 z68Ev_c(%T;KpV@hnHhTPrDpIx9i@*Vdj*0VEt&~)FX2MOYlK%j^-Tpr?W~#!c5hWv z2H8<XouwzWl{ z1^XlPU>ei0Y;NXklH3Z?#O<1y*hf1Moh6%{6A5nP^j44Bb8xTq9KHLTO1h*5R+@!i zJdfntq5C$zW_qa1Q(tXd_L=$a5e)m$8{NE!5pFGvBD|LUX~X%l8?Q zu*uoQr3?%t&jvhED<@GMQ*j^*^-wR%vD52uKVa5arK z^ff4()$&4(r|lIrhsdo1%RI!A3stuE^04j+%dX6Uo+8Ux%2$-9G5y0jpy80oz))W# z-8`&5$aG`9Y=mw-JPb|2=&2P&F?Nega_OO9ZtJ7!V~K=6m@^EL>OZPok`4(C<`6~F z&qsANvoW~jwSrlv^ry?78DUn-q?Gmi=G#N+*O*YOEn5(%#^B9_HHS;=AuVhif5S9M zz8xX6cvr(i>a~nY$9uGMF!MT&a-s3}8NLMHUon@SuyE$}_vci6Na?By8}4GEzEheQ zOq|UCYhB&NVB0R2iQ`HSZ3`b#hZdS+7{|-whg;MNsg2@RPgex(FdUU}I-|FT^(rPJ zVc-?Qd>Ep7gPK}sj)Um%RB4*=j+c`j5hlh_6dsFjO8Ag!*240l9UUmmRmRa(4Wl;G z2KQPafMI~ivFs!b{bZ^1$j=z}?AFJWG~kW5Oe+Ri@ij9kZ=u&VY=+f4?H_i|LyHd- zJfvH}x{6OR2zFP@L~oA$g_^^m%kh13++%k3P#LAeVa(o-Yi z#fXzQaxPu^m1 zYgWsIwFitwnTy517_FBHWlx!qMrX3gp~Zk}m&=5sp?Xxp#)vJ01X%DLNC%1Xec4)9xKBIxsKq)ngtEl z3506I6EcjDOB#`LE?h|N=xuW0{dp`Vx@8taL<>1Myd4}Rp6%|<*ba$T<+J7a z_}n?qh*z7BZ%XJ&^iMm0quu!Om`jdvQip%!PJ?n;wQl=rKQD zu+eJ`Ud#ojMdpe@Na>L~($6qzVA>Y?2)eIN(5%P5=@o<4J zb(5wu+Hk=xx=g%H+AyC$dZrE63B+bK^$CN3eK1b!@73KvqEQ6H1iPM&Awvm<4{%+J zH-vyo>DVvK@=Su1pLtsnSnAV;Qn16H54^31SERIe6J2pS{62_ z1K15R;g14+dBE4L1f^r+ATZw#;6CNv#kbT>>}=!25fv zd1yw1Ee`1$|79A4<}ZiP%od)uFTn{}UVH&MBlH`EU_a*HsLqPvk{m zeX@>$v7CQTTEjRribFwN(rl)Kb5$gEQMaSuTx&;VQM>^)eBspnk}_2V+uyBAA~iV- zaj-+5K=-&EE^3ak#-YsOh@C)pza8Q`80Mt6Ve~JFQl?vr3>V$J3=K|aSHebXwz^zL zSzRNT2%42fb&YDmz|uLe_sAQ)Avv8WK1$sfn!XlZN#$YV(!c>_d6kuN19s@E)d!FU zj2;NBfHponQSyg-1VZnAogvC2*fiS4QL~j-5&%a_4exV zGHOqnJ-)21?^F-zm$gs7Ea$BrsiNTwI92EI%WKt9;S$u0Fy2@Of19^|n|I%_tTym> zwY{u9Z7&n7VkW4BtB7<{;}-$PAbq0TDt8~w^eZ0C$vFBZQsRTX(dp*43YtM{va(v{ z_K(B~kCvN|Fm>CyF(IR&>$+?@il!&(_Gs6HqeQwsZogVhFE_&W+IZNm!^S9;bVrUO zR9%i{4C)IRnKrsgT(UHzK)kH3N{;9ezz9U%8QWY)Km#5K2 zJ!nt~*lZOV-DCeML(t}I+)mxugT{P(^}U{569B%`0<6_E&rdHSfY(X47CuTc|1el% z3L!f@!}3t5JGc=NYxX04AJ;zfdHY!nKU!YJ6@dxh@1v9jILd#=Q~$7<6WJ7u)i=hW zsgrp_Y;l|=7Fg^f_hvAUcpr|aC&cCv^=C#3Mv4q{n?tp5p7aAOQp9w zPQADhtcGWU62=&~95g}xB|XT_bDVPTPoJ%HCfFEh;(9ABPBXOkCx3@s@~B#03@Wv9 z0~fdm3u33hXj*beNrM6jO~9Nj*V;kpTa1Lp{yGl;{hul;Og&Hu4u-Ww@UdpAOv>v% zuNIzNhdiia?>{%W7eT|89Tp1sT(q!H;Y67=Aq;Oc`mQ&dG>R<#x%v%ul1D8yibHqK z)*88>6vBvNWyIr(gEU$<6TMEnJUa&W=bmET;vhH5Ki|DapR=UVV=?ca>+*UV(=Hb2 zcG*mvM=}09D1W1*UsC5D0yq|E*b)2Cp@n1x+ag)w4w-;%KT+4yyEj-Yyza`GIL>~B zfcT@-6v|;nBp`~zud{GQ@2J?Gd&%#307l(nlj1%O{~KwrB_@B1#Om4Cf&}Vh^Z8#@X^n+f&IfLYzk3ICmfo76r5sYSZaI z%3l_8l>Sdr)M?jXy4715hh?IptfWHU%q|h#i{YJsw-D8f_`lDE=V5g%SR89K${Xzd zzTyi$*HLIf8wu8E_eUk(Cg$ZZR`SJ{sXsKX2m&O*37--J&FMtjO)vacRfESUlK)M- z&V3)rx*@9dv*DRwUV@sWpV3G}_D#hmA%0bT2%Lkv|BLH<7XLy{P)Y`nMxgPnbe@CoZP>*na!D=WA++O?#$dKZDEUMkNI!uCC2md>Ju?v1V&Webd}UGZpxyo|^G* z-=tpD2wvE(HiF{~cz(%SNN^vXrQ0ff>B4*R_<`+x8^2D{OOj|v@>_a}x*qWp8N0Rmu~@;@m(>>$`W@pjtzn}{s$>8C2-4WS>rD6Pks4oi&@bg@B`CY9E2eAdTyxr~t0vfmzUDOPBp1#iZ^LodTXwqZ#BOXd zm1C20_9W5d48r7eP+x8#PSCosQEgE|#KCF}?w=gm14a*(H<0JTyL0!>5g#TuKcH4T z`%l$d&$^~3DXG}rytT>wIXoom(b>Unj+B?}Gha)ZzdfqehS?qj^OoGG~p^prp6ZPeH z%p)0Irq(>$9&N8KpgWv(bQY^OJmB4TmfuLUuYU}H;ojvQl%%(-JJ98>iDXdrWlYtV zLgJ~$zmSr0Z_LXC|6j7{1{ZtWodz4tijl3asSP0h#IZ@q;$4S55kxu28JWCbK*(WA z^&Xz6W7d5G2~5GF<|?apd3X`Glq4;P(q$5#X4h)fR=PdopdrZ!#-XDnGd+meDF9n< zS8w9%ifQ1dQId|?B1j=X=F0)eg-NMSc8QWaJ!5NYwT;=epi(W@ zs^_@^B}H@3zJGW9OtkjsL%vnd5E8E_ayR<11hYlt=Z7`8yW!Jf znvkhF-hBNkX&CgttrJV$6#Sis*|HpOHz@4Jq+#a?(dy7Y+_Gk$JDWEEFG}PfNY%4z zV#lib6lYByTOwp1YqyYbOYZvDW_bghoarv5I+RSa&@Xe|T9&Do#2dhDCakhG%sY)2}L0! zp-Tduswz4)U1xe1wqJKz`PNfab+Ns=1`U#rHXF7Z75rD0_kjwN=q%N6o_}mZ*W(3U&NvXz-3>AU zuT!pk3KO8?;r-vQ-pNue66*s2Jz72!@LWJo#VfB4W6tJI%C2tp`ZL&r@|8xiIY(R*4-fA852&%A-b6_?U8jvC%1Ze0xn)vX_(DC-t7#k@v5r<(f3}xSPIQ0eY-?~Y=Xge28e@%-{CbKRlf;?o0R|> z6wAn$oP|k*#7Xt`*Ogn=<*OOdU(iVqdcpnhU(rUsN=f~r(HInf^g)zLt|KysOO5@> zu3Qu|wT4p0X6sr$w^?W2tTV6G z^h0fAV&d^mK#g0iRs^E`sNJj7m_K5zQCe%1*4p0Qen8#eLJt1Y0l7#HvtOhh8n{Jt zbT7LAWqxj@iaZ?M)F~>~^9Um&GD{^Si6ycuEv}G&!fS#rK2F_=efrtsTYK1JF}{cR zH06G>MvFtV`d&!aX*T~!b?n3{x|KyHF?{8je zGJQf^FM=8fzQg^cWhvpL1hK_4qg{fm3ri?nrg*OY{amBnB(GZIXj_K9N5{x0=f}P zHiK!jr>Q}7Rw?g=&Yd2SBTjAP)xgz162E4~` z`SL}ojyIval=w6LhGzrCtuM)Fw+g9sy@6^Q}wkr1#pA% zs!q_X!)HaEyI^b0Q(pl5-~Cse9xqj!Bb6rEuJlJTE#azqG4iG>XU3XM^cb5%V<2QY zvTQ0!IdrN@K)h5I5@4^e?v@Acc^bCmoCPE-oTMUkYIMd)issWlHIdpt@({UW%nBF2lx?n zlng^$Pgf@$UloQ1(q`|ID}-G`-DN}FVPN`yj8W498Yu=EFKD5VP7^< zGS<7;VM}NhI-fXXzzCmPfy<7~T4sHvfA19tF^Q*t|5bdQsDzyN#ax}e5ed5zsT=?Uk9;X760;~GcY=Jo0z(A`9O9Jv?vg`5JH(i$?Jh<5VLt5Xq|1`>A2rG*!FFyfbh zi%Zfnln?Uu$weLpM=~8)>>uE4%*4Ccr`={Qd-YMa&F_YbPako|5_-8~D(tw<;CTb1jXMSX0xpQ_&(9peCq8143wTGCl_TT^Z68HYg!3svsi zB1CX;THOFKWgaY3E2Gco0{o9FJ$itCxVjf-sr30fpc#`GhE4qzZfYhONC0ze0q($Z zrFC4gty1y?bv_kd)!|Z=lnM#2U2Lk`Tj3Pt5=Wehl#87e8`0Z^$r(@FHt!ftYA|}< zlS@>0bK@6@Av{K|k0y1kq04sSSa|;45+QMwcS?Qj19BAsIy#8Q`gFJxlPC$e!c*!c z;5(u}v8GNS0Gw8}-sTuCr`q^SNDN>1C@=cYkr5!TS9Y?zdiw{|YnG+OcW?|Gq){bC z%}8mqneK@Oh@Wt4xrQNS+ZMb(uF?pWYQPLR7(lqZ5%Cyeq>+-h`5N`1Rcidl{ABTr z)b&MvIV5VE^0!{( zilbWY1pe${jUMRd)yt5&Ky_(z4XHY{wo6L9I8lfvYi9bZ^RoXuSvvD@IZK?FXdyCs zj;Ie?Op?;6v3aHUmBzs+j2Nn9IeFu$@l8hs$cP+nQB9aK_G+tpU6; znIO!Y(oYp`f_jB|B*Uc4c5?G$w?6>``>HyNR-mx+XKNwSL?8?ZftLGsWKa1uOf8M* zOr9i2$=V}@fg}LinV1Lh(`a@FHM$w-SPAR+QZ@`}c@Q2e{$wIpYptYdxY_%2ZVGq~ zCwTw@ZQ6Za{g#oB5LTjNPa$Q7b)%x>B2Z$q$@#FcJTH2~dawX)xH=CWyb3uvPwq;R zmAFhTjk^Wr4N_dln&wWuSQZJJSF0NrsXT-^8JvZpYr_mBVlZyPr+L)a4xXspS<&Lh z)lJdj2LhCp5a6U}6tntQ&yshDl_^xPcDPMaf|yCqP>W$lFpD~u`5HU6?e^A4ik`Gv z9DyS|GwzYOBKY8s?0IZ-c$C6-{HCzO=W&T8KYYWjIv`8J&(1w!gb{Uo0hBctl8=+! zv7}t)x6Mxe6{27Z96mM&v!=p&{ zg(GARf*##L4j$gYv~28&OhehjsCP8_qrv)B*s~VflbCiU-DH`H-?}@dCr=6@$f# zo2g(8S&Jt)usguHr5>zn4;gqf8L2b_%I|YDywe{w6A{-Ol~wUF_o<)43qsXCr!i^m zg_2XfN#91MyG0^jS9hRcO63fxD`HO%KwB|1-lA3<^Q?_QZJ~dWie*%nzdBP7*Xu_8 zGR23S`#}yWYE9A+%gyr7#WX@Kc#>bCVH{>xX_sJcI;KrZzmAM<3IeG)40Q@3cDxXV zaGTemCqAnF#(!Ku(F&>4$mMk2sdUU`ANWrzk@JGstn`e4J4>pO^W>fCSd!~ALgdI^ zlfGh)qOV`je8;{}B!YGPa)i@Y;jv9=7NeIK?N|b@@e^u>mRUpECvuRg6}VF&O-S|R zq*eWgRqdj>a3M7>1X&1{w_O}lug5z_2|ARdGkwtz6Wq-U{g+BNu=I`)nMcK|mdZL*JtU^b*JOEz*! z8E(Xoqnmh|dR}#j9R})AA?+A_X9;Om=3RWZ`WpEr zTA;i-oYRuuZt0*e5W4Nln5bq|!$%DUd0pwI4tV=ZNan??EIf&kRi0)>OO7<9zDcJX zn1!M|(i-Q?A|2J96U6Xt^~FVU3Y31Vuf(QoBJVzEQJ>%?Lon_e!T(%M|8ouf&$H-% zo=yMrqx3(|iDVY?1J-YA1em7BZ4gZi!RO(_W~1)iIE|8!OUkct@RK$vxi0{xzZHHQE3oN<6+~)znR54e zCejw|#1-Ovt^xhrgmKZV8yx#mH1q-B7yTSQ&_w`yJ^ies%6G~GHyZh5#cHO zZsk9+$pvPmzuy57O1QAS{LTa5bK<0N0t#mDgV#CV-q7w*K~sQK|~0hTI7F2*5Q zuqJEBawqT~rj<3DOG%nFdDZC&_5n!1fs+ltVt3+QVDRsFmx(F#WJ%iTdXyz?Xp%Df zkhd<6&UgA?!jd0WcOq$9a(_u`@tZJud^*NmHMK{jwqqw~wMUr?r#|=YDtmqFrT=YXM zc_z?#nA;(+^x45OER19^|RnWD8OF$)}fd}k#`AK5@HFG z+*xiQ2=0zRu#bawOSf5O!bWhAQfD$TJ#WtNB(7bqovr7nY7p^RzxzUKPm$`KJ}~O<^K| zTC0m-YRee-Y@Lq9ZnPg8iHgk#mq(nRkKC>g6XANY`WnYq`f@{+j{DT5t8fcQ5=`Zcnd*%X(GO{XXP+yI1gVOql zKN#`C_Zf8r7eF2!^Z>0^h~~8|Z_|PDmC;(3eDSAP+QJFj)G40DEP4arJb{2V*(^kp zt&rNG1Ku&22Ol=*-;c>*#JG>@;ti~Kog_ks8Qds#>7zv4g|B*YB{(;U;T&thEO{U6 za6s2^+u_ZDcd3toJh8siq;?w~I097NSf7+f4;cO`lH(szFCcb4fjUQ$kYILu@D=@?- zvcH>V$mwaEQvCo&k0eS15{^Tzan`i*3+&^pV<)f}&X5Qe!FW(UO_D9uGLp!kwY))TgF^KX$U(&M`vP?Wqr0=upKF+0+u6|N^^Q8-~_bz1km!le+ zD@lG@@`HJD$s8|J)8xIpNk;EJ`PFFWufQqS)O9|Zq!doRF0U_%Nj&CZ-MUEysE)pd zF1+IZ`^PN3GTN3a z;L^eZ`m3>x?^o~F{!daqy7u;7X2+qC9$-V3oGItKIQ_eM!GV*ssVn$;haU|@<=#%z zTVWeT(#|x!OxN-bvG7XPpGr(;AJAz zeve+X#$LDosA`%^JlF`&2ld_B_;;119)0fJ+WBMAk!OQ)E#8#B7guwyxPFKFphL3m zadT9ymBn}7_1brpSpQJf4Yf?gCeh@gdl++lG0Kmq4>@>?Z`?PR+*Q1NME!bob+yfN zrYKxM4F9NfT@(l2WE}}mXlo~#gv?|cxLk>A>o(|{DivSxmtJE-M!fCQq)A?+Xi3bQXU<) z#X;L6=K6XSzpox}P)F%fj`Yp0;xqTw#ZY!jeR!K%GuZ0_exU5+ZR!h9;$ylly~oQ| zvkq&EeQVZd4T_T|(B#E)A9~GOW7@5F4Wjq$cLQZ9XS+q74@71`7w~z}*4MjsHtrgr zl6T`i?(6O9!wx&?+Ie@`algv++tqnP@JGY?S6-$ygdKlWXbB_N}8f<}gh#$epu&rLWj&eed zgP2W9UwG{uo;%dJ1f%Gk5W=g?g#wgV_$|riWy04-Z=~(uZF{K-?aqe+?n}Na`@TfI z4t*U^dRoWK6w1@4ID`Bb;hU2esz~zs%pHc3EP9O_RRXR`hf^&DYec8<#C;(XGwy;;o%m=-N(`>N=_yI?@cxmH9f|U^uShl@iw$rH;$A zTy|H}+mL%e8bb6qY=Y9R5b2B5d$}_{NOKJQVS^?DW~(OB6-IY~OZJ%?KaqU3qk&8x zKLPH_BMVXH|K>^c6Kg?mhMcBgR@yOd0uo)v#Wix`GPB}-$ob2OJ3*Wu^F?w}q|?+%J3xJ?JXC{~i0)skT;>XmaE8$IlGaOwidpZLbamyVJ>PWzE|8iVgaNk(I+BA2u zW%cqhPekAQoPGP)p)56$s~O$899foxL_^4(ITw4~N=w4gxqYS2U%1QQ3DuN$K=AUF z5^3DfMk}-GQZ>*qM{mxX-p|ck)g@Udkw|s8Ij@p_F-mt2$@^6G5*HA(e54M@9AwI< z7AOveA5<@PVHiV_NJj9ra5Owq-J!|jY9S9XDMc_^zmvCV6~@<`X|MS*d<>E3;k)zP zG($%Ac9X`|lhv&nlphmNk_f+3!o=T^>$HfZOPmBzhe@?bD`eLb36AsQmy7R%{H!YX zLu%cO z&9Pc*ci+=qbuP~9#+dV^)Y57S^&Q?2u%!6XnW*(*bFZx1jRm9)83^_X4PQbC^n<>H z5a_{omk@$yU$R^H8!&_GkPU#JR3dSrzu5-__anLI3ERfgL_19N6(2)7VN|!Y`4M&JS*p85_G_T?uDFuC3H6~q zhr&D7s8S{!M=G*(6*1SGQ0B`?zQpNZtE2E5O5|7ITt_FHVmX z9bJ1Si0|5nl@{0&$e-lu^|i1`*@J)$?us`QztQ2{+K4hjlTL&trK=d_bR?iL+@zXY zYaw!e7?aJf=NJc5+=p?Gx_ycIpoS-ArfKP;5>?bqEwkgw=4Lu3gVr%^0W0cu{}d?1 zC!_cTSM+3sSY@@POJe0VxpdDI$aLy%hU!M+)NpRT$;AtLjDdtei2{TAa^xMrl%_-F z#l;(g>hg;2oW#u_CI8jCmDP5r_w~AyF86hH+8Nw{huVYb>th8`)*;YSR`)p@z?L-| zcwuEjI&I8hwEq4nAHPR(tMfHKg9l59zQ^ExfLgPSO-zu3E~fqUuS`;=EmCY78^j#MjQk5rBUuQ?tBRb`Y)+hY8+@)nn(aDxU@7i zrm3B!X_<-f5|5f;a;}WwEz%%Mg=zbB>bQpKS-2N69((94$8HeMY0*vYkBDCBtxZ%> zUPhgy=+Pmw8qtAo_h#+pG+;y>b8pg!jda4`?a{K9iod}0VeBUIIt>Nd-2htsb?}fw zYMCM_C{CH<`6$LWG=w3y%gN*LGDra(MH^_q&_}5F1f*-jzqYMDKTzb zzByp;eSGu%M3kofXLDA)PJ=6ey6&c31v1*00fg(C-wXi!)fj*=Pw1{f=8=b>?7NWUY zecXtvaVw=#Mv&~Tn99sJ?2uCjVO(~~sSt+r>RJskv=lSe$h}Z^n#`0Xn=9(S5aL9l z8qJ!!3FujpUV(CXqwsq5*PZ7|9AA);d!MDK7Nf^V`?!%MJ!#t2b1t8OYi<3N-^cJTHnc2)b(A7jjX#m9(~w!7cL|#cUnM8$*oS2 zc%q`olia<+Ds!R_?_|w!v*ym1+P~Ha5q4^eSC5tGTw}E$xAhU9tbQNDD%zHPKaSj{hWIDfRDm< zl}??f^BHKmtwPKUFP}fpjWe>r#yTy^2s(&14#9DlEQEfRW7O&brD0jzvO|c$b+FdN zDz?qR=Cc&-L35s2P7Y{~o3IDKMn1-1&OpNv;YK`8XDc2h&*=evD#DJkUYCL-$ zvoPe`ho;Lp;I{ioT8=}(eJ=qgQnhs$^fM*_zJ5WOpmn(Oo}7t0dGvLt*H^;&QgxZ_ zcWN>!QSKb7gN}`73BCZmf?Lh`nKsfTR)b0U7dbE-q>!Kh}#X}MWwFg@jg^5gLiNUbA&;8Q*}@?GL?K;QXqemB(Pmk3#2BQ zNHRTE(w}YRZa&v4aagwpJJ^~$wTQ970s04;=Z8-3Z7C^__Xf)1p)n7Mrm_sLk+T8M z7PbIuk>@}JuM(PoMQ$ICK8AVD*q&K+DK1OJJUOFwTPSzKXQ1SuDh>_a2 z4+UGT*4wL262jH$zjKriJxUrZhT%4yB-QpB(j;_*(C=hU;5WSzlj9alCIr1l*UZc4 zhkM7z>GDxcgMp>!-&LV@BpinXY44o$&I%N*HyW)6Kf~+Qr*Nnv<#W~5_9{&VSg2z7#)h0? zxDVFE!QkntwV`fGiZm;rjumC5EI7Kn$1FBnTVGllMqi_vFfGb8j;1-v`;6Fu+1gc- zD&x?IQEpC^&W&uuCuDs^)p_gP-gSxed{k?4DHtO;W+8Pn?)CLRiJX?uSdz&V4ThRz z|GOFQOr)6U))2=+*nl?;14vpM*-C#5)6v_*3?A+#*+v-ODo>jat1xlvu5EkMRWr7| zIHN#w2`8RKIJIVvTIimepHsIIQ{dq(e4TPeD!-M?x2Cu}OHVT%XseFfRE`AyR3ES)CQEuA{Q3)!=3 z{l;CwXZs)3JYWZ-tS(ZX2@EoF&Y1tqs_8KiJZ@N-%r7<<)J^sdcyW0DgBILBjj)Lf z76cheCL7s@ku(ziGj$`Dk9x8fz50Dvo%Hl-#U&##YVaZR4*fQ)#o;@L8|aLfj@)mq zo2+mY;4xm_{BiXjfNS2ffE|C;mo?yqF$@*p@5sjZ0b<0ONUWF`Fp(gRnfxHP|56di z8MwaOKzbo3*Fd%n5!pjk8LlQ#+^c#WcMBaS4VfXnDQ}5|X)J}pvswm*;u596bTQYk4?uBF*et=A(MMT!vnPkkalnhu6W6bW-YUPxhd#*o=%xq3J zmrs$T{CKreWfzZxq%$))V*45Uxm&X>og;5H3$FNnCG{XBo3)YKBQ(khve0IjHm9k% zLAf>sD@|gbjnWm~)LF`2hQ}u<4jV7~06LPsl;GnREG?cH?TU@)FH1u6C;^QMw+gzg zuC9@T49|cMVpYfV1qh1(3B<~gmxRJIk&Sk~Wd0MZvZ?9K=t?}t8`Pr+;8SSzvq!sph?oZJD4gSo&@}wjZ)Mu$S$5+=5^?IJab?(u)d=C zy!WavJBJpQG|0C&kRv1TmRMSnc;a7G|KOaM87Cjunk2p4}@V2 z78#%2FSueT?3M9eMrVJs`bX#NqHzoxo%ea|zpg&1`SjqAy-Te6*VR8ex5)vHzRHDq z(IPG*V!lWHfxb~ArEs%Ic&iLjSoLzXJqn>Ws=s%xb2_Xq|8Md%e*^lwsKDkTkqon5 zZ3ct9$R0Gq9`Ert)z3ksoDB{%g7O)P0C4scCfgteiF8bSK=;~2R(7S0>KORE{TV-6 z@Mw{vWpbqRQ#H8RMaq{@*=;_E@<+BFR!7mV6#+EuB9Q6UoMULb2)P<-!wV55(tTB} zU@Mc$3_GW7p@}`_t<7_})^` zWl*lkvCu8Qs+Q4V5Dpp4OKYNHA!-`JjP^?x-jluEVb?DrOYASz;*JXW7><#rsF&N8 zhIk)`5syQL7lc&3HEzoA;knD&)eOCILq-X169bKn@Uhp#0JHfDbz2j8?Fga+6sM0| zHcgE>8TOqaMLg1GN1FUUG&kz4@;NRFpw0`E<44B$9|(hH9o5I^LaBq8m&$^Kq2FsrrN>Hl9R;uWPBo74n#Y#7uLB(ZJvIThGeOY^_+~700HP*}9*}}N zj(CkpfPPvAi*f1=Bm!iY-#o5vt)ZV&Yh^Bkx0RT>pvOqiJh#$)DX4$Psw6^i%fQB; zsjz~kK`qg>Fc*6IY?-qxCj#j)1@#qM)0v#KJ#V*DN1wIK!LV!ed@$Q?KXK1vD^L$m zIu5d<`o&o&meH1`Xw-VE0Ibv>*o3E~-Zg3Eq7EuFK+Y$zACj^_IXAA^Y_^^6h85}o z*O`vgkxDfp-V4?@D7b+zK{x2#Yiw_C->sge2WLfgsf_Mr-Gm=C7V3Ur znY@8k@9Bx#8J!H5_QZE@+zlpP_B%1phiN)~vhMF@O?0pvb!Y6#x;yf~ujv1MDhYnc zNliF~jc<0Ze|cTZZ>c{?I@pOiaq`89jruSj?pM^OlMYAhdDxHkCiR)*qj7iFgiFgb zOOq_{ojtN0FpSOf>c=^&gwj#iPx6^pe!`KS!xw<-uR$dDBlVQK14A=zz`5oAm(0u z29gj-6rJcrZ&Z95<#}D)_#Qr%3t8#zdB6XEf1G{l?0xF%RQCkE>#CFLs=fdFzyJIH z{gD~Kw0?oaiN6%DJ&k;qBMts|d_L9$yyTROU6Syt9+yg)m3p-xYuc?(ywj<)He4(w z(s;1~&iA-@l~VXxwRPmOoDEL2%1x9~kci=YFZ#zZln~*M_(0{4`I%~*zQd{CyvybH zUG0W4qzKN=Im1f-VjMfk@C((8?OWGM}4wbFdc);`UL9)nQdNeak4 zbc{*aAw??OtZNil)yi<`s0C4s#eMPOQ}cqjjjvuM9C#wVv-=kV<0*|3?l_&!k*^}yFhGv0gO1P>P%o% zc6fP2%)sF*P%RApQJjcZp5nTrcCtqWwy+mhydibjj>WgWW!+yd-B9I%5&mf1s1axHrhqTOx_CD;4hf zFS?GK9Y9pKYmE+1HS95)N^2f6ht#X1P1|n0J>Bb1_Mr>*r3I>n)~a)KR_ZM4da#+F zDZUsVo`-UE1DDb5D4)akki`rs9c-Xe9j4+^nYK(~0=0vj)+1~1w2J3r;}dZSo@v6j zSr>mML;rCQn{&0{-bS;l3@5Rc4IUCve@2se?o#QyXZDppkQZ$Rr*{MC0To$>Q{kg#!Af<{y$}UgI^2#*m~M%`zJ)sBLFbhYm|1Asa4Z&$ zb2)|YJ_$&YKtGS9zwa3Tj^X>TMi5JGZ4`p@wKiJeS1=3%|HZsJu9eHZJxHl<+6u|9JfJ1?R*RTMs z1%AYBRawgP&R?*jSUuQ@-N?({g$(a8Tt>E@0iD+4qokP{trqEKbF`sm4K3GADOryf?f5UK-f05%iy60TrI}_&D zIHeGuGpA&(vYV$=OowkKb(o$fx$1hjD|K9%@(f9N*JX>|lpa;Mc+Ek#bVKf9iHg-Y zZ_(n3)Mw7qSts!mYTfDLy7-a}>YkfW69+Qv>&uf!X2N)`MG96HY6M*Yr;vfhsBi`= znU>dhjRAQAor()a0ogEs8p`4rstFfJ3X`y8|J@wrgyN%iFdq>Hy&g+sFlIa^ zdi~q~jjJkoX%-O+Gz*0JK*}8Od5Pn7Avx5#(6L_zkZrwsmUNAyaJs@9Xfv9M4}cJ^xNkqfIxurNNgH6`BPkTg38e^BLlJFX)pg3%zlJ z+t#>wia3qVHxzOol|fqkN3qOnXXLCi=9qG39W%|FbJ}snx51g{)v|hT=gxF8uPwcY z(j$H{6R$^QQGZUVcWEOT88zAn1og1(s$u$ZHR{oRV>@EFXTStJ zJzwg;yN{<0ZR5+UlNrMDmFO|v-O?vD<&x%X$`xNoV;E-C819?C!p-4WG&=T8W*)fiK0$Xl*By3FhUBMF4i&xZ02x97m zN+l62dmA`1cg$u<2cd_|4H6{rXL0R-uPvF@UF)(3m23y(av3GRI1%q5_k{!DBWAF> z3W83Tn{Dbc*0WKzl104~QDw}`2dlVjHFXtX6y79t>6!#4L{X^nDHt7~au8t+1s9FoKzLGJjCmxB$Mt-(JYq0@z@`A&{VpxzDvbI0T zE{Y5nr}?`GKQV`rHN=x*U13(;Y*!0Fzo$zc#RF1ul{5xx=6$_DGVtBLP)%Piyt2Si zqGh+S^Gb9yMF@?hC{ZoGZ5)6kh@nT2Y$}AEHs$!c`2xUhSn?ar_}Y z&BcLHx=$YG5-y)c2GB+Q05?Oitf7Q#9}-IUhUu*yT)}{(4UEC4(`0$hf~TufQ4S91 z%%c=DGwft5IL0-Z&I<5;VmkrVmnc(8r3S5YUNvV4$$wJ01uGd8l_0X6kUxUU={e&3 zO6@#Um#{%k7MCnt2C~>Nwgz-SZRgp({R*HllR!ri^7bbdAjK3h>R@Exafr|z>K7I^bWgCyfXm` zP$o%t6i`a|e_m)RYkLcowddl0o`?T=z6V9OjRQq~pt4c)wgifDxh)r;biF0che^@+ z)@@>r80hh!6`?ONJth6my&f05rtr8Oae{?x{)zZixQ?KXpidcZVEYQ-KXeSx_=xIrjT52s}(uLZR zAm?PXvA!JEV_W9(DN&;$g8h(AB$YUbmTwirNo*S%6R2AFW%67yjc*_uyH=T#>W1;b zn1kt>(&F`tFL?>;=lV}e`cDW~(`r;%Ps!L+Bs+P-HH(Xr*W!PQh%WL+x&fg6`Go#C z;?>kEyF=~X6yj4vnV4uV<*Z_B( zcpU*pG&&MImdI6myRgIrW7voV#Q&>37Dte0)~Z!usBv&Ywg@29$uGlzFRzn*a}cYr z=RIiY-cDATxR;(3My;|d=%ku_9i2`q;rcp)B=AW^+^zsRg4%V`Ix!L-D1nJm7UkE% zmUjYZ%p*46BVJoaejUZ?$xpMtRwp3|4y9;hDDBmSb|y}$hfbj$Ghf$X^zVlXbaNnQ zVo9x)niFJ*$NQ2yi}!gC?BDkYuH=;N2ZJ^d;D7gyO^_AYhfoM zPO9_e*;g2+wxnB`^;8Grj2v_-y8tgZ3UlaIY~NYmQES|@%n+raFF$6{g;Kcfj}&Pm zdIV=JDv1DybTMCE700N@7QJ4KUjis$2O3readb&CIP}5okP3HdnkPKc-B`HXUV&Qz zNUXs1fYl`&tSWF-YRZhz4BR-I%d+dbM{`raEXi+iqB(90_hz=}m2{r*%VOAG3t9{( z@a0V6(n3hCf;umz7JGkcX@AvKNh};|w8Kti&F&H3JDe=H=;iawI1XM@me(fZmw6%L zA@O(;5v4>|e=k2uV)+S;f_tv|wj>H1Bvb6&j(_4?fEw->UCcomh*R|7|NStByF`U& z@Xl2$&`cY|B$Y>c5f%jn0wAfqW`$EyYdr>Ok8lYaR*zY`t1Cgff&vPpu9h0p(=euQ zAzsZX=r9|kU2b}Bc)j12*BM>A$nGaEc7b&aqZVu)6id}Ghz^JC8`0^MG<{pl^+Dta zE?QDeor-p|6z{JI$Uu%`4yNqR$dx(yg1UH}M3iC@Nsn#(yU@OsVj7l;d*cQ)YH|Q@ z!!N!fGI{&etY?rk)}|#P-C)B$CjMN7t5vjmJc(M$>9Lfxx=%X79Vwd!Q5?c5KJny| z#NS2W=aQ&Gfl{Gfa>MGWb}D51@CQA@)VO^R*mp`>P`edD1|}mB!T6Arq5i_|nVFzT z#R$?6*6LfoS(8LzAsa>MB~8Q^na{sku2#uO#uIvpyyIET8824LGV2X-sVS}RKlbqokG|m>-MIeV$sKT`$5%&N=1l%0=fx~0e)83Sg+P?-? zD)|~)cWGgUgHM9stHJpK8w>^5(>0U^^{GmkMW8_4EiUDEiZn~vy<>eQLYp>@b&Y;K z2PxXthk|DiJ6W{o#rfVet(I8_pD@4VE6I_tW_Iree#6{=)TKooZKf8`rF{4?tzFMOmoOBrG`DyV912c5I;fZDlGOve) zwc2n%e>_^Nt+eNBt7{`V4hBc{^2Tr=|7Nt-QgNFRuskpqN8O#29>YQXh0(dml_OF= zEq+rS2d;(ZJvZj&{_$?1_J8jhQ{1{FK07?rR}AuTj1iE(TRa_5f70jxBRS@V;Ey9H zU=IP=2@W|D>^sFI9}>SEGs%%49$e=diBCQx{!l&9k)U=sG>ZXD_lnrJlLPRBLqCFQaj$qtNrwHc@YbL)BuBb(UcqO@f6n7T zyT+Vyf`8XU#Al7Fp`OB!6t!yyxUXB;9_<`E#6j<~mF5XQo*@39HyeM@5Kvz+Vt4D!qac5`cs-#0q(w4M z7$4$0#OFo;`^q7jcZ`JoU89l^MIU67}Qaqu?_p1Zr#Y58vK*2It`ZX3iuTCc^avai;+o@y{Uv z9sum`7$;half5T8=ga#%oji*0O<4*ISc z5nmAZkBIdvM&{re?ljyR!js8pz^vsVc*+P~y?eyx74nA!_X;wn?}1xensvjTW!K)o z=%DW!=eY->KM`^s7Wo6qrs0_UJpxHYIwNODSa;a-bq{sWZ||p`FqB}X=QH(}EZ+mI zda+5_B*vA>tuq_-SCL}R|`Y!P+&r9~JkG0{4|eHII&V0lOs_w;mO@8HFllGXs>u4WUk%F~;6fr*b;= z{Xy~jQF#TE<|$``7~_!84xac!+Fyw)D%zp^zpAF<`#c3Rnx8vQaR=yK+VR>fX8m=% z7$4dweo*|nfftf-D4Y*&T@LMacu@SRVkg5vIs_jal9)$>a|m`ZB%InSKO8>u;Lk$> zep{@B4h8$*D(H}a{&@s1B&nT4fjMCDQ4eLc%zSsrKr&hEfbq5J8`SrcI#^|?uky!< zdZh=&f5&?)MX5TgZ`t#HC~2!1O!i?*Oh^Qx{&wJ78j|$%yio}P|8b@%#-AS%}yRKHAaSQSxK@tl&<`y-(vU6tpyl@6yALJRC%GlxGCJC0t{%$T|5DtD z6^9lVyx_wZMbWId`Ji|iRy=a9q1`RE%V&xk+7}=UV9hU zn{mOH&(WPrhdBDafLdIj@SG>Bb2I+9^;|#QjqKiAY9O~YpM8>!goY0BWqwgC=W>~8 zvEahqiQ#XzzYSigHkb)k%9y~@MMb@B#6;InbGDk ztC;%$0qld<9+b@uC?s7E8>^^^|AKfecRG-R`_8JqD%NPvl$SyGC6(PST`H~m#za;V zk3Dm0FP@h0XQGCI$LRTY7oq%@&G zC3vuQI;B#wn`+ovU6Syg3znD4(fX2{+zd96-F8xbjhfcPV+GKO2QAm)<{^vWzRn8w z?X-Kp`x@?Qr%tMa2=@W8loQhf-!pvf3P3Z|#WAssEGV4^C5f8Dm`rb!HUbx>a zHGA`;;)^+vkM*XNL>Sx!nv3axGodU>M+QeFsDW+dkrdmH!o8ocAVvg#r_6|tig(At zaXzSaDghZ2#jjj=pLYThveAc z?aD}1Lj$yBZ8U6tO^_mG79|s;(yBF8%c?$HF$q0NHTFD7+n^Jby$$6<9H;5x1h^hS z^aFq2Lx%KfrKkb-wFy(`UNYZPy&YShbvJa$>?-Gzi>BlU(q(GGiZ?xHLn+hsO9=e(C^lp1@v)Cx8bqBvsS`g;upd4=K~gKW?~sha@8`^4E{)Y5VQ=;j=p72EuyC2 z7zs%e6XVSx!j&{Fi=)tC)~MB`-OW=E6QL1sq|$^fs53G!2cgR|Y2zUxQK#7qF*sh& zb;JmfyTy6f!0^bn1L|Tq+o;q-08nb|tA`aHeli!HBj<(Jf1tf5p4OS@VQN?l`b{{ z@I$b|U4wN9p)(w;i9U)WAa`Knn;i(l!JO!$I6TZl$d;kAramTaXaz*VY|fS&m?ez4 zTRy8$3lr*qTq~jrvyuR}h)?RFK5}*@Etlum9wpY|@jcqGq|sABYbk55JrX1`Ac@Pz z93De?K4QFvJ9=Hik=Ls_jdE)vp7l<`_NW|V{A^Fci@GpAw9{pej@j{ou(r$Mcp~~S z0$LmakdKKeXbKDUkm(JhX1KMYBZk>E)-D~uy!>vlh@~*Bc^MQ-)YkW6mc6C?C8+=! zRzHQ+S;1;yTvMyPVQDe_gj}snlu?)3Wb1py8?eb#qdNO)jPxCCx2(R-+L;m`!4YZu zUWj4sK|dTeX3w{SMpQ$rWVlek5IoEZOgKqZyY9;AjN9KaWy(2#zH4nhH-ASwth9+d zj*%w8-SVdAdp$#_Ao&CZen*_6_u6dMYk|!3z&|$@nn9(8G=f{pZJH|UpJUbA8quSu zd8R_QtN8LO#qTQWpec9=2(ARJ*ckC!LCJT6Y>-_;;OEi0Az@LCc#wg0yWtX?K95>p z;}#nY?#ACkFpc**Ax-qLbv#Jd>$GDZ+lpU>;{4q+|k!~Q-m-dYb==fdzz zr%Aa8**>ETMyMDPCIeYyrBbM*u1e16P$ujp9Omy<t z1?<+N0o*r@JmYF6HPY%+@;%~ad*u-)5W04_Ki3^xsLyu?7vpF5<+;tOoiDore?yQnlA{B^PurC^6?2n6C)>wD=-EkGii78!2 z)7AIJ{=@AD#L|I1b)K8Xng@ruv=NuFw^4u`JC$S>D=OF!Btz=azlm324DiCn`f|vn zcQW|pKUb~g%h{oD7caw_m0ZwhINNVwj~AXga%v(rWRZ%*Uy47=k}w9J`(U_MunhI6 zNF*U`|EXB3RA!^fiE@j_Sayx6>#Z?PSQ)LZyeG)6$dXc%;x(|>7g&CoTcMb#a_RM% zU6tipvy-*RsTMAuCedXQuh1QXV30C&_h9%PPJKqX0|tA}Y&6R2H91Rk*yLx6Zj}qw z^+|T#v(h*0G79Y}?aqb%gY}@j7IKXS=Rcd*?G02IYIKLa@f7rBNMDQlYigCH1W&(6 zw~v<*wz8=NRgLo;1}BPVszX7aAMQ{*sCG<5p~EEEw04Lesd}4}MR}mq z?T>;b@sFco$u{<_cVGxSH>%Ht(*I~3l~u@hJy)iX$B^2MOMK}E%WqKD(35Lr(wC>A zzu$GmgEBuTOt;}kq$?#>%21We(;X1BW-DB6mDi7k(4vL_^Zii(J%|Ud&X8sa7t|`n z8NI1S+Q|+N*(!A)@T456uPtHqMmt)X?;z=XJ(#8cBBpDRq<(YoNYP(uI4)@xs$?e= z?{1ln zqOk&hzUK(2_4dCO)`~U5}R$5kY4(hz6;dX(``l{ue_i5<@XR709!Z9>xFN_r3JA!iR0Z9#dUXRj%E4>feQSVvU!zm6%d!L{Ga!b4 zn5IwDOY^7&hFq;Yj_tkTA}RVnCsg}(c&OZ@2QXDfo?sc&PyhX$-Xa0Z7<19TezDqU zz+$B6gTKg)K#j4s|1xo}8r*)}b=MILs&WDJADnuA_VD`gI=?c;$E-aYEfp^i|KYdL}8cTVe^t8c+!4{-Gk@7&<2Pfa{=0c zdbmujq`b6=0|k|K1cB^R{M0wV6Dd%^uJ1|s%n-J~!oCJj>PHjSkI=c}d&QjyF3QiK zDKLcgfAxmadM8I1avxhxLQR`lW$Ui`{v^co17ztvCWgi4jK{o9!Zji`ZyWNehs2_S zcHm17aOtX-1m8L|5KWgJ?L%QnDWUyd7wGHN%1aEsY>{3+^q4~6Xb`*T(uT8>*b9b zgF0*JQnU`FrjTxs&^)M4!>JJ2cCh4?)fO|s?xgzB%J66>B z#PazM1f%s*#}vB9viN-Z5E5llBh5I6 zX3p0*@ANj2!^+OPy-id`hq=EyzD*oZxX%eE!!GAR#LI_-uHVzIVtv!Z;HF@M|1CL4 zZ*y-#Y4gs=VfsOB);S{D^`M6DJ>{gz=j6MG^ID$6<(b6IatEI3K1W;F1F26OwdnYdftW> zv1RtGJ@L=6_APOaKZ!caXoU1eDpCf#vLW#4~U?(-k zR0suBI;|GsSg4Xs>;-%JvUpFOiy@AnK$PN4MP&4FpiI?B`28w6<~EK0=XnFEz?;9P znf&U6iP6D9cuM?&gbhmaxv*8GDI|k|c4`{Y3im@E6|_H4G^$w4VN*5}z*YoDt{W96`(o5|rgzedNAnWjooJmHTc^{a1@+tGfcIZiu19JVQ7 zPPr6=cWZ?g3GPpHIfjfeG3?E|#e%Zxq!Wm}>+p}4`|yXBxinig9Cs}JX>nXFeXP+A zJC!xNC4bN26>I2(6Yz&j&AyzxRGlw3R);KKCv(PefP2jW)E11KyfA;CIHJ&FFFQcb zX%Ez2Fb)9dv^ieqJ>0u;J`C6Q%j5tA*fk zGUiomzT}q93Zf;sgHC`#YFY1qviY)#a>L-@-WM{76VWm_)eDHelW*NLe}Mx*GmKH{ zQJnAXF7flYpG1d@0|8pp)GGR};+_`$c!sl)kY1Bh`n4KvE_M4!=ETFdM~Nvi!F@j_ zbmxAOS0fbpyBXN$#RXYtdpKMG|J5fZ^>DE12WfIVNjg@y^Q~C?c4*xAbb>N(C**sA z?)*jZFA@&dZ5X%{Wyq>T!TPfVmz+Z87wV(pYE+Ov zrYF+fhu$3gk~l2Cbu?^J(jTSJ>2TGvdm1M?i7tW6t*42ja?J&5u8`lVZ?3IVPd*(Q zG}&wvPL9xr7mb(t@Vd(mO$n!a1{P6a;pp05O)A(g>lj2K80 zhV_X_Gk4KXxO}=$sh4lPmGc8(wV+-5DL6-u^7)2EUY6AA+Csf(=j$ZwA~m!4!!CBT^+V#l z@&ys#L+LISV&zJzXlNi7Qv6OAbQlBV$FgQ(hFAJ411%cOLTdMlHh0W;xJ{)i6o6^> z3*MR+AC$OB3m+8~2i2FD=YX^Ly(ic~=7w2FS2~ef2%+GOD%lq*P-l`}RHt;>`d#tP zT0^G-C3Uq!HJJ(9?Kn;5@LqrXB^GQ7Yd5I($muPyXK9K0q>=%5{o-*{XI+c`9cN1? z82#l{acgb05w?P9FhNp?CE8>b$AAdSxJnjZltGtbLR%jZulHSH4jQfd_B<-Y*TgTb zms@A1B8va6LyXoc%KqR+O!DEilx4z0Rx`JwO_@|YALTk2PWPI*AFr9jz!L_DN83bE@%VKCd$z0D#YEMEP-TO)DQD7aYrN`v(ks%^$$h*NV-Uh3{Q z|5cQl+y$5&t<&LpvsTADefai)WbVUn)HvEaByN*9!ke#?SaYPer>Q#m(z0co;tG9Y zqIloyT||#m`1eaVwZtVUF(RykLBO| z9$esf#aAx;b~ks`(b@@1h8c2~3k)T16SJZuM}+hI>EeC0hSW3<)uKr1nSf8Kyt=LR zaH_Am_q23yJx#aPwRyqTR+7A>H&8CEu+R6wIi?nyc&CdL(XileZth1q~}ak25EnTXfjU) z&!z&fV~rZgFf?B%BN(bmt&XbFFdWd8$}Gb?a@-rzQCfHz4RMe^mFp}7ukHj58F!=7 ztzp)CIowHT;tCmx=I_vGY+J4u7f4uhaKIr8nwK$Bc=LJU6*auyxJ-zwMcuE_>Sh1; z@4Kk$4wdYmFju6s%?b2I4$+IAYicMO{cW+AZ|kgBs#$sn8>M5}=0U2hWIZ-o3?At^-2MX#xg2E z&XAP@>>~N)QE?iqLYa?AV~%NI^hrq4kx3e)GW5SDmQhbFSv_5o*77}XKwZ8ZOW=GZ zN+M0z>Mxg+P~GW5rg1WFu+)shhA90%02OTt91H z>Qhnym8e7!3+j_eoVqxP8|bau!~+1DshPl5B$uJ3t9AO*j1^#zt6A2reQlFP5I$5| z3DJOuxla6FI1Cr^aY|&bL9s42G2E&{ZIS(5$4?`Bj)0MTtI$Q?R?epx5OH|AE zAO~G5A17Tz$gzOSZDT?@A=L7UFyI3W#mD9LM^O)|cO}xPmm>-j=y9gKkUOEBlD1-? z0hP++0o_hy`qj3oUU#2Vjz@9lL`-g_L}PfcsH^%aQjd2)w^R@CN9mO{(k@ z1m-&dGt8@Y`TP?EV4`6%?w=sw{yM-tHeY&zK>HF^)(4h}9?0xo{H|UjQ>8}BYWU{g zi5JBy@XsH4YahR-N$qlhe-IW3^W}4cgYc;Mi5LXPnn-e2ZyOM;B*o*xwtiB)9=QT@ zC;-IottN(v-U{}gyxcysg<`51&dK8GCOK;2^njbiYiubB7ZMqbT7r@=T?;B_5LRs? zk)a(_wVU8sQqCC#y^2nKq^L~j&NqDu*2{k*KH*e3^6^>rryvcgd%(;3a{&uvWXHe= zrP#8!O@eYwIK;7A+n3+BT8eNdj&-y%f_tXW24g~hC3qlo1+}pkw^qdCtzbPo8|-g| z>lCaf->(j~-H54o+-$}RsHRgunx!RlEx1R`=e2!X{iz$ig`{efWt(|^38&9@U-fLb z{p;mQP--v+;Bn~sc7IB2J{af^lf8`Bt^*j1kAx_32bwUkEuvgm6q6#;BzDXC9=A=( z{1a|A!e`Y#S!Eoay6L)xMcl{c)TM2Vge2$4G}v0JSgUxs)4tRAW}b8 zn*Zf@A1QKHj<@19)9|lU*5dA8nrqBcdAb5~enDoPI$6 zhH?s|J;doxJdOip3aGXt1`gT9qp%#H#Zw_@REyu^Ft`tVq$Jy;g!6iiPK@D*2`bgLL-dx%_aKk615pfZcHt2iixP*yA+uF;NETp zE8GT^{Wm)T9qkHzUG`7t2JPn+Xw&?Lb{MjF(=^WBp#Vd(iJgWDx`)~|4c0pqSklzq zVaU`(SNBb7BD21bWE2dFXooub zHd<^ztxQ?5iJF1!Pl%I<1*sW!G6cPVOqFuGgC3fui&@Rn($SWEia~epaQXiem`8`h z$s{v^)&BlrXA;ZSQVA&zQtzQGyI~%c7fE1bfuvLz#FufCipr`z2yiE5txfqdQTe2*zVk}8^WD`k#fCt=V zNKi7|dTMzh)LPbckMad;aPp=hdtKM=@&#KOL|$a%)gShXCcl|u<9IS=QP){d&&?9y z%4a<55Vkc?e1kbXesli{}d)34iP6W8(DO;tub40C`KLNXvtn0R9*B0DzyD zbARM;9e)pN>3vtJ!n0xui@}$;F9;fPrJy>@GQS*hV*C{4iGopS;9^bOpHgq~f=bld z+{LVQ3N$%O(VQ9o8$obij)eNM?6||NZm9S9_Fsupu@;D;LG+a8ECfoaEcR?u;UbWf zto)RC8|oD8G!{aI6jwT?;FZ)8f6l@g<@Ba}{3UyJt9vUY18}~+{dcgv+r%P3I?mh@ z&i^DV*hNuuN{wep4(i=0-4b0%UPbVm_TTj|ufJB3lTQz>rd_T5(x1;wokZeJ2_ zaLDEHL1Dyyn(bT?uVYXwC24GMs6AXjyh#FKPY4?4z34Yi;>-okMFz)o;-|MTHmsOk zT!6fp0kK5%SV6J&VLy7erK{;SHaEr!PP~l^HS!6~2XL0iky7Klq<9-YD6ubOtXPS+ zae?wPOfZXNUB?>#*l5?<#{~>^Rz;TbGL@yFKyVq6+j6B16;3u#P8aj|i&S(R?_`mR zBNA@3%fBd=6C2rvQGbPJwl5}Yr&UqKPI{`1*41VkXKSsnK~+HgMfAGO42a{@sWu;1 zoY_)-$9IpCR$O;@fe9+M_2?$!(y?5HWrmo#*Y>f+sSC0%V4B<}_=8 z>}*pVN*=k`t@`vsr^t1;vKubHSCH;I*ERLh`x1;_taDWHTl93~@M+9}k3KwD+g z5NF)zK`JiZ@Op2>MX#Eoh|5n=UR}#wp5L}UPr2FEdJOsP>azv0tMs2NuC>B*`6JmZ z>%y|jZ=c_hGlYo2wWSi~x3NzL#IEO=)7YvR@tPdBwzNwZ#$SPnVXX}W`zvSI>L`KH zBeR{7qlW?nBRHTy!PYYlIUMq4-oz|iqQ1s?R{NM(h#Qur6D}sAPLn!es6e{@dz_GwUM_tvcZ;KF zcvU$wQ)|%#1WHp|*Qe58snb3DL62Fe@}8{OS6h+zDJQwnkhKj{>m*$hec1nA3(zL# z^xuQ0Ntu`0dkdMUbLGQtt-oW2KQGH{=tc6O0 zFA16sVm=w~R(}DxU2asVs(*i2ugc>iW?y^}l+7WhQIt+iQwztE`$E-`m+aIJ}d(XAR zIVlNQd*#P*#wQEfFFs?=`=!qJWN|x3T#l?rA>OEB)D`^AU%BvGy-CEuT-}U85!Dj1 zmF4=A(xUU#BdYJy;6V9(xOxAHr}M=WH)6{+V`OF!+>?0A_%ia}GIbwM5{F#ta_K!@U_kdj#1#lqdTY*80+V7R7KkSw0~K<0Ms~+zXj2Qx>v;Yo zaG^c4XezEz&$sUsuOljgIBTrBAc3@$&0GAP^^A0J^9jTRdI9kbQCFl4iX+0)Nitq` zbn8xRK0$PCWuoj zNiNAFtV}~~;Qx@#C3^>ElWi8<CC>+)k;;SYS!9IVnD5Y3uXw zK%v|Zy8179=a5U`mtyvAehZqMmx(p>GWMwTd+6$*PREZxqlZNe3YVG=HqSF5iGk^| zc+V@2IhW7URo_sxE^=XPhjFOYaN)*zEsgT=^v97Ml90@&h`{JryDxfuAw(_YMU<8*YSRxZkJ?9V8z01=w-Os83VmJW5MaVv|!?EpV&?`W8^>U>D*i$QwVpNi{bAI31MKTk-2 zz=8fnd=#VNAlI_*Ha2r#M%o^c$4N?nP8;i-8bCD3p-@8?B@;-K)%z38|8^Q;9~JqKM@`dG$2C&Gn1DdOS0378h|s2~mtN{xF3` z{6$r6h zz$OdGx`Hj!4%vA`thioBbQ~g_Iyro&_uAEy>t#*b9$PYynzU8IIk)vPasP679>7-4 zETUE(MCp{tF3V+PeRzOTmrBmUc30AfrIf3w0$0ybZ zHGLSo2?Wd<1Gov!5-s9l^~DzE zf2<&i5VQzDeaa*VHlTk6wk1gpj$qTnA<@9fOXSdtWwZa27F(BF*&ZWj!SU`h<|VoeaR3JcVX$VnGp=)$>L+4}z;trsBk&2+0faK=i$&%nto{CUn>- z>r#wQgMhF+90@3%Azs7RW76^S1;Q*#FtDsmBSM2JdI!7NK4bWDDD7Z%W(8ny(a zfu@N3>gUy>v_06M>-=wYzK|RtupR@0Vf}aVaXdq%ewIw1mi(ZQYce6o)w`}hCPL~I z+ltYKJ3{x88S%hzD`=(-2_6s<(-{7BGBv_7l)o^)+4 z%feWU=6`;(ES;YvbWnBi1Idz&5Xtu`m}LnFk8FB|_*o}Q%Cl2O{}TIAAqyAvBPM(h z+O(LAb8&}LU-Y_u=5V#R>okIY@P)8iMfN7;NQ0beG>eH0nY?NzyE{hqsqYbZM_M)N zC&q+jseYHlYxy$G>&qQ~`Xy&P>#K#VsJEVVo>$oGVPCCqV3dKpabOlE9C)-0jRUKi zBTpPy^&D+g1eaiLSBn~4WV2O_7y$tvKwxVvBW7f4n8vB69AuVlr9OdSw}O_J1?jzz zHs|)W3hAccBX6Xeg$e0xQ?1f<>en;%FD7dPb47f-Gy@X!)No|*esj9`#wzZJwrg|ySrJ| zx4UGL)2gm4e*o;2eK1I+Nh_#?fIL-jy{>!rM^y*4*cU)J$V=(Y_6C?&M``F9^|@}Z z7pAjwvODkMl#|A6BmCzHgjtw?V71)^gye=+lZxEIKxw0Dk*E4!z+tIBaf>MFKxb%k z#!0*~Aw~MpU09LsY>Of0c`>w>c@)T#HkrF{XUpr*ev@&az+Ri6XsUrXE;L9c#RZPz z0L3g!a0E1;%msu*iOtXQCQ*BB0;OVeW#^-vE^FO4X96_~GaP1@E+C}Gf@(C!aV>gX z34+?A3xZd2$QxM@C`P2p4!#mZ3(p4hSvsZ3#1>TSib4zBhTpX_T-jX>JMenIU-+2v z%uwRjc+M%;mFHA@be&Va03*%wraZGS!LV#pkuD&l0U`6W#({`iv^ut-C>OUAn03Z2Q1QsYThbQMSg&oWhGr|Mq|?iK#=i_gpr+7-&?aL?eB5n z-XUZ+FB@rug`7aJmnA6t2Gkwh?Ur+bAS>v6hoBOTpk=8CRBw2Ky3?XY#+yE1JH1?) z0Z62$S4RhKkU^4A4fZN#XtX*)cV63?MQLx3s<>AiZD0y(NtbTgse#@jE3e3eN)Ei{ z;I#*(K1^vy^{}zZxq(ug@yeRL<#jT%D4oosiR zpi2lm`IkENGm%M3nYPv#uI>Abp{|XU99cmh=8$;`#+=Uc9?YV22_73=KLy)Wk=Iku zYcdUJS4fxQARnT3+~j$By{6pV&^38X(M#eNm~d<-{aAsrHzK(F(SS?hoia;}8M4XrAKTS+r>a5b#A#@W1hjWD z$}B5utQfQQA%rOiSwDcV>SW2ujNKO&2@6ISAV}-};LI8PGo=f5#{O)1_Jyww7Z3rfx9&kx4 zqaK?8p)l0Zaw~#I)?f8!>Nf4-=@Jx)Rg{wzS874MN}PrwRkBfr`Wu2%q1HHzyv3&D z>EYgwEq1Sxsg`^n4=}xi`@QJ=ZU#3d=gWA##L_qDo^|8$*kFu}wFx_-PaxqGW8O1T zPAx;HFSpS4f44iK*tN8MHfON{oLTNCbX>VP#+a7JStgqjIf)Qz)(%@wQnYGVGCh#- zkcZiVUa5!c-)mT_WiE~foPLZ){dBB^#PI;rD>d<6AvGC0`Zd0rvUj1&^2gZjRkeh% zzCIrOWGm~MYK$5^KGc{k2rnK@{az*hEKlY50J1hAkYMP#-J$m?E6-M1#&cJC2Lh+! z)L8CSHgGJs$A_PI4}!<19O(C@d902#jt4{bE(Dd|veNI%iYJfFs-iO!G>ue%`I7Qv z8`mdY*IalGLbb0xC$0zxb!OFRU9_vmllqW~L)zMTKD*m15&(XE{~>jJqx$9pfLV@q z_h`}&xvQjk%Inb(nNv}J0|`Ah&`%`zGoJJs5HZb~%>j!3#m#3#D$giCFnX!4pV9UE zvLzrrmm|ZgPKR5fj^3}t$w=68qm!=nY z`+g)^4$tm39J2Gpp<`DF!5%s?v)dSvH-mw|yZnL`9J@{-GDuT8ys$WRczX88{@upQ z7Z4wA7kYlJ7_O|Ky^}1o zjwlI`S}f?FO-0b4m zq)$Jt_8(NP_Soj!am=7clt~-i{z35~nlm*WA_tmyi5|n_=_7?X1U!ob+7A?*S;ZF2 z!N+wLvjI76;vh!XNo0e)shP1oLk}2<)UO{@Nr=P|4j&ntsOS$ADbTL~#w0nmWC!CS zlK4rnYtQsUOy*tb2dG%n7^$USc-|(X_L5azA%a9^%PAZYOuH{=Q)s#Z6p@6KyJGZa zb!}IGyCs32E5HwxfM;R%{ijKIZrpW0T^BsN?$@0~?obJH?2LNCt{~Gs**lX>rsA_|S9!uOYA3Jaq#J%>YiX8f=VoxnmeM@F?eVQ^-GW_yi* zQ*lCWcdlx``iJxKGXJ1SzD^CpksG{p z-?J{w09K5#eE$j(71b)TexH+e=w;Zs%Y)_>>khnDGII@sVa^0g)+U&mmB^Bp--+d`u&UW)kjhe6*hrjR};^lE-^=v($=K%%uc8>x& za9Z{Eh?{VtIrJKUIuIQ0(C|DWy##3#uj|8X&>AnMg8mbnrR}JVboS!&i^YBBKm2WF zv{oV83?#C`)m6ziC8;;sBggyM18dYJr|($)kOwZ6>=FsJE+v63py|ydTDj23z(Uxh z`MZTSI+hn!pblbo8B`%tJ)!7A{|rQNyZGz)yqLzLQXtK-DW%_(ZNauIgY?7|RggW9W|f1! zhm*8or`5vSwT-md2D*?-4mZ?`1HWP$6E99Szco^``}O+Rgef*eeqt6<>ErgAS83oi94fvIGTu3yyZ10D)dw(28q4@(cQ(t)Ku!suy;C2%tAen>Xmaf4dbI#kTX{b7<;=p?T6>7JDgp{>M?w<;8f@ zph07aJ?@1HmR&_tAnu~c+->_Vfkr;`6t?xq< zJ|un*@K3cMj|T*vN+o-ZSfwhD^B4^oMR28IuBvD7VfQI`T=f7)c#FDiGqkZ6LCZ8r zXIZJG>Z;1g^d}&`D5$R#u*_ciU(cl%09CFYl#!&g^;I#4Cwr_>!(B)V3(rjHA~e;M z)x_c>7d>~>k`#o;`Y^sCTOn@UBrbM0@?j^vgmH}BeAYQoK?J3Y;D2D-MutABIHVO5 zkro?$)(0ojOk?|TvCs~!UctlyGujf#r(+6r~O@VWYlLiZCz=K7+k6XMVak&C=T_v)uI$;(VkMt_(eP`(xr9 z?`X4a;xV~wY%gl$CTP?=LToRU2C_N$;<5EqvsvF*Xa<#9xn8@KLpm8!ueU_fYZC-y z{P8|E6qjEq0w$9ZM6I^)Xb4h0TrSu3A;5Zj(~QN1lu@3dpl6DgL@LPC6&ZQ9ht(vr zsA^&cd~2q*3JF3Jo@H<@?6fj83r*AP=UK*&PQ3!g``?OX>)CPhZ^{il3V&c3W1t2* zZudL15xn(OaW{Nph!hbh;;S6i8=lr5EY6u5Wj~hdIkDig!in`la1)s6mIKM z{&mSLMJ$oJ^TteZ>t=MdBw{?sqvc8sxQBu&=6isGHwX+Op z6AuEFUHsfsb}>iaDe6o7%R}3WGF=(QJk)(UgtvyXi*XO{6d%t-$=IrHhsVz)@tz(a zk6NHRJZuk%U&(|mKf`Hg7}=_%b|mm9lHRr$PBk`&b4ZPCUMXQcc}Ie0C{|^0k(har zXeyMk2V7-FOl>|U-p-s-`iPITByV2~^XrI-^b(uI zey?pKJ-$BsMm@_V%`z=UO{|JO#-j#~l)Cx-;+2%zl5kWLOxmo=QWdpuve`Pb4jwl{ zohmQreb5QzEoaMh7*DLJPooYE`PtCsdT^H(?CSGPZlXH@_YF&;2&y}Iw^5vxGW;}G za{g{&TJFm-^y#XN1X1`x8^Vo)6gc@WP*1Tvqi1gu`n6rqpkRuC?!_ZP`M-se?ok7t=y>AgYH)+35#=P zs@k)Z;oLJCiTlu+SE?)=v*I3`b%1HQ0^Ity-4G^(tBbW4i$81=j!Gl2Revy(mkKCh z$Y)w1udCwTeHa1u5Rl?E@V}OzcR^imwVUvqHdcdXVZGK^2-a(}jcQ@Nd|v%Csg0Gc zn)YBHRMw5F{ITBy;oSg?_p*!(1WDUeQD_B8zT>;c3o)mK{;q(hp$WJaYHbDU%WGs- z@ERzh={D`se5y#9M{Jd)rN~#sR~7G|H zLFCwgz=Hj*B9!sIT>yTRVx*mR2--YL;r6fr6$FP_Wq;|+2K>FX3R3;f1TF0!$<9r~ zIJGXl9l1!#Za@ICN*sM$ygv(}M2z}|GfY-o@!48bqah)FQ8z3~ zuNJb3GD##vfO$ffT%GQExgJ)|c&_c{?uIbWd_g?Vq75_)pHRc7>uvfTO zd^8KZv3aS6h4+&9NEWW zW62M;x0ECDcvAvP(Gd!^i|%N`vRB{+oKF1TWg58v*wWRy9OP{5_P!e#Y2zC8h!SvfOH zE)0a~_KFLD;!v=TPg}bQ#%lq_{#L*q4Tf;%F>xLskTpHZ_NX*;>W+O}#9wgeYNocb z5>Rd^MXuTF7m;Z;mN=SQ+tdc9Oq=OpB&jdqS)MO!6wVXSg$)k6cLnA?UV*!=+zNPZ zFvsWfnjmaCf@CDbvB^+eHeY4;p6kItPowX`HE@UcX4F~c5>j&PNDuun=$S8`u9w%F zL6r+p2Xw(^_*jiEDE6JZq>S?8EP3FWl(}@v0WvTOu|E9Q??@I-CQl7g{QenApY#4KZ}r!^kyb&H^5|-DQzt@C<92Nwe(73;-h`^s7_1U2 z7IEJYM}13LW!(K1ewcM3>j~5uMDN*^JbW#Qz2r-=WVEsQtTv6+q#}f3K$bN})$AJ2Gg0Y5G9k<4q?X0317k2j zDf7sCJjGbycC{6Ot?NX9#Z2NkGC-@rG^KcxESe99Z`M#+Qdilp`t)4c=SxwKw-T0; zw0T(^Ou^k%wdlb^yr7*=k9g`wSZXaG7GVi2@XOs3SV|VP$wk#Agl1Bw@4E)nJ~qlg zUqi*DbU~6^vn-Icme~l@6WYiYx<66dC9^1)eWQ~mdK*o1}LV0eW!$P3LP&7zhC6Qb!eoCMISfd?wK&nz0G6KHK z8{0{qOFn~4Wr>Av zyQNo(KVQCl`S-mlRqA0hrhmiiw zTH5Atj>z#StqZc4Bq#|Xouwqyrl$dC`IFM7IvV&w`N^|PBv*rCbOBY9^x`GAGzmeF z%wthW@ye0=OUX*z%I1e!0iBp4v0+5|dx;x*aGHn;&zeMl{({>^NmG}m-*^unP4{M# zC!yUDv{Ii#4#2xmT+!Ny-5gSx@iRr`JV?Zgr6O#rlHN~%GtTs?;BhR&8M)FZv|%Zt zZZcW=_f6Gwmy4WaU2)!4y|pwk>l2%HG7XovF6aYwmYh2R*Z^v*Iu6y>0(50plfT4fy@PN}DJ0r$SJ%Ep)J zec)xP+NI!Bz`)hn82~N%dT|tNT(7&>+K|o#kIvEWs#AjcA*y1a{1<-*7Vj$h0nQEZ zUWJzo4h!4L2=r%3Fp@G9SqqO-;w}KiZ87RWH3=LqLsZc(gf3wMi%5dg6Wm$@>^CmO z^3@O|fTsqV`ktoIb}$zzxG3ypscmO2%T6Yq0>4vU_t_&7?M>V(QeGCcJ^lwmA}ZNr z)Yac4dqpCDl~hUH{$fOsBVKfWxmM40(PI`hXt$fZIC&pVvp( z-wJOH8hlPP3dyeP*7|4}P3$&M7;+M3hf&mWxRt1QA51={{7P;;Vc*MV#qa9Fn2-C( z>oljx_YlL7)`Q~qXr0U_IcUC@C)_LT6qbs}NlqV%5|8P&xFi`nU5~_K?yQmi5ISp{ zbP@Xg1Q)&H`*;GE#cz#<>O2T$C?a`KJPH@)Sy=Y7x)zJX^H2mcAm8ywZ$F>vG*F&g z-=Mm3pCr$C4iAcp#LFpPjZUb8K3q+iz5F`a!O%Ui+82*?IyRQBO zMi(mU7;iE?OsxRcb@3+hipi z?;GNSKswUfP;cH?l~1=UIoXI!1*b862T3k%PmzUv=-Y(ono zi8Eiqx0ZDZvtEa>@0eY`PXfNjb0E-QFYzhi>2j?4)`R}@dhs6Ibkfu(ybbukh@o^< z;CUGDK#z&~{b`Hdbn6^hbghd&&^jNLnWBCQNqe#0J2{NPe2I!)cg`3vlDZK8&bd4_;Sml0TK3q3I7O$HIg~(L+O4P{7Jy=MF241d63_ zWI=;NX=OpOe-%xOYh{3&#NzDWP3(pclmQ4na0$?X#8+|#D6u#J1j@0F-v!Vc`5loL zW#H8AZhq6P()d+5mh~_a?S>ZHdsVh%0)A$LA;KI`gIF!2)Ci>Pq3ZhMR$6cY z`6E@*Q&sKPQ$#@Ra%2h*p=+K)dZb_*4dIcCT60WA?Gs*hN1&BSh}fvw?i=ECR6ZNX zhYrhd7BEWZJa`?_EBvWdQbp%fj|(1aPkv=WrE2WqO<<7L#d2a#oyzfSuZz>{1#aau zNIg5Np`BSJ39CwGt5y@Y~}Oy1-QX+3ihqiNKBE@rfo4Cws)?DpOP=XS{b)1mf zZ0{sK%qW1?3{4w87Lh1|@cCM`ohyI2l-d=JGo#C?rQmInv{AtPxO%4=90U8M7H8F- z*00<}#!~FF!O(p`{4@X6{+L)o3Zg8nyf+>^TwxS6jCSgo^>XXX6r9{a`HV8<@Iu*` z&Zu@!supw-=n3kPKO&HE86cD_Q*4fsPgb^^!-A~kmyl4deQF?P&l`=`rg)5pqZ?TU z68;2w^jI73(4HTXd&=EFD6SJ~ zgK}H)kHq%(=0Wix>_1gU+!jJ3PL@FhZWOWB#JY&z*vVj`JsbqIgPKT9X1ZyvRN#N< zS=AiPfOT4IThM<)@`6iZ5hmG2jS!c<>q9jVM2#)o#Vrb9~ zS)B-~><@_JaD$O5kJg!7UdSy0rENIma7Ei~wjw#Ij7ibey1P0_=9c!GnVPB8pC%Fu zL2N!QejYCsBZ>IdVU=)blu}R664QW-FJ^t|)nu$IaZxTmokiM-KhvJX9oE<6h(f~- zF5i3A^JC8;lv-|1rI|50g;Sn6tG|?zK*sqr4BwceUDr>mw!t(kH@}0vqM>59w)JE<_kwpQXRa-{MN2B2dW$<}@F0CyYuk z+iFSCGD-!9et-~Z)HoGyNcqtoQ`@mJN;f+0?GBSmk)i@Lb0H#00R$m2$v-mHh%xk8 zL^s%#R=8ehhh$iRq`3^~FU2bos~$m5HChvkOSg}fSpFiR-kUrin&ihkzZl*WaIdxn z)_vIi<=WrgLSLHKB=4;^H5WEkCvg-kos<>y2XHG)pJ|5Y;_?*qsa(rYgQe;3?9pv) zs#KixC#X8$>J&6IAu2JY2X~95oS>MQ@$d0vRT=lZ=c6=k9DKoIGn3wT9J`P_-_aal z+GbmO==JOik*XJQjnVn*3g`D0&Of(s{&}*tPQExi@XP9y&wt@=o-+1wc}@wA*7G|( zF#-ADN5mzCh!;L@2M}?}d*6MZvW**#mRRmlM8bct5=w;|Y$dYQeWV4JaV~7}=(fHi zKSrh4S`o9+nOYMCKkWcqN5*t0=Bw<}O%CIYJke_cRC|47G-AEZ8ScG^9O?x3Q zSx)*GV&~uk;v(zcQ#`%_dA`_~gJl?Dve0QZL+VfF)rgF3`D0 zSq`ATnUlgS(4lMQf|GZ20SsL4ePIp&e@QGRXpxsx^!M=X-j~}SfqX$wHCT)d03Cxo zD)rsN^=pa6UmUMKH1Yi*C+^3~?nly1K3DjtgEn%x!*>ha6Pmb*;ZD6SFJZxJOV3j6 zHQP;^7xGgW7~o=xR+H9Id^x^Ku|V&87kg(rH^nWX#Vo6RP+p zs~&oTH}Mfb2l@!U%g{TpS?O|3s4py8>T9t<_VXa;y@$>VXei^C7Ch37ijQ3IlBU{I z`766J@Wa;Xk`x{1g5{-hw7w*DELBM2i-)<+!Gn$aKgaFj_tiP*BC`S;J9U6{GZeZ1 zQ@l(3YO{l+bJ-{lmonI4xE8QaLb>4@J#d7m#~V^jU`s!ecZv5B4Kr{6a$r5$=W27& z0cD3hc@Tsj~CSO zO&W@Tsd30Y8So(F(~HHoNn)`Tn^9Gdk8+C&YZGXBi4M2y*c(~}c|(`pp6X%dWuN`2 zWp|0@a&7e}g_@77ynwiKSKl9hY*3pv#utgfV{1$MYO7G~kR;qfsf@1nrN2zXe?jEx zDP89p#S`kXcRnVT5_dmZm5JMM_`FL!eBtwRP&~gZURkbIrP&HyN~e1uTd1c5Pb+Pw z_QBD_-J$4dS=mJ25D(&Esc9n|_94ZM>NccxnBgKecc0$Q{r=StmZU*0*C!zj9Zyy* zCE`Ldj;1D8hv%p@9=&{{5Xvu4NRBJN3@!AF;*$X~zU@zmprQPre=s8xl-UX+;w6ZO z7-u_PEQgokZgI;P!JG7dyTI!S{`wlLNZDXt{(`uRz?NWMQNSnMJ5HPf_}?SoIrh`) z5MHmG6I6izzK-xw7uoCs4P24*@;}6%;@NUm7Fz7UieBx|FkTLX*~r&%$udHv8^yTH zB9$o@k4VmZjlRc9N=fghEVb-oiWbHW1#2vLaI; zs5YU;D|s4v>8&^08wY|m5f@!f7@p~5jk9$eg9Rdw9``+LErr=^qwDAa*AIwaUoW4L zSs1cmKa1Z)9vy4L8OeaI_mGgi+1!TzDyQpd-IM(~3E@Rwg1Ydpq6)0*_PDUB4$GFK zQbn0Kg-lndJ2d1q(F_k1NhVvJ#R`scG;Aupk&eNoC9x{(%S2cAt)mMDqcWr|c3$ z2}53#?LB>n)}!vTe^Puvx$#Lra0>KI2w7%kit2cQg?<&3001ser2K*GxAasppSD1T>ktsynmZjooUEo!c$Vvs1n$kG$!V^6nDX zm#L>8Nws71b1eD&71&zvvjnJsrIFa${5xxn`SQ7;)_7FZr1&Rdqq1|F$=-(_1w^Gq z>{8Eg1Bx-@LiFvSwVoF2m@MLI`6mDBWKTm?rqdD2>hovoX%dLi_ReF2hQ!2415 zP_9b_M4Nt$ubv*xMDQ=IY`LG8y04@|N0K@B0-O#p(w)Z)c^Y%+1(b8kwDLx4uU?gm zsh{{mZ<s2%;f}a`m8OIA7*`C??C*~2Fek3B@ng?_c z^C{REEkJQzu2oTk<&9`%;&!jbEm+vM25yI7Uk_gx{OSFxI0=*PNRz$#5N&L)DC&nP z*)uR?Rk_Ieu~05$l14WduKG{va!P9S0(7BWzN7pIcQ|rA*@cn+;0U>M1nOu>+|~*z zkX63RgqM?UlOO$#$auxkpb>Rify^kT0X(d&Y6il{r_yrLTD`rD60RrJq~NRKH{#MQ zx;S!9a4Sw|gsrSVgpw0lA5H6##)vY`%NsnE2U?IVgdL1tnsgap36*{8Ch?BJRCX=Y zEH)Y!3&I!Y)8sRMC+$zI;BS7n_{^CAP0@`Bn!D-Vx7OABK=OS`2%%noQruaNv@$0D zM*5-C$=WTel5SQ{_r0zw#={~{>{7%oSluF_DtC^%=NeaS5;XSG9*BaN1V>tMHTBY75+5<;m3rEH%f@16p4UaIm1;&OHYx1NlUC@RNe;G zvGiSW0=pav*2lH{C(Z@6RUTTB)9`jxb4+rPrRAY=)8lSIDW3IZe*auHiawkN<)~VQ ztt}Hmf%rPtj$(}aJn=6O=b>8TQ29IxR0c*gRl32qSs-t!saM+EFaBhiBbbY8eQM4_dP1vmsYKxpVBz&_3{3`SFF=4xK^+NKXqkos(lzLbWokce2RMU1v2ZJp5h?{ zxhS$}(w|cKAYJ=VGX;!gL13svr^RzIr`wojVw`f?AsXFw=Y`bnlF&|ihC z{%hhd()a<}7#n{2K1EosYB&qc7My^s_J)*B10C-lcJz4Jx3ACB%Nc6E=hw{iYu8`p ztNbPKu;WM^t8xbrvPVb>Otl6fUKuv%Ej~+|h(;weqjzO8rE$@FzA)imd`}V*=)nI~ zoaENrXbTO)QU%R;Ht}L`UbiXp=E_1Btp>}TRd~HfGD){r0h2#s6?pqc#m}wA4PK(Q z%xz?S<{-p@O6<~=ES7rXwG%X+9W7J9vnf_WU6u7toS1{QNtCD>D=6;~B`C?1?H9My zWgSR1&_7-a&Vk|Tt4J|+ZK^Oauwu3SeQ12Ofyu<@Pn0pT6VFwaQw=B_EH0{oveP8; zgDAqtW26fdpQ_m?T2g&EMAZp|1AK~x!bq8u&2A__M}wey=gcK%bEw0{Av=ZdC5i9u zskxGQXj)v-#JU7Ki`rajDA0*T!$Y|>P>S_W;$-2jpWyvm5X*Q!Gc`0&CIgaq4INN3 zYtq9qQn_WvUZZm;ghD5->IF$E$?H2S{)@am*>eT=XBXppX;B-4kTI!!dN3ZgGfk^2 zntw;VY0w)oLZ={5YPPsY{u*XrLp%ah9bi3Bs79&ejw{kW4q0x4YL^DTS}pYIIrPj)pm_XknIT}(0>uImfqvFVvKlS1h?#UEo! zvl)ox5H#$XRIj!6E`L>g#2@L`5O}Ny#VeQOvV#(fzoyVfDO=AK=gmtXVcSjpgSK8C z2&rh%OuI`u-HqM<3A;lBSw%xzbF<)Plo17q-rvhNtju_avw4}M5vjQkdchHU84D4| zl$B^m$y@JTUnkm$yC!#(*1yJk&rjx^<9pu8o&U&Cn7Lv+UVZL9EX8rM_hGm@M$FKe z4y3sI6Z=f-IMcok=C;-v$L32?vmoui9xj*b-Og*H4=IL;$j1-&&;q(SI$RedMAVkj zt-94awoWBd2_IyeSzGB^XaF%HSU}a&bJ3+=C0cBxTHdS~O%H`ygBP(j*-; zWF2!Bmc@?TXe~x9IH@#}$4IqwL^8(tY}^QTK( z&KdW%&GvB_Z_h@Gs@v3>D*Sf;CjL+C%wF4CP_Ig7O#g)=DQ~n& zZctsS%wPn!40C@O7xzZbG1L!KLkzV#V!~(@praTvgO?7pfRv&Dc~J<2k()as5UiH< zncZ$MJz+Wbmk}etl-R1*uj)J4r^KJ*diK-R(2-0_wY`V z2z;I*&jDA;J=>%upvSE}Aiib}hxEzBpEJTD3IMt-;|Wv2gML04?A|Ig--D9R3aDPL zSL1(K+}D@K;JefZ#J}L&l;l&ZP%6m3ql3SCm90h@G9v4hYUL!Z=q$=qNoeqOmrABj2b_j&GND$_OW*vP#sCP0=ozNoYD1Eqw5Wci@cLFEt z5};DFlNa$Nxv5I6lL?T-+PV+iU*V!x{kG;bxZU}3>aGnkcwSi2^K@C)srwwaygH6s5wwvS(5B^{TcDb zsEr4>isV*8;e2oo!v_MBIu(E-0}yVGhMCk|?Q6(wNV+!hxImgdVk zVH*W$fQJ8t)PDkyTPf6Tg(~Rhw=R(6uSwbIwv43Cj8D5}So}}os2kUk+YgE9$HY(Z z>2%eOv~XmfE!~L9-{aHK#47{WxOHNGbmHXMFe?0K849_(hUKvAeih$(I+r%WqbU?y zq~ra>MPHmt4le@Y2mxB$IBx`?zE*+?NijO8i3U#UW@Jt~!?7bU%w*%j3&X`6uPoWg zDvgND3&|4@%qz3VXFx#iz*yI)-MV6^xE?exUeJ4i3S4TB_e6Mi7bJEG++BTpdBf3z z;=I@QGci7LxxSI!VBWxt^bQx?`oO+0tfN!#&{FE_VEwjI2aQKYHr`6ye3`s$}rVrzih0?rO!Ua@+0C;);nxoA_PkArrxoJ;ii2IGUh?* zBUA`P$)-m`oTg{^fxTvWCdF;yPt~cUci~&+U>``6fh0vqR6Sb}BF^U2#84W>%Cxj@ zSQBJF7#Dg%mG{=GRA5;leuZ@@9W13eZhu4kfw~D@h=UuUQ1Cb>%M3zm{!ptrT5=@N z2gTbV>1$1roK#31Hex@JS7%lB&P2#RNOrAPs>bxRiyyEfs}QTEPVIbiO}sC`8^E82 z7Fp4wNWA)T}JF zn&LokFXxC}+04VRn=BNo>=lmflHm!I zT6;OqGsQ9K`0D05CbZjUdmE}0O*5dcip9j^0QC)=n&4a+`3EPuSC)q1K|pa7^ohbc zug;+<(Zi3oo+?7wg<^pRuu2&S*c0vuHG5o75AZxE<&#iJB?d#XP=3N%A93xcigV6w zaqm6*v-_e$X8(lbac=)K@qq|kxTC1H+90$^1Ng(EAm`C3=UU>mDC6o zUoZ_{;?@hr;-eQYdhm#BIrj$4nXJu7qW>s}pB{WfyC$oZzjFUt}R%MkfRJSP2s~M1sgX4TO z!$aCp8U_(ZFCdN0L-Eo$&hXF?8yT5FbWl|6&& z{G$Tp_!lRVTkO@_1DtoLF8~nC14Pg&z?<&UO>#P??%7m>TF`_fAkVvhlo`EgTwZ@Z znf)EDT(~nPPsUuC2Ct&H>Oy$3zA6~q*JHS2<9-afFE!Lm1MO@W(-1a|Glhn23bVE% z&93%E^(ssB5y=;g0uN8{+%7y)LJT};H1_fc9_z#!0UlSCGdOQ{kwn3dEv`^HP`oh0 zv5Y47xeY)kMii#8JF9*cr@@5no*mc6%!ookOp^KuM-za&gkPubP;rCER)%Js5l(u% zN;c;+>1g|t>Ze43In?ZQw5l#q6U{;TH(ec!gM=`9V*0Z|_x4$ZUNl|g2%Nt$Xz^54 zF&Ggt^Qtk1A!J#KHS}g&tGA}~Few`aqA+?C-`+k241iN0fz;&6(!Gdg%D0oVJq{y{ z^3p6n>o)X0tLpCD+mwue1y=6P2!2Y@ym># znByjk=UirZ`tra$cX+V7)UOiXE@{Jx?uo*OWg|?N$0sKIKLDkSVHr233p_kXx+lLWU}EG)3j(pI&5WF zsH|w4??+9JLFR?$;oD(ekGkEN-HknkgxVCIGDVx@c&c zH;c}wA%m$xbv;Tk=0P)7~=SZHN$Bmf4~~)h=qI@?>_CPE&-;_em@42)DhS z?0tfBibDJKMh{(^SUbvSg5giP(U(+EWTM^c1#Qfe6Dp;7@4f}vg$7F$I&4 zf?)Zyi_fd`+9tK?KP&G`p?(i`W}~6+s3TW*bAvi7#O!qbaW;)VbjK?*5%OMjQK;P1 zB1F3GL7>mJZy1cJiM-E-Bo^i}#J%$y@L=F#(3kdbH0H4ZY3VNO2w5$gEhk4{0k6q=f7}07oz7$dXmafE$pM}} zH&t9(LNj=-q)fBG_o)wNh!MjF;ZmtP8~gkYeUp4STxk|9Doj?}#Ju&S=lf|~ObUEV zG$qdz=@Col?QMwPNJF#Z0LQ=~o@t;p%3)N&ZWc>5??F*r>N@ZhikJ z*rDze8)!!A04+S4IwGO&jeRh114)g+_Hp%!%(zPw*~*)-K~CDGnf{?FZ;^Nusd|HY z2|9PLw1OjbwD7ksBa)K*N#5LR(}B`Cvt5AB%VlP|^KxC?ZbXe?HW?@M3p}B|q7SY5 z``HraP3i{Az&Q-(4N|jz^HEtZ^wM$l4EUa!xcv*Pv&XdhJZ>Mi__#o62N&5{ zi2*H1>2Ds(gnlgSm`^?l2lu&tQIBQyMD>-XcnznS>2&E(qzJEL`lPa?Ko+EkwO%`1vUEvjZ zsy9M|;gyhF82VyKn%}*OrBu?6rfh|j81I3BxsxbkUnBWMuY$D^mR zLJnls+N*d&{a-#}eCW7O9;0X}J0xQFht%=*W~;^Z>H9;>Um>=cs__C%=5;j_2|K}U zqugT1BkJQg2J_Hy-it8AvMxpPnbJ4X?S&F{KSX17C>pd5O$eP71{4%&y04*5HAJXA zmNE-JjID}&qN;Pn7)3oKnFxE*KVl(}es4b(1d-P4kd>8FPWWkF-9$x;$jT#X<92kq zLmMl#{?IhQm)H}Xg|s*e`$Op^b%(p5m;57jcdx!SkD|p+bPaQ1xUr-&j-pQ!vTUU1 zPdo7I$9qCr6#q9JRlnJfsb%19hR02lg`6-#``u2Kema@NCM?p{W_z7Sf2>FeUk$18 zyXjTZz!VYGA#`c5pP6BXvDk(>7Kg_l_*B1jaA@Z~dcZ0oD z=8mz&&dbrF%lX7=SSPbSglNHTMr-RkZd%48Rie_m3PxH`9t8bgooD3ss>k?hJ*Vtk zaB8C7UDut0G{(@OZAtwS4YxvnIW)gN9Uw(QKVfIIK@l`&;S8c_LF#_BaI(18wwmWh zPG%jZ6eX@5RpWQ{LhHqcGK^KHw1q6nC#n=M(y$+4J7WZr3bHHk^-k~|!~*jAV48C`Efr^^>R=K44&&dph1dSchMI*8?!#^KY$GTp^!>-GrnFx&k|z2~ zZem@GCtP}?x&?YL8ZaTGcc2plE8GTvi|q^WPglEs>IuBBHCe(c@!J#Xod*w-K+!4e zi-+fP3}>sWIf7DKVA(uJ|6n;7TV}US%JzMsf>;V9_t75sk=0C%8L7-)OWJ_Qd$H%!#DkKvs1Y zxf>Rx5f?2{ac9d%SuNm`Y7o{xMksmVwDLc?*5@9@+szcucpsDkbLSYc})? zq|v`ottJ5mBh&!rb5s4Ar0T5TX75UFHWGHMvRDv5J)D{Kl7i6w4QC@rqa?%d_@z)? z#J=Ek{cIC@^j9yw)oZ?IdAIb-5|~q5$Pk;z!`b%PW+&u2jJ;k6BzK-&EI626F`eK% zz>3h*w$+D{V<%bFy$oX~E%nDjY)s-%48k7fC05AMNUgI(#4x>rkw(hG3)M1sb**cV zM&jK%e!O{x?2?8KnCT{gN8hf1m(x@4F(1qcB z31dWbfnepv0Ihh&fRzUC5~aeAZKD-^!IDaaa#pF*8^e*_ft^ITCh<1fRpSD+qszkp z;x{aAEG`(%dfO?Qlsh&tKU2=}CbdyI3PVP4 z7SqKl3hW8((YCRI0W&aO{ybUTx>lQnPzj~ktNw=8uHg3iztyisPf^GaTx94=8j#51 zZ)s5K!gYK$0-oag!@`{=t%12jiM#>l+JwX5=+ZQDO`N_Y{I3E<3(jeDfW%EM&>!h0 z^Sbm0Ju+$7t38`0;w8-<20+sV7w{z~n=B}YGmOgZXtjb|tUn9Fu} zBDyQL`+7S>Qsnts`)qiI!|mKy4F!)VCgid$fAWE~P94e@XF|MO1-9$@X^ItT>-GOa zw=;fcivbd5SFRM!uiWlGX-KZsYId&}4lXd=T~QF|-5)}hDi3A2%+F4gAUKEXq^Vjo7Kp zVg?kiZBWu12m7U&)f6@Cf~LXNmvr&qd72Nt-J1p%+9cB&Y-YH+F^Xc2yJc7CKf6bQ zj&3N)|319B3SzA2rXuo1Cl%ze>Sg#dXYiCDA<|c6P=Y*ROs!l$!SpQ8R!HpM&*N+0ET0pWjM8tl+$UPLQUQ01SGU;`u)j5HLS zkxeP%Y1lX{?OPe%Shk$0%X~%Zq&n$SAM2SepSWbQ?Kv|o?~JjkW; zco+Xj>OszNN};qtu8Oohp>2Qq&>%~{TKzYqnM0jgLedqhl9bt)lQE{*xtnZ1K^;`_ zX6V*A1$xn&{;Yq!EID5?T^qla{+9hpEZrX+uXox+?x#@qLD@#c3D4m(aObX*@c%E> ze~%xJIP_GDi&FYWF&-g@+^aTUiZ&PL!=2_@ zvrPuLX1rfi9kV(4Ib_`gd>KXVu;q2 zw!t09rL#>xm^8k6@!$4$96Aha_!Q2qt)FT#eU^5_#fUn&qOG)r zg*X@L=ZKCVRF)y+PdDwdy*FB?e}DpE~EHsEVDgNn*BMps=d)wvuK`LS zmz^i7kJL9dU{dID$vl6O&7>YiYc9x?TR(`QF;TO{cjAs@xkFse*Ku>Bgs~L)#F!5B z)@@?S&b!o~;|Qd#N)CLi)WwV6g1U!Es|R>lF9FGDt|5`r2_yD33^J91fXb>)4P;UJ zD9_!&7IlA)yq0bCMcA;^?92Rt6h7f{^x_uamgBM?6d}o{=6mo9*Nc!{x##V2n;N>b z%*2({0k?P6O~@tbh0`#0*YIjU;)dZ8V+zm>rCYtmvz(?p&^o@MY5lv^VW~*Ojjo67 zqbTG@=L~qvu`(-)wi3hJEZdNbLwqQ83|7K`YARq%@D$v|;ANXssSkUEM^ool=zC6( zvDKx|s$+e&N(96QSo;CB>|$qe1IUrpPy~g>?Na@i&f)Z_)fw<3Ir9(UtUumF6PhL5 zDv>F9h4xV)emAERxLIrDtZ=>1^0b?Xx;KJhQZmK+WdZqq4ju3D>W^{6`8pappZmvr z$|FI$i`JZI3>HkaSI|T|FgeuP!)EJLq0Pm~Fy1P|eM)asFIf*U(K%RUr!t{=q>_K~ zn(Fo|m39@pRVzvJq9nyel7I;axl3+tG(Ocw;C569$^5KraQT7`nd?>EEy2Y9xq5|& z-~IH&hz_||{*X>etCEO3HL|jn6~%Ss=cT78sER8_A<|B2BliX^*-NWNF=4&Eh-opR z7%p*Pv)-rpsGuw<96fB7s zCRnW_iHHPq##8V;Nb9ecIYoGqgCO)141=(M2oi~=Kk~@qvwRvWxt#+cSeJp*doE`4 zFpJZSc5=fLJW>7i!%+R_5`{H@%{-7L;CQOi4G}H~1a)M!Q zn(9$`}X_swe8gWkkL7g^EN(48q6&>!<`_=M#eJkqC3%A1Q z9IMvxR9LyKv4=6fI-I{%IUfsMe@MN&q&?Dimj1*K#qv60EX=scD>JT>ma|9tTusrlGCI}iP>Zj8VNeDmUF(EX}Zr~9v4dY|oKByLW zQ8top-b7mo$!QpU-FaRY3Obh3t!GU-ows>RHn6a|1Ov}gsMV~ma88VFfI$YHO-?RW z4{9H;VfNhe1YzDN1_?LAF?7I1D_J5Q+G7+W5`3o>o^xWz^9l{Ewq_9b&H6&CIg-spfvmlBSjLQF{7s zbC13?&g(M0Ali~VGZC}kCk*`PcJc&u7(tg>SF(@b5&{}rD;$Cyaj`X+Jw%Rgud6o)VXiCRU3rqu&%GjmVo8E`|BS;v zQT-HqC$ADHpt>UhlSSTHi*A2e-Ntb+_IWResO7#aew$jtMVSsR7>5f{ zlGa|m-pLoiK{2n6hpVfUURMH7Lo<_rBD;}*rog-R?Lp59-qY$*0u0e-TI!2+BbOR77| z4a+{|>oI>Qp7UMmHwXt%H6Z>>=L8ez$*K6wqWLUGj)Zf|X*sNIwWVKK*n8K{@?X1SG$tK7>=xo<%_V=FMP})fHW+ z5}evx%MmNkfBOtrO#_-0o6($l84awV%bDK23=vJxxxwjyn*x95>+0v32H_JRA-oTa zmbkJ>-!rID>MaD}RSVrc@`m>}w}KVS1H2M&Qqo8M z;{+DJL2$APO%*f3u87UY^%YKD>7S1tb2VlWK(?K1NHxA^zfmt)>nHkw%2$%Q&)=$l zphMTVbWxw!rYgqLbuRab9RaSjCfCtkRFUFrpZtr*P^S+Hfl~T@5Y$$qB)Rx4l%Nat zef6%WECT%Bi|U8beUK?l9+O3C>_~uX=~3S>QUS zF@~x0QPwZ2?p;&}OinO?@2n3i!SI;dkj*en=E}bF?E0hp-)WZgx)#8vsOb0a`dcTs znx%H4#)Cy1Kj4$q8#o3;$>HLhFC|Rupe0Xrw#frFma4Vnr>I-j>t_Nk^s|YaMN7eF z@IP?QpGFmZ1u+L$at-vmAX2gwmfuh}ha0nycW?lW>>IZhJ^bVI;l}mwjvu`-*m?#n zzIeXfLxATxZ!%uSWx-j2dbMcPDy_N?Ns?!Rp7^ZFS#>eoKzq>UdcCy|Yoj?vc>tdT zcDs#fxLAAj)`5Ki%4??D4dkbkw*{cb7E>oshFbR0KsT125$||umv}hbkVLa`@c=?T zg6U~nnm|fL@XeIiKOeSr|MSvNu_WYyOw&$?F-Dk_S031C3Pq#`9gG$)Z(SjZ!wnGh z)5}}+5JP(l*oD+jl)^3+WKp7s04qPIJaCT*d(#j5W}aqK?&?f(2Rh;A#w=W~4Njjb zhuwiNuBR3`m>&^zN+gVE-G$9loGM)oye9zfk=AAxue*!RxLnCV!wAa5_i}278YT6? zxnABLU{BYJ*0M;2apf(191AnC%yB2^6{eZ;me-Vi6X|O!rOQV!KvEM9EN-4ckeA!n zmBw6&Zl+K|)H#D^O6{_5L`V%Cj?2Rhq&q>cxxnNLA&2;E3qDvvfmax-CXs(qexzw(y-JsG!( zuDb^jbfy?fz@>oXaz%O{G+DHP@YexKi-|1fFUsR$U--$WLQ@#HS!7cm$x zuEqX_{jpiK76?VheuNP8&!`9eha#?verW-p%b#d-HJXZI+#gLE}ZyN8(st;a- zpQhkNg$hy;^VE16Gs!9k^(N#O)%E%mjFIWmrw#Rsr>{4{36 zEN;NsDUX*3(EE;uofWR^D{p0}Hn_yO-hm!3PQDTCi7H2yZFIr35%9afQ8EwiMk$I@lwaJaw}xwRHzR&`j%d>g zC&D(8oo1@k&aTqCkZ^&YFzx+Tn`^jQTr_DkM4-C%MIu16ZE&c-mXgLrVl0Ukj%zsC z#f887I(5S77L7&8_mWLa-b7kMre?SgMd2bs`k?w-QL2z=4?9=iMm+J1ocpwjlc3#? z1;#VbtVV}&#$`z+z_{RLj0;{yaz85YyUXYY*rRAKkf*br-F!5T*iec92WxYdlgu#=+@*mK6H1j6u3TI>j1%IJqIt-ZIZK8qB zi?q>A=**2XOXN4yO&O7UvBN_H7lIZiWQ?}g_c?K|?7iO63r)iglaZREvde{ZV}bH0 zuA9Z$^e^;WOxY^RlFm~0^e-kP-$Z@^HugQLv(dqH(Dq8q(17g^`I{5w-HN_B3 z?Q+}#&KfcH>M?Tl3;DY9609}cR)C6jWd5Li!z0V)X{#CCC)Aw5 zpMrckLv09rmXU$^F7*kNQS1vbI2VXN-t3(o$^MR=(U1Rrr!a6#R$GnADFP0$R^L&~ zmvIA=>hm~FG=2SYo+;Wj$K7CH<%7Ygj1d+r&Wj%JPa#em-4R!YRy-GiHa|e9ZlJ!L zcawO7p66qjudd+n&5P2DEgQ8k0&B7=wLBGMQegCo?`#H|^a9A${-{bHbup;7f))3u zKhjrC(Cp@FKI(r|f0(*eK4ifJw24Q+89$}|N9v5E^+|i`=(K%J-$%k>e_Op_Bjj?L zsZ&ro;a@rk-AyZb58h)M3|rBdNd0~O((|0m9IYtb01Cz;CSkYRd;ZcA@>z9mmd=hf zpH^Gd9{|53g;A%ucBv`kx6~rwazqm(H*?~oX!7z}h;5Q7iG?rSrH-<~v_I@1PX)>q z!g1h4lu=AtuFqBfeUlt8fGr!=u3vP;Fqw9)_m>~ z!@)e+!c+!sEv4;H^+3T(hi|Jb9=>gHX`wcMK#VY|6qKYV&-pYz1@0)LEK7N{@RIV5 zk;a^)x$ithHKEymL!l`d?TqTj`Djo6*L9v1N8R(IYD@NqcicO6zs2CHZ+Q6Dkh}CT^-|<`(zQqts=qq{r8Wmu2A2VELd7xfI=Sye4)u{YMci|FJDo=S%{v#z}gkKbz0XJ4khq7E1IFS;3> z%Q>s&q=_^3LdQ^;FgfIB_*ExZgAP0K(y-kmAK9@gTyD{t+Y3?!BNM{7qXHHuQK%g- z)?4L0l-Woqr25p8j$pJd8;>!RAkXx^do>sYnJx?|z?}2ff#&*JE_`jSNMSnNU91}2 zd)Ayc9W`Y|DV1)@`mp+-OyC`EHX&|7iiw25!Bi{f6A(c>Uzn1HpHBbh8P1z}K;1+! z31_Yd$u(y2@qr~5FJ?R5gPQvMS%}iCo+`&mK{Q!y2j?OHEBF_Ghf4!MmS!dE6x0sT ziPTC^^gaf!?#fFyyLxCNSeHYBg5aFjZE%ZuhUE4p8?K^VJ*L0-&flqzp#lEcAmYX2 zIfk{vzN_Iz&!Ek;k+A4P^gjA3JO&?AORdwK*t!pHxXyX;et5Jh@L1dMt?$aO zg$jk9vU4G;++gtF1VWhu)w^a%Uc=F47z~~qsvb$N$0lwK>skxlEveRL5p7VTQxBq& zQ#n-@Q%s-{YWhz6@v$272!3{2XR&l+Z8WW{WIwx)n__NxyNGfO)vh7y&W$)rEVx(d z*bDJ*G&g{s75+5zz(v<1t~!sZbYYy>Y6i4~INPCK$ml-OUuDpMynJAAF@%Hve3`s!>N=lT|pP zF5?vUPjAuW-_Mkn{w3~fh}1;1Z$hzABd9c5^$QmwZDi-#J&%RHJzeigo%Z6nCc0;p z>INs;kDf!e4F=~ufk6Ah=IZ|)kJ?Mo4SN7~GdJj96?ELDMyIre*B}E|kA4f`xL^J4 zRfia#JG#KRYwV8B5ow9T|EWDZNHqFej_Tw$!T?^}%cf~`Fsc~r&Ih>X|BjMtp?1LON7B8tr5CX@#5J;!Hp^f9Ri=|7OKlOsCR~!zMD+RHOsxs%Y5i0Laau(K z0HbPcO673eS5H>Rw_@kpKYi?{_IUOHu7+u1&{!W)F?U?j znMR*dFE|%8*G_Z5g$OJ)3&CpZF^Ysi3zHFl13|t~eF`pPNt1%t5!Q>i4Q4T6A}`!x z9R?>Hr-;|DqwWc_3j$?NX#-v^^bM-5C0f}ldq}2I7NxOqG9rc z8ZIn6O*+tn_jo;V=27=iarHC-8ZYFLY^JXU>vW!TgNMexR>HKNcTmhR;1>SWj({@7 z5Cs$Kjm!_qLW}y^c;8h^%sm}rK*A`mNc;*T1)Q7KbbiwL$bb2uTI*WhzC+ywaYw@= zP$8i?6ivy23>zv0q9Mt?4`V<}zNChbUXg_dA&0j}&X)GJ1CA-=XRNj5-!R*X&`gp6 zQ1WiTZMjoTfbq9-{IcQcJXeWCZ=zr(I^D^ zS@kz)-AuEWki}2xR|k1~<}D-UEkST@2$C@M@9}uG2V^`3VcmipDEnO)Oo=m*n! zXKV!?du@$JzRjnp*LMP%-*dPj5l$49;IUG|fez|K9)2Hx%SuNT7REMN4fjdC<`FTq zz-gv|w2Kqfu!5${F`wBJ)W3sngo{V-F;clqV{uZ!;%$0Z*!$m@RqV1a%rLV2^+}mQ z$dO>Nc*CHxW7Mw($@~}$N|XuTx*lVg!`m_xErjBxWmLSg`jpx)Bai9y)1Z0ExrV%f zRq};9yqwdX_T)a|#*Q9)llpC|k3`zY!9{b$ehg}Tp!(DdjU+=(c|@~bMXMxsU$E=@ zU+u96^iQ-RVt)c<4lvwh43zabEhk0@N#X^JPcgBO8!{CKa0K_$YHUgx@FOT%8M%I0R(5 zGu0n_yVpx=B(4Vign9wiI10V`>DQ04$`nBYqlU8vXdxqCv~A?`L?^&G%l=|+VLb9m z&jd(z5e6eUbO?w1}zyC*Slxz3K=|MMmW z25xMGot~b6J7S`#Wm6H6*^iD!TUllr&HK=ubP-d>I0NDIfD*?FAWzm5hYdc+xJ6CUmA>885=#UsTeRSB*EYZ@WIJEP-7{PqD& zP+!kcvh)%dC=5*w$z<)wv9fbQo#sE2@R*l54=gJ?1IIvX!v_0G9j z^GrRirKB?m3ejqtxQD0}(BDDHoQtRh??94MJ4b=eSn3y<^Y$}+W!36qvPgORU#fYg z4EY)%oe26!adwiXww<2|^m$4SIBQvSKIHB#Xs?TkRYh(7PAo-*ufxF12@w5p&GQ4u>WxS_8`{r1&@Mg#puGSRnwETV@)etz zEo=i(U4j`8LM@2BwaOD(^8$;7I!Y0-^cBdH;NJ0i6L>d&QQgfi4NTm60m~b=l=*7H zxOB<9MT}m8I;ly7eN16^2AY{wQqspW7;xW3#{OM&XP~8A>1{|+f{*=avA_X#->uH! zV#zf|X-L!1EPIhn!1XjaTx>9Fq$bt~enfx)GmxBLS3hU*7rj|I`k+`e=qdP8*^6tH zhs^5*b|UbiM|u^3_p=sz#Op=_tSDKn7sK3VENJ{_sk;K=gpiNJK{?%rlLQ`9Xn|2t;4neF6FPaI4&N@#w-FJC^?suP4uFpIpVK1IK@&o=c06DmUx` z&oc{9@0cM#_=>v0J;%_id;;D=;~%Tp$P81Y4g-xg`Q4aZ`Px7Dd6vzVQtgjbSL(gG z4YRO9Z$0&xA^&nXb(;7JdvK(og(;Y^!p9fe&`zqD6Ul3gaiD;dDa3pbw(HVE(Zq3* z`mxBc){_{(o1!6jF-)$IXV> ziaTRugifv%&BAwj$!YMYXR_bUlhtoxza`9i;myFbIAyy#s7T6STCPBk{h4<1^C|vo z6-6<EjuiGiQucm%|)uqDfSU&;vqG z58YvNs4l%*y$JLXKXArLzkpw4D!HJ+oOx(;5=H;Bp1BF>+HGoHh00>-5LDVb`?C5^ z@hu_R=v@9SjfHDa8C4+pO{wDMA7Ns$S`Yh^`nNn%Qp$lGe?U#W(7t3~9d)Tw*4*Dq|mnEhYer7x+M zVWR{K&X;xGZKLz~4P`<$+}*qCO}bmcw3{Xo&z8=KPMZ^Q+XRo~CE+@G!&B+%@xRqJ z{+XBJL0<=h{eJbntmaXfEfdTuNpU5AiV9`Vn#NH?l6kOKVH4{O8b zR2>PwTLpplH6;5S3BhuRjp6^n?tN@|JI!3SoeuWf=|vItAUHrDMX#yn2s zt^pSGt@5a7y5HS~DKT@jP2rdo=pY%Y&yRRCAIAgOPqyv;oO%Z~HH(u#AZ5?w>>-dd zWTsro*z$RwMc^aG(oalX`Zi1agmlcXO}xnvhH*eKyx2$PZ~yI{?>gJ;^fr-CNYiR5 z1;!x7_(!{xI8g*YP%b3g<23*s&c2>7>fN45ltcb!P2yG;by7N*oW);FNgO zOHQPY=PrpD?$^hG5sm~)*Uua**>8=El?xXnzS$!}*Y5G*F`_PN;d*67YE#{l@rLPP zA+s>YwQTe@G1N2~B7<$fC*1!5zeiDwEV3BL<2A3d4|GzzW5V`P+;#T_9Z1g8-?uNQ zcOIOIJnquA$*V5rI^44~MEwJsqUmZ#W7f`L&ee0q;IjQKpF(N*sCqdP z0=uXkkX%CBI$0Q^RBwPhlS#CE}v>TOZ!I=dfM=Qrjs8s-WDaF{wb5P>c> z>TN`A7A2htMJpn73!S`LeY~3m`aCtoEjvum-ejS8Rw1@~f7c6kr zug~f<-%g$+r%*-z#K>`rF+Th@4o@$bxL`krLJ;(A?%hg!0x3oVNZ}k%Vf7z7_}nE-ixv4s|7OGktQLXtAf|4 z;~Ohr9@c>FqTWL))M$Csp-^QKbLRoy9Q;aWkq=|YL5nUBAQ57er+#e_6*`OFlKKf3 z;o5vj6v(`%!_C-<=237#jlPYY6Zx=>X=#0`Nw@V1+`q&jmxWC(r`pbVZ^xLh$Es_| zHawM8p!gJJ@54ZoNYC!BdLMcb2N?H+)-bf$BL?n|23tWR(yt^^mZNuutOCWe$Avmv zT+uBZ(@?cVT7_m|+2?@|ZZ=|Sf2A@Y7e&*?viJ+A1Gea|n29Z=gf z^)t|S<@sRM996d;%QebwBBWwz)6jLKK2HJ^WA+I&7u4$kjr-E+s8<}Q8fHWEPNRqR zI?wW8kfMgJUc^`$n!!OGr{6c!0nD;4ak>5L-4a(jLn9{H#Uf^qO@j6wR0{;nmbA(f zGtz1+C}<$ZGwJf^GX@_hd?~_J(Bj}wgA$H7XPmnp@i1DHB9U^>pQ3gWI$pj?C1w^A z(#}6opODhOSt#*cbU8qsAUlmHt9zQd3gr|b>epwC0wW;z@+y6LquSO&S<)a9cbt*E zSLd^@1}MO5P(L3OXu**KfT_^PYSTN#4geZK}$! zH_Ax_nYwBQqTA{hP?7r^1}-PivhYl2^c%Vi=VXY)_0GuWKBqkUZs$=}Sx zaCDw0Gw6=r35j39I(M#fHPv}FI&igru^>3C1LCd@+A$<~Jf#;u+xkEE?20z1R z$gh8 zLZ9*8jUoHuDE-D7Bim0_s3Yf|Gw5D&x)Yvrt8uE|ZBjh6Iud1=I~S983Mp5Ks`RkA z(+Yd%I`uNUdu(HWth$_ye^hNzLkSC*Xvn0FG8n~dn!JO%1WxK2)sE6sJJHtAFX!F8 zki4z(B4D_R6~we1nauv07e`yP4?_!pY`W4vSmqtHHaht{Vf$$gd3aq44w)qJ<5AQM zIA)JYYOL>-k^0*c=G!nVAFX}?Om%cHi`m0wV>k*a_M0bt%vTx4_W{P^Fdm{AlfbKl z6T|4ULhsKamT5|7hUYyB1IQ#d0{P+;9xr&Ck5MniMiMz1aF+pS<}p0)(43F-1-R77 zlgLl8m_b?eM0?e(tF2H<8>EyTE}GND*s&!?{eTXlq?1ebw_c(}aTY%Xf}dJjsC9yw9?i;zp} z+`zw5KZOoIl~X}0JV$v|+NbbFH4i`K;zkQoDkv$A-W`oq69nhnisil>_v4>N?EEw8 z!g~FTu2!Tawdg~cI~BF`N1x9{Vo(wDxR5N7Lq=N9rTbMab+AQhIvx3o{Tff!nRe8z z+(=+4B=@KsXc7Jv`0LEX6n}<|jsHCrNnr=8Ta|Tm4{jp!pA-h&<>ZIe5rP=)gt#eL zO!w>;_e<)Yas7|3SkGZDdDVsbIkqlFd}Tt6+ds&yHW>plPrIyTZv_Ho;8i&g^pIu8 z!&6G&4Hjy;H?)9ivV}J)$FZxPg7>X)hTOrX?WnLz6NJfmoT1+Mm?x|;^W0EwPp*5M54#yzRjP@U^o~o=zvSjx&imnCW z*iFn#4|%F~X_T~#mC??4V_#1yrWP=UxGqT@Bzwvr)?@Svg7tj}<)JjTB33fxQJt` zkj2!;XmvGm?&WJi>Zj35=$e@HDvJBTu7 zy?{C8Eyku7$03bbORf9?bud~PM|k@6(ZWyiI?JrYO|Q7~S#>m8@o2jjZbGt)gPNR{ zIe0Dr?x$UFj{-T*85P{S)J+b!SaEa=yxs*8IKA#!qXPK{YCZyz7t>S~bu00y_jzRX zNp(0{7Jx=z_RWsVTlORB2$m%m0X>M3*M;K_*8(@hM^r5a?#OrlJ8CXka6c4@5-$It zBt4CO`)^XmBQPnzvPv02E*Xq;UGGshJIe#r&w=}EeZzgT!*PP2a=DgBtCA?}gYL?U z+yN?DxqpstougNo{P365u?QLD&mMltbecD!J>TuJIy!s8yCN12am8cJ;9QQWZuzaF zq>32G$U91Z2W+1_M*NC)zNvl^Fc9y&?paq52x`Js1Fc2bS7qZNacb%jz!KxK?Wphi zilX`Lf@X24!eScEF`lQ3WQU19$ja6M$NMFUNgmy>i(OLjC9E*tP?F zl^~=-e0ewDtH@-c7h^yZTo&q2T}wYo^18VltN+<3>(3Nfe{Fd9)61tnNgwE!u%S>M zqRR$rdH&EbUuYWU3x&9`msINaDJVTYW3NYYCKpE zbZ3{`z^Q!}Jkib-Aogc;0F&V6W`OH2oZM$JyR*IouAY-7Zgw|*J*U|YQr%8EhtL8p ziK?5_U0@Z5>RX)aD&`jHnN!GiKHo(`V1H%E@gMtK?*>da_W)@Q%bf8>jKON9#{`~c z`>KJ58iUx}-2s!YvN%05t>UX#BpCjEsi}Sfn{vc~Tpm=+LtYO=57;E$YBuUEO7ug= z*&H=T^1p@#A*swi>lu+!IGhIiN9rs;OHvs~86;1@;f-$f3m3iCyml507ZFR)`lWl+ z2G|iN1`HJ-&O)W3Y{S{GI){`H@Iy#gJF~y3zFOyTo_n8h?X`4zb9w%tk6t(CVa;-+ z4kCbyeAh6N$?Dd%m96Wl4_&;gPrzB2toa>$MAxccKpxaSYMiaHGQ=dIJY2^#5b(IX z@0xpw=Zs*!&>OR1bk{B@Ta)ss4@60wF%B8B1O7v4kmVu9Jtzr^yzgcs5uhGIP&Q-$LV zM0_bK{ww%P%^sg^*kdV$VFuP|$Qhe7H<^7dNag<1PtAfcZ1(4ro^zuz&7AvL|NlDo zo~P*hekRTh6EJo`)u9Uk&Gp2V^WS$=FOy9Ynak~^93GZ!-uY$bcUe?Y*}6VQr0QSl zevCTR61`_0x93S3Vb=j+lw0gl^yNXAIaS|8BD^FC2TcyhLs;Pef+|~29|lM2lNv|Y z0!LtZW5v;6+;QvLp$_yZ^GcrnkM2ao@cvQU(Jyv_mCZ&#W?Hav^CqStHPM!ydnH8w z;tYenx_&AjrcdjRq%j@ekJQSrN7bt^E43Z+!+XBNkkplvw1$zy-sgyHb)@G7TKvaB zjC=mIzTIch^SUx(BCbabDOi0|&JF2!BT9NMi6T_2ZW$PK0t!EC!o&LAR@N>vzbj65rG)-=( zgBz{qxzEMH|54}&FG6>?nQ#*o-gF)bQ?oC1$Sm9$DHlTwdWBbo&+TFLIiyl`dwTK% z=tZ_Ux=<@zv6eBRH61_j@E9FZ*S*iouEUOvH^0Zh-ooAJxv8NHOaTTZl)+U+)~wG# zrGDTsS87y}RHF*F3m0reAJuH<;e40-vVmULTUO95nCDP)v+7_b%~UB9)?6n1YX22( zo1^V>tT0%>^&E=ON0`L;Aj&~qw%y`FpSZ$_$W}7 zbuRN&nOqIcvlSvlL8fxIf(&#dY{I`MO6cyB)GPK+)#h%SnVp-(&`}&ikh?IxIlOom znE6RpZ2LW6aNWN@TW@U!G6IzwU=X~yLr{(D(s>p-hUa+}@`Gi&dY{3j^7RS(bTa4GDSVjy4)qS)>9zLU*?NZ&9QAr3?t=7SbQAgkZ?0j21`_pd)|IV~l^7QxpTcSS zMfJ{spo%GMIU%b7p=$vL&hg3bh!eaO*m+eOVC(HcT;Fo~}57KZw-7(VhO zdT{H>kE-k4wc1JrZA7}&`(Kv@5T+Wx(E-Tx9X=wH`*K3!mjSdc50~I~0QdC4u-QHW z`!;9*e_LWNr zw9{2{ihco<9tl?Sg6>s+j8m8p9iIVwuB4kV;cZv{few)5dLHqYbwypMirjmdRG#8| z;$GFoDXB7@NF1$kd#DoP!-7#s1k#-k|0HiE_294f#oX=Za_w~*$3&tBPKBYn_0}} zBUlF8^U{OdDZvn?%Sax4`&Y{&oD1}((Fk2K(Y~vK%d3WvrIe_9yzakgX zAV=V?i1^+9u(Q|-(O$6I=rlK|jS0>)?Iv-=Q-X__PSXRzPMcH5kizg|>RQXsU?UcR zk`2$QtXlE##lrmOD9fpA-D+%GQfX1N_;eU_8rr6X$`k#;+8xyg@ATRini2R!Auj?+#tvEM2m~ulDJS$zoh+_?G?7hqbZHZdX)A{ zwEK$KnLd+0^Sgdk&*-6iFugQfst0(wqDK{)-yA3AX_BeAV@IF$3eq7S(Cz$aJ*O+Y z=RiKZ+j*W(^iIqP$F3=S$~yAWo7?O@Z||v3)GVGe;)`xIkUIQYW)lueY>UGhq+WEtfoM?f%h}KM zRgPW|aX#ik->(8adWNdqNvKb zeZ6TG9Jsh(tD^gzQ-W{?3{S|ynl1vpI=U!Cy2 zO5NM#=9-vmNm<77s79HlY0XLRV=6}0?4C)#rjM!*0pRHUmkVl^Q5#AR&9X*;zOsuR zyA94?8995H+IMRafT=ej_e1=*^+;m9E`oU1PxU2K^sx77DrJHYeVBkoh(B7Qi+gwl>$>S0i+9 z0(1y~1~d{ubhN7lZ*Kr(lKyv9UFR)5Dti;UzQ8H?pcv?G=2=FuW+DS zC7glk0dq;WIv~!_YDn*I70S_YR;y9fPEtns$@*6`(LADVjj%><@rqsBg$RHvbZ`2x zp#x+|0Hleg$R`8Qntp8Mb*&ukv6Y9jVINz05EQwi^mhijwU=NHR?uOOHEUV5?(F(T z?|dqAl3bM-e`*JN_@)HL0>x4rbLq3nJn0gNDU)>>|Gi#kQu+kBGIP_*(ZfxqF3f7u! z590n#{Y;h%ZzMqaKvD_N@QiZj($3kxLsLl34~o2Y3&9!^Rfa=J7RMxvcy@o6dQCT| zw<1T5xI~BByO@H(_v0t)`xL3PDCg;gJ!ldrPqi$mT-XMKwz5GGd9Zk&I*&igygxuo z{&kwyL2YonA;Fx0r5j$;X{Xd#81ptO>^ZC;ld+CuOj}cY={k03-gX-UdE0H5{W=9X zRM3b)z$7j04C*>j1=Z6OS*f;nOR-1j1)kn$ zCeinG=by1tj|(nHD>-6FH7B3AAeseH@-975YjY#9uR^Ul7He1jz3Q`_pw(=jffVET zJOMg=x=y1hsK93tuPKWE!sL&S>uiDOjS=qvM4bln3j<%)Sv zj?x%+rF6aQ46`vD@jh$@ZUrW`LiOc%+iRWr`VllFkPK2TpCAEBI)*nX%F=DWPL$5o z4%W(+e`qSPzs==+(LCH5W!cc1k3Pzo*JXjtenfa=2RGL@;Cku>>p{CWNp15{0tk$t zjlz2s)#E4fQ3phlci(7PUt)g76REaI)fuEl@zS^X5NL!^Utc1w01jo|Xpu|y!tXwc zzD-G8Qdn(QHp1?phX}#)McKdwM5DcZU3nZ;!wOujQDhl2)rao5BU8_OjJl9|p&31d z#@1EizbLA9aySG|pTED?HpoXwR>Dmd0iGSGIB)yEaF%dZwWXVF`ot15;!mjtFvg?~ zfx+H@@on{Ou`1a}I}r59ID^t;y3de{2l*h-6{`>4WB932C;Lx*70GG7AE}?GkgMBW zUc>;4RxksdbiLUSog@DTDRq_DK-dP?+lz-qB0)EQpeCnSHK?3MNA*@f=ArY~$Uxlv z)}9x$TA{0eP>*N27A~?fgfi~}?=y??tbT8boa`gkrmGkzS)*O_7cTSsmuxm^kKvYK z4P08aUwu=QOOVzy`2QftP2;T)x^ute9tO;`@OQ;F%dC{th??M|MMY)%_xzfiTn`(% z3@1+`j6Qi}656WH=DrC&9&ra&)?xf|n?B04BDX=eOG9J26~~Futu%CbIQ!~#gXd4^vn7s`@(6_ob-0RC@j^J*+iBhp87Qvb@h;D1--vSDZ=r) z=m|5`SsO^Y?YwZ$qdU|(XH{1h40*up;~D0mwKa>fy;^fzr=Aub>ndrt#sW^6j)x`| ztH@!DW>;y{+xvo!?7UFDJZ$vpt-~EHbxGkA-}55YL+yG0 zE7y*SSdBo8?>i0lOdSSfR#aTEeO&z~@%)fD)-qB{Vr!5a!DkUUB5-#{ZQ;>G)`8JvQX@pMRNhcYnOvqgAn z7Ej6fJ6wKV{fbVT%~k*(xfZ}UtYFJ&SDHMHN8Tq;^J6$Rm@8Dv!4Ld*?turr-fA;|IvQbJ{S3(3(bAbj_zxKo zErdah+pO6o4WrT1{xHeqtNc{Gm>#+glgCHHsr7y~MVgFsRcy2x>hoGzg$b2N3CkwQbTAxj zZMIK^TcGJ?(6UYE2XXm0{6E7L#_s0l6aP$PI`SXTm*a^eWgBrGQ3SUsfYY=qeH5#xim!SPYS*ii?zKB zrua9}YL?<390}ogC)(gQ3O}99CC7vidrN5qIG@;Wjf|8F7kHR}#>X{IT9-R!hDeuF>6$JOk< zSbZ%1s3`PACP^5c+1$v<0iEb>Zft~TeB^fRwTMo`;CvDb0W9GSWx|X(Fc_7NSUxZ6 zpgorNY@XZhyCso5=+uyFz^D^-0chP%l8h3ey*~O}r*OPiZjR=!_nEA=8s2~)9NGG7 zAb|6Vx)tni)iJ#XoUB|pbIfxG(8?Q&sOaK_&y9NJ5!8$DyImvf=Bs0j(IHGVZT-`%=n9HL`c4DsEb0KRa#-V? z=-~Hw`t?_FN#*ZxH=5e|MvF8gr=0RwGdPzQa}K3HTTE5b_MoE{c|UPAI{l?;b|=S6 zkL8?ZVj`qh!OfJT^f>xsma~f(fYbDHuuNv>hlA%dzXu)v+$K)cbL6TfjMu6Ak;SlL zlCQxZOm)zWXsOD#;5A6Kha*NC+RXE?1>+M*?6FsGKk1*|p?^8y`6WCKk5+&0o&i1C8X$Yl`J7W zg)Yt1E1IOuflhq`J)FIBfMI^E1gAFFve=x17emk33Z*={OU={N@4y>Hy#}QeiC!Zc zQ*pyQhswmfC$C7qA=D6hb|1t`JsddpEj%L)Sl62)i{sm6VfWvqZfOKfrwsr~RiUbR z-4psH#*n8;=-|^1N}J~`dJwI!y@nU@A$5=hDB-EuTcrQ;E^Sz12N9>Ojft0{AqVn` zao1FdWZBjBg1W7NfC)0!mO@%rY=@k6b3H1?^1wsxokj=-`|wk~G^_58ZF2;8nL_*g zCYoRRiK~wyqyOy8cqQGadnD*|nRPXSz0N*V=$3%$*VM~_&Ls?47Njn9>J5koNt?Ch z(th|1j$2ak;yTP?uCS;hI^yhlyXXq;P;VyOAWkN)WTAdeyjqcC8O1b%U35Oz6`EKk znpnmI#LFOe90%+{Al-IU@UneK9j6K1GeMo_DvUTf1kc5;falUvuWlgdD1FHh%60mC z9$Ylt%Kap6UysXyHK%bs{)Q>nVl|oKc$5L#NKzJ&^MJas6Rd}4Ir8BOCu_z(_!@8J zmQfM7+(mfY_Ft>1Xu*X#2JzXI{KJ^C7WxZyAX>;sD`=p0Ie$bZW4WF0QnM?~HL0f` zB=9v|!!v4}u5{`vP3BC3wYn&uJE&fr8$A5Ug}*N?c)fp5v6&487X6i-K=u zCgH~c`6&Rxai^NCU1lhAu80Inj%(XMvPvOaS+y7_)Co^K@kPa35h&QXUJL+gv`YXK zzK??Yd-ePHRS-?=Z+4((4MGz|V6cl8!vlFklrZD;gbeJT&p{o(?d3Lo(-cd zz7^j6Q`8g`7}lkDUuqZ8JSfwSKzz`4sb{!p^JC*LE<#xv|P&yLc3O-*9xz` z4C-#t=l8A|Q>|W8{M!?{ThRVG52)PT-F^X#s58xt-uQyMM zBC1a%Yng@^9iEGnOTh#w0jxcf!k(z%#}ZP$V5d;d6M8ze&Py%; z=~*R?TPkRYOT?6t8?*e0;Me^^s#yn`tfI|E(>-GoMZR$F&}n(WJS#qHMX=USt2b

S$OFT|`?A@ADr{W@XOc=Cw>xuxVe615;B7%CUmWe+yRupcim zXVCeasJlf%s<&H;-eMx-S9siisQyh4-AB(I;VQ4FNeOB5-EMQOEvi7lA!EsW8!y2c z+j%|Uw4X}YfpO*7(Yq&AW3>|m7uc|L%(s554Arc@-Zusj&T3$;|5W`7g+C2;sJ|2H zyqi?Y%lRBbV8Qc9%@%xiFJ|;pP7GS(JP6x&5!g8briwmwY&S-dJcl=#)4PI!{acNg z=zrzLCYy2wNyEi$`~o^Hv#Z|DI*(RAxj`y}n5!fzL}k$9Y5dl!(brrDlLiTnOiQHt zBXXi+8go1^O#TM?_*HdiBM8pS!SBP_o$g$?e5ndjgd>}_OH7%2f|{o#*~lnw%{sYZ z7Mg3P*(*f)1G`W9wwKK&40isncEa^aFRVBZb9-LZ2>9~gKC}^H^mEDR#gZkXw?<%= zcj_BA!j1A)Thyxw)p9_d`h=fJD_M^tVM)zp4F?<2bCiC1S+9{T z$rLO*|3V$phdkQug_|_EHacftU*1HYlYUyA)T_?~tpJ_x`0elpn){51%8#j|dV~F) z@Iufoap{j*%xKt4T>F0YPN4wgc?k0@cZgq-7iSR!TXbB*&4 z2k*(}()}polj?|G75;W!xQv(e5q0OrX15$OILmdPernZ3dcGBK534O4Q2rUoSUzcv zQXKj-d3<;1xweN@n-FZJd&xU{cg@xCfQe9eH9t^pJ^DQW)qCZ3&>A|-bWpq>tl|I_` zr__R8l)}P}bS=JeHbLF1UazeRH$r%*NmY4igw;2i6WvCqiI!6BerXcIwa8vh3X-U6 zeKtAmu0gjEQ)e`wGze)3vViiLI)LWq;5RvoINB`6eYd+PK4I%q$XoVEqYAG<`jHE< zbh93RF~C^HViga!yidK1-yWxYLK!^J3Qu8rLjeoyL}BR^YkVaqhC}Il)N6QWQbCLF znm%+vFbp1G4<_r`9FSHTt)Sjn*hG=;dN513#+h+)Su>p8Qvfw-Ahr9NE=qJJ1fR)J;J`t zoU}OpQCxM>X)$S9@sJPgr#qSXV4LS{gpHJSA^$EzC7PW+G!;2={ftOE0qEIec`Wsx zm)%#GDQQt%k3)GR$5SkYkJOzorHF0+k~*%L5OpUNFIQ>L=eO1IMhN!42nTp`wTZ5j zJtPncliyrF6?B%uzJ`KD??EKYoT6VNrA4xT9;aS_$gz0VCDj7t53jSNv3b-ulh(pZ zTzY}}aV!CA!S?4TlG=x)ZC=Eyvc*@qTL7Vu3H^K#Kw;v&WSDwGjPWJr)H4ByJ%#+o z7f8d*YS_rXCH+%Qae?=rLzqqbbO8kA5eg!_tTYb6otdZ@Vwp)gNR%!^2+>J6d8Yw) zlf%raXStXd@VC$7%}v_L;Cnw8zdzc=pd*ki-{oMS)7fiOT|&Qg8yBF1nLh!Ops{8!v#kYD>BjXf4pLw2r2-OaR+t(^05;SSX6&qLXKrijA zn!y6}vS=<+^yZx+CnQu9BbT#$ruan<3Di&P)Q)SB+JU3(LpT#1E1~bOj|y9mU&ODN zX+~`vD2PXSvol)U3?Mdb$-s;b_`UN8sQ!ZbG^(-TrDV^EfZ)ibei@g>9qGDpY%>Aq z9(j_w-s#lOcb5};qSqPBd2jNYIlcUNBJpD!=mY9pBivxhP5iMskdm4u4hn4k3XRRB zPUqlXwY5?^6c8U#FYF@7PCJ9A@Fa&QEb60ny*>6d91=BU&o}E(Nsvj{ zz9#!`2W)EetFtbXUMy2hW<+=K)pf!2Y*GD=2HCVhT zDXPQk$3GJd8a=Tn{9e8PqOpT9p6dDFJfm`)S*)>iy4lsZL%z!htZ*L|gVu6*73M{K zeUz16V5q`Xwf(X#O<6EZZzS|^f~m=WiL+Ko=~xWw4dHR;3thjhI?E*iWB< z!(e-`P&~Oo^x5O0j3S`}v6X>;OVaU11kmZ1tOs)tu-bq0jOc$g^&BjKZ2qBt|BH3% zdxMTM8~b>UEL`uVTw$ugvk(f5@DoPf&#Ke1g4yU?^Ng*scz)XAMfDfT^Gw@=N0~Rd z{hR7uSYVqi7!QJ|XKJ)*^>La~ec|E#!d>2KIO7xXn4pGN#5j~E3(kC(gq@xiS4&nf z?*4%4QP@pO61Wt_Wye@3;>}DWC;iFOW+Vp{l`>=#+jQZF)r(3C`ORF8O%7g;O=|v4 zUOe57|#ks@B zZ>vp%SKV_l+gLN|P%QuJmSa_vnL0&VyWg+YAwHOv%w$l=p=qgfJW3r}d^z7{WB=GF z{f!BCbp%)bLH%kQN$_y{pu-us;S_RzQT~&c;+#oF`DTfGk5oNL0^P&J_3E)Y1^W}c zz{qvJeM~L4H(Rag(?R3RpLh0ax)_~#})T+&uN|zW2i}da5)H&7` z?M!ehGPDTsdsjn$f<%VQI3Y6QERnN)>O1$TJDXj8ci2~UW=P1UGMjQ^DOEXh*EKxFO>a zOi%(N@@Y>%{21CODvv50MiDHy7~cuiY_oeKdP)ah882Axcqp5)l)SDHI z^x1W^m9-CNAN<-pk)1sQezunc;AAGNtH<|yn>yd@(uu_YKhnW4GlK|SKWINQ?!>;> z&p<(R;P^Y<-c)D6B)CA05JMM$`YZOxcfv0EppqRG$+NUx$pb%QI+j5;{FPdD%JTpbJT#s(xIX^2 zq!*V0ht%r?Q?uX(ULn65RK7daZ6w!`P8x24Ij?QfWM{@Yw_%6Yp4RjF<|P5e9OH{n z{Id#-YKGee(35fk@LuXMp=jcvjo4E~!2GYsFT$x&vu%{i@N6?ppYF%HbT4htCXV2~ zjdZ-5m4&&mzLIRfk5!htCP8bNzb2U4K3gxw+iC8}dc_j4|~7N4^T%#OV9mHR7zHQPSh?1XLN z%;bRNRz#JceU@;l%gSffacQQ7!^C`qIk`U8F3OzG2@{hhaO$$r2h>Y+=Q?@>oY*%P zu3;EOnzdSyY!wiE(UZW6({y{>>`9*^R0j|2z3sNS+WhQow~;_LnU3+>wtE-_-d=dT zzzj)~HCk_`wouY?4Br0QTv_1F9@rbgJzB;|4;~;EUo({4Y`}8tN0M{hSY{(c_FYMH2~( zVv>D)fc>7YS+HLnviY9gc<_FkD6f39`lJ)R$15|7a$M7^Ch1pJ^dwkp;KLMZ(_o<0 zDByZxhlr>z$k>QzzS-s|6o4eDKsewh)H@Fh+%^4P_v|U=~vXe7=x7Fag;o_ zWQ<^GQl3rPipia^+-T)I+=loxYVt>smmUzNl_&b`7#-c*=r|n!u7pv+?XPk&*X2Admdr1ky0S ze_^xBaZ<($XXy;H%8$d6onbq*Of5c$&|A! zz~u)_D^9a*DOmI-P-gJQtS9qiLWJeH<*p3wJ0CK;D0khwSNW`GXfLpbygaY+OKP&& zmBxoaaPiFeh)VBPpmd`j&@BzONDUzYB)CykFH_G#u!cZz-~6tqkDALGwwKALsO>|5 zH0ojy&$YF7*a;||fX+DTf+s=MJtQz85ZgnME;kC9Z8ut>u1x47q4cS_xoH-0|0}hG zlnc~`VmcR~Eqi5n%fk-mx|X^!NMMcvD}b1-OUPR8Fa&iGnZi`<>6P4RhIA`2Pl(+z zSA^<0+a_(F5yDZ8`mp#wiI-i1ytOkNKVL}|5JQ!hdFj{V;Mdx%JAbl=Upc?m-iyZK+Rlh((9wN zOF|b4g7o% z6BLGCT?o}iip;1hMGDqPD?wF@D}N)c20Dl3jk+^!H$eS)4$D6_!1~gBf(m!;A_I)A z(#T+nn@aulEccb~evuYTLZ}tz;Xr)7x(T<+IlFRZN%i1&d*n2UB?DqRIb_6R*l&}J zWb&ir03u^IFTz7}ks9H09wbD-tS4KTmKmU^EP4!gswwbm%IsYVX@L12HpS$FL2@U<0waxY|BKw(9s6hj^*AwGW|ez@dPq zhTUL~_^_LN%p{-QkCN$X)W?K-sbFznL`1U+cW=FCL;M_uz8Oj|#IHfYCJn@jh9Q=L zMowL|DX$C2EwX@1Uuf9=Z0oKl@?%$V#*d-onCn65f@dMNG(+_kp);GG4$-L9&*`$Te?&m(1)RvfUx zH{wGlknjToucILwVI9yA%BKRf+ZYiblCCj_ck!Cz=v+6DY8k^bK{eb;c%GI?4z~hS zthr#dhhv2pfz7FCfW{`RQyRWU7U}$CQ?jr9xp!SS%k=~=uV$Mz`(H`w z#Nv5my#~D|M%QuMW&(GK`Zo{gfZa#W7`7eke9>%&TLhGDjdDIz^}D=m$x^0kPVBry z-I}sb66vUMb49DCey^~*{O*_OLY&A>sY~CC+#Mn4`8pa|(_OG$ZOS*U@p^J20*7)z z=?jvhh(ZjcyDh0RSeQ&onBFZBY<7eEF5?AUHt7wwcgb9ey(_Lc@HSh}&`)rwT|(=< z^hR|{((RGyROx4CSo!D*vF%@u`?iq-j#PEd;Y8^>o1b2&4Xd&XyL#RB$JMke*G57B zXW~>msonss;06x(|K8 z+9wAtO6S1GXthNoI5!dDyuc=ZF&eg#d;5<`D(nkGv}9wK@JO)1mveBjyr%%jj<(OV z!*ioU27c{E_mu5?o^%f@}>Q^Xo@m4DoW-qDNi` zICu2Qk*Hyj4k*n|JlQbZ5b+v$l4+6D-Q3s+QN)&QQ!CRZ2r%;Yklg&vHxGev^m6{+r0xp&t$F=1F`cM`!SDx;iVrW`7*VBsws9? ziR(h)#Gpz-Zkf=6LL~{L?1j!BVOTuCO3>Ll@_@X$$=dcR2|LD>KNEDh;(;30dIWIfKXw(1OOGQBl%^t%V`;csXWL{% zk7IE}mb|7+QA|H{#~n_N#-;t_gRr)7R1WReCDLlm?QYf{k^R)EE=8Jqrr}d+v5YKv zt3K?$g>oM0NjB^Zm@*axd0KHcDu9T1Cn7k95v)WK(@L;1pmF4q=I-yQM4BHM6zdfO zr};fZ&oSja8TNhwRa`+VywGD^V!K_vU#6fQZ8uQHii*Av_7pT0v^_$iv5Z~ymogd~ z&C{C%<@`&c*!wbzoo`fo+6I6-J2SX~Vrab@578oJh%=c?#!+DmxEFlsc2YDFDN)0& zbRwO@JM9*Q#%s9?WFE)t^zTRHD4xw+>f#AQh;m&96gYQ~_r-E9YazJ)&+qms<7p=L zA~Lzn<(9A-cy;2QOIVcBOkz}6!kSB2dIdJ>ji^@qIwy8&?>4x{>=q<~GA<|&w#-K9-nh;_%an9jRhlg21T{Jr+Mg@igz&#A&76oH80>CS={nlAU;d=2% zNA>2kM!o{B(aXvrF9kp zG;d;ai`dza>wqUlW*|wvMiT}vdrOC3G-X*030&H+8gijOg>4G|g;cZIDSHc4I!4i! z!jr8|q#NC&Kk;40U1%A@tpfkei7^u!Y$gyKALk@G^R3o|Bn za{R(*I4M`4<*XXWgjnDCUh+;aZlHq~F|N^;;g(e+E(24`=mm)k(h*>T7*DE&Bdi8a z=xTx^tc1tCZ?lO?DUOzoun=B%T#FoGEkwUHVd818=(M*H)+5ei=!^fuuH_^6Y*O9+ zBP3doYk{&biONRK3~^I!krRUI742LGvC#O{Qa0J+SfJPhS8kn3yuQp-V=L63K9g39 z4w0wERj_KS16s0Og2lWw0>%6{MSu$o42d+LEn-K;x3^Cc6I?%`-y}|-t4>ha6e~^u zgkB%u#(mUc)2v)f@0_3-g#Fq*Hp((YzHE~NL(mG)na;HN?w1Y%R_mtnT)Lk$*=ghk z1}1pL%`rv81Id}fIDJsdxmQx{Cft+m{+4Bxk$dH~5eeGI~}y!s5*Rsl6T?wC_r&T^dX^b)3jsK zI-=!~c=uuTQtTXkBn*#ITZux=Pb@D;tqKY^N>S=>xa;JBu;aJYAM;t;VVe}lBb%pM z&4vR2Xg2*jqZwXfC?LI=Njwo+Hh*6>PiHy3sJ_@jU#(WZORm#=d%`T7eM(G_DRQF& ztO3bPMf34j;(`imKg8 z=~ji+fkJ7xi$_@U>c@F?ZeU#g;%^4xc~YnNt-wYXf^$g52nHOGXnO#P%=7R~V`U}x zn0(sFnQAl);^d292VGKsDT8>Z@j7|lW#t^%Wc0uR9yQx_hLoe{FWLIb4mb5afBjW0 znrrQ|5K!dVfdQy_x>-JA0`i-Q)NgR=qWQ%71KjxQ9YGvfT62(^PjOK7ui?y-C> z5buvuKu=aXGOw-D2^s;4_&a9gfLWu+!FPUDeOzBRczP7Z@gH`G+ZOMR0V{=-jm)_mO<^Z|(WlntI`(^v&11=VG>wrzzRAhZ_s~ z>d)w?zj^0uvk`QM;dMH1$Goi~Pk#Fs_Pi-cE|`#H8Q&bw63ii(f_Ted<__26f)p9~ zkk@S#j3{!#@)&OO?xw_4Z1OMt9`?d2lY2WUvf#3+Z%wveriH=pSe_Z#5+cW#dt}fi~&Q4u!bE?dl;y1sC8#1(=ss7Gp=n;IEOOG`&8DJ1F7` zZKNc_-q}QBLg5`;9mhH3EAn~Ay3p8 z@N>eD=a|+%#_Q9drtB00pkWF&YsHW=6H;6nobn1rMd(3lptxF46G5!{b!b%+^F zIy~NT9PCrBcYI>Z9$|c9MvgGP^)VgA+=3mGIgYDSO|zsNCciLY4tqas-_c zBICcQPDlHRr(vwS;igU@2T`A_DIKTeWD-2y>v&eG-{Qcj0~4yhl5+Yv{ZaypOpYZs%@cV!~;s*XC<-E zSm~>a*(PH;2L#w^CkQS$K8{lH6dc&Q(LvYKHn(U)t8RER$8;1X;;5`?3`G1BEG28y z>xD-P(I6pQ{8DJz&qbA-W20_JpYgvUP=zkB7|%J@Sc)D#*EVv;cI+F&t+kSyIVpqV zIUckr^iga|?{PU1Q^vl{RTL_fB6t2?{Q-KwBLh|jY$5?0vW|0&&4@UY@0jYu*{4;9 zjvy^VI#M3HFNf89P0vMGc4jFcp;za?`x04gluCvwOgKMAPU}PJjstsJL3>R`)(Zkj z3u<5vl}w-R=41kdoM_#p#3vhi7oJ9ENq$tNN-Yl8riJ@EC>e1@GKpn2i@?HVW~E%? z|5BJz#!2YJ6m@maIv3j(X)A;N3lz>zT`{tyO+r4Ub)%kaO8rI$(^}4AP~m1bSfRe+ zz#-ZJaebJy%>-i}mS~Uz?QZBJn&j91KknWHJg&367yo7^-YxHTHWCsrg-}#t-uL^?GBZcAq%%(Yf1W%~tTX3)>-)XS?_It&-YkE5GdOjN zDTkJ7!TB4fy>!UCc&6l)ai_eub1aK1?<6cTCnX&i>8!yZZuS5ZvNO=8C4ACmqu2$8 zl6%J(-0V(Y?0c?5?(bjE{_C^k2?+Vyy{SvHQ56FBjG-3Sh6~a#mdMQc-&%7*DPe=c&#G}4O6iD7ldxO z*OF(+Q_nRpL~y%ENMr}AXcb0ZEr~5>Q)Q$0rd6|D*rcToPD*#{L9aUr|CaydI1;>Za!4X;+irdd#TVZ;8G0Vp27 zED3c`e-doCaRPGWN8H%DqmX3#07-p)P`MEujEN|lpW*VCCGRCa5|V-mb^tJ}A?>gd zfA-kIsOSGP0QBRjCz&q(F3O4$QjeWve%1syv}X`*oqlC&PbF|Lew(7Zv4WLkC&E9% z(NLjXPhb}BrJ9J#38FkT={}%;0LAIW{muQFz}-cBEYPRK8cyWIf8XS!uW&yh_$|qf z0Q9MW8Sbk&b3#`+)UPjvdur0G4tH<%j!htvU$*G_s#is3>qIt}uY~w#lFJDEIy*cZ zo>_C&5WX02gEKWN^ahGQQ@w!`5wz(j;&kE0(&j9nhGAKT-kdIea3o*OS0u=|4Y@FT zGzfkWpj>_=kIcHQ--=5j0{%1X4OK_mUepspyws5x&PX|(C#vVq05M2UsD>oj3jXMV zlt(MFgS>J#I@CUjego|9h32HpS{;OEdfKh1N-7Y0jo7sy>XBPBjY`ie6=1d1L z9`@XKPc?D#u{+_Onll}&n^2g&Gt5=FQ+p{%aZI1$FqAV_uq^o=U~P|QCz`WN7=6hb zuI9Y{{OF;Of+=*6fV%v118Y@#2qutd<0B|=rA5kg<&$fCux8zpYZ*51NU_v~T0PBJ z6aYWvV%P#oZr~tA4;lL*%{IBVL5gEAc*J)ehINzcL7)eC=9|`fwNO5kA8E=l5|JiF zgzEBTl3O59&P27`6r#l1GsvTa+sA#7Gr56-E}ORUY#UXCnlf%Vs<_aq2}{CI%86!; z8~R&4hML@V0%FOQ%kaL0E*@(Fcb_PRq-t`b$ELofs5KXp9yB&JS1h1nOfx8k&~G>* zb|-Gcsa&=#sfGC_9fbAxU*f$qLNSw@#c#%=m`Qem1E%omx}1R&~DHWhK0L&f0waBbh_B*z$=xW($&Nwc!nMF*GH`)E5-L=2s@H!>(-W zZV=JPwaJ3{T6A6to{72Lt?BQ)6EAj(XCgGOg4(q6i_810`R~!$E$~vXBz6h{Q>yLG zZ$@7<-;B;^wy?6;owIXkCQ;_*y>p1;V)zqM4Jq`mxIEyl3|C{IY67g|hv7ahlPhkO z%O=`~&FMmHSkt-yAIDPlG`9y}Wawe*70ufU^kB8G=J(Mwl2WY|D|Jru7g^qG?;*9}~i}u;88V5-PUZRD+1P zg*Lty$$pYtQGbYIYroGHWOvfshuz$p1*!#|&6VGAao00wajxNT0)q9l#&{F84E+J^ zYkON6wNG*$U8%A0@%lxpeu4P@zh`_;y=A6VViS<=57EAli)2l(7uaZZ;dKc%FF-5o zY@`UosT0nsORy8c&vxdI>GgD~1SQx!ctEAN7xi@!9iUfFCEf+tJ;DUXYurXk!wC@6 zy+W+$pw|oI=?S(^7y<1E+#tcW;e2!lVIOL4mUusIQ#z83Zf+N$xri~>+_^Nj3+jqh z-fkYL>z?4o!^@!^G-bCfq#uI5k{x>PP`1?GoYq084V`-lP5_L1jJJJwdg)$s4ji^% zTrNEKJvIr>08#<@Yh#i8sRWxRaUv!%>~v1BbrNUP-IQSC4K(B-=c4Z=;Uq z1e?dk)_R2!Y#sJ583XT+ZxVBW!z@<}g@WNuyhDiuH$TE87)0j=+&I~$vqQ}pHFT3~ zvsMJ>bOgn^;D&YaP5Gt(;#h5#FP z%<}@g`AiQ1yry9WZ-2Hh>h4#c-$|PK5LtY@4^y#)&r$3W`4k ze#BVYJO$R&dl&%N@C+x>Hq_)o*yh3Nc!`+vKcG2}!m5D=o?z41Pw|*FrEwgode58l z6DGhCo-h#IxZZ0ll$nue^Ev@>ItB}rXb<3NEXLZT)=NimBWSVe(&?dFN=z8eE^n`L z*E2nFhsrHP0C*)_K~sAX)r=Ps^PVTK)Ea6}u0TF|Iz2D=s@{g3|1kvxwS^`v>h&Q| zKj=ckap%pO?xXl@$eW@urt|LLgR}|axocv*pawy`wkzQ)2=*MuO?*jdy}u@b^>wUx^$-@*o!>pbcAWJ!(IQtiBF(!|^*tAl>a?Nlm+ZHp7`#K#7JFsv?2%%A zSgz-NgrlRafX->UNhfw$<1xW3YQga3>Ay0VNpQJdzWbkBwkXXs(J5S?aag%Yx5gIN6T9%j-pupT=`Sx05NEeZq_@8D{ZT5=OxYcZ}oy=d#WSTV(*IQhb zhK3t6=Q)glMOfJi1fhfB$Plq%!q}ZJl^Eb2CEM&ozO|eyci8L~J2nJiuEQ)o?^H3l=Knpz%X%@B;|-q>l>YtPO&#St26=~Mt@*=~NzcHq zLMzDS7z1ND&?i;t!u3P!6FVGvNqv)8FkUsw1>@6JeTvoknR$~o-R%j7Bk!ERRSJ%R zPlr*tJ(B(!T@2e+MtNI*$7BHdTC1{Gy(khK{GZ%t2L5x5=5<3QFMGH*JLHW~0M-bD z*yIBz4q~dx+Mf?dyW4vp)yCMvmN5{&BpsLAPz~1?Bfl!bsJ+~k8_x!znq<8a3K@D7 zJ0Qz%;$(^?t^-;im11^utT=>dJYTj>tug!Q5Jazme`F06 zMb)&{Z-bwdB_mj7SyJ8;mt5|=Y`>(ZZNip}Aw!38Bf_&6#gb9ASNstJ6;$rsjd}#Q z7NPC&d!x+Rw}zY;j%supY?G5)Q!fSkZ-*6%iD4B*L+eA%H&RN5z2VN|z^w8)TejyS zM;U(W!}y(MOzRMoo@j0E$O$Gy0S?pfMq>H&Krn=$ckQ;k+5MIugIF0v9-$S8ZWzJs z#Jb9xgTG=-bkay{f`d(6uPSL=AE4w{E|^ zaV>5)gf_B?hSjjdZQmFn?( zij^BIN@(vtk1ufUrjTWYXb|YGU0B{m%7cCJfWCM@1Sy663K5FP$jGbt4F6;1 z{$SzfKm0Se;2$%e2o`)_p;E-XO%`V${k1Ls*SKlSXdVrg zy;C^Mu(+y(+Rp@ENrc`%6J|6EpT-&7fX{^K-j4jg*4jT7ruzlW;0!MNW9I$CDo-Jq z!t4F`y-vG}ML)7uh@QdWe!+au4j1Bop2MAo%;(vJ7@Cg+`hxj*FyfvkO209NKp65vaEEp+G zB=vaAbzSE%+(g9T2Yq${?l%A7pFtY_p!xD}{s@g5oHvfR&9}1a_^?HMS}S->jP0;J zT`Y|rPz2_vH*_Fd9zUSw^L|zvE|vfgHMSufj3kX7;0U(2jeBss4%0m{TFQ>^MPaP? z;v$hjweov7Kkk8cRh{6h2&(dxKGeN^;`Z2s8EM4=Oz2fSx(AY+TKuVq48cw0Uh_FS z5zY*bvuA$>c5{Zk30$NGXsw~?-f%K^oBzYf0CI2YWKNsT=0TDb?7|kEdfXjjF;o9? zR)R=3Z@ctTLNt0f?3HY@Sy<|+kHbA3bf9k?*aeWLeHgcEc_l~uevzQfLAS)PeCVeh zENeS}tp{!Lcg){f_MxfBva$bv;2`fcPYoj%dRTBeVI=uNwsf5L zqRjvp(;s`<c0g+#)lvy*>@H9TFfYI_dgOr7 z0(Pzx-7m;vn)&ntYm0Mey8i1M-Rzo|j={@6Y+eZnQbQG_pu_HL0hbfSyRq$gK<~c) zVd@vmO$7dZZy%%4XV^#UO5kStXGGB)`to`N`rmSF%W=A+ASML+zlqp?Gdn;`1Y#*( zTeXGk`n4jNP~^q2C@UyZuX`G9e4%5gmCd$stod&92CTRs{3Is{Mj)u1FI3^&EEZf_CR`+^GvqAExaXnLi>DBxsRuw_P+d6l_u0T;* zs6(v&q*xc(mSa36At%|*Np;y7*TZ1|mjyEIGdZb*x}0HBOz%9Sle&q?stNQMJEzwq z)WKYcFQHY8ol`rD7VIwK){VTDYJs!NBI&cc!k|x&6$_(q;e6B7HPoLyI**2)G*=f` z^9LLgo-N;?D$m9@ReFnboBp`@qE%nFs``q^22~|H5Ly89Zgy}fPBC)YYi*0MK31#d z_69My+XH14QqE_mzH?Z=h(_5?e%F*)w_F*r)5rY?x!KIDxY;z8Y-H$xGJ=@869`{J zq#{ZN1;@+&9bd+C2Bo9{{WsPwZ5uX5NxP(rm*JLMM&u%5M%Xk`7VM|EUWegL`Y9Bj z`^;-K2HxirpwXFhKt47qNi{KMLejNa5cND*%Cqrf`_c_ zA(ffhE^=2J)zio<0R$S`6An^}m`wI(Rn%SMwP6AA1CwyZV8B~I9rCjCjJp*0beyI>(>XCXZ%MCU!Q~)V1e^K041y!7Y9fTyWHEtLcp*X;uJ5-gIxJtt1;8? ztyc15?s2QM3D#URw}gAp#ziGw_OG+B_|_uA6_KPmTNj7TqY~QLUKs8Mt7RYsc22{Y zPK!g#@qgNFK?@0wv#+yj$G-0F zu6}_5B;>YVjnCOm6qb|X#D|djB-Rs~^OWgk68E0$p1BUJzA;c)uT8{~(zJ=RxXZTK zqgQCoW$7A@@H*sLl}3?N&MVvJxEBo@!~pZcBt245z4tN)W0Mq{yBg$$lMk6+`@lv@x(Cbu&CqWGuq<1Wz*o0qOO{gs#Pb6J=BZv!5 zW(5z7u<9u|u~!1o_msO!o;Q5Fub>iA?@^vT(6m*p9G6rUmT{A9=0iAIPIuX#9jkhT za(RWhllnMxu|}cQRpN|7`}2WtPD|L7uz|M?j5ubB4ZUUy6Zf}h<~Z~(4XK|x-;e6c%hO#=35*KZW7!qV!|xA!5fjD zMhBY<(x1y}+8F#}Hu0@hIf`vb>@AQZE)qWs2U#*|W*5tDNV&KLPaI9*+R#Ku5oArJ zIFYu%4%pU+)CpYhByY@@0puVlW%&AP77jDHQX5+=Zo0YTJ+}fyhWUitXWtZ?e4e=( zg|EiOibp99dyB=xJ3OS{XaNLzrWfA9ZrF|a@d>SamC&GXWo(rSIl>qcfTj`lvx?MK zjb@8DVy(EmWS68*TDbi4=6bJCu9l?6k@P@CK0ii2I-A^%Xa>lq-YE*_2M{M(iTbW=>2J z*ZTaZp#yn^3tqFXF#Z=-zGvl=H89}hNppLHViGt~HLcEewB}?XFeE~&=fGC6+~}mi z?rCCsu@ovp2x_kxN(|2FOqCkRa?(tq!0%y=nXGB)G$-Yp6oK1=hCfpsgK@^?U^ejS z#kmsft94$C?QO$A6SkCWfDD$5UMx4Lz;j}qfpy;llssvAa;Tmm*Rsrc4Q`eQ7NP#| zc6H{oK!E$TboOOpHChAE8NY}!}Jg0MQETTx9G#J-F4%J8I(^Sp4aLjg=inmd; z%zaq(Z4G#+$1m)1u2ZaOs|QPetOBhdZ_9Wtu)Qu%HLXr>Bn#h#D`sP6_4z390G@&Y zf*?U@S+h4^uFK0zVEw)|jI3>B)PuhREg6(RA^;inCvj&sC$&%fY8Uk)y-!YYMO!)%|MNS?%Hnm-Wovm(jedJ94D4Py!H$G&GZ^f9d1O$K^gzXuh-RbtfI74bTy z4ZFY*gO@N+ET1q?n|84H#UMax4I!O(Q#H4g`sPJ^lD!*MGZ%W^w|7qe#O%S6*lFy8 zA4&Ae(6r)Q*=}0ulBI7?yyOVr!QP?Oe7UdC>5YRvwK0v%fNYp++rdWugcK3zmJ4YJ zh1~MxT^O}HEj*hV)552T6rKDOtCeam>hWw!A2O2&(`&{|P^KD?S`L-O3i;dAXlTl8 zPz+~S?&xH?Kg#Dzzb+Lu;$vC;hw79G-WQ}HwU5Ns-Gosj)0ZQmgzpE zsDc2r7D(d#{9RNl+*urh(8V1HfSw`FUASZ28F3;!=H$8)`0S~G|CnmGTB^EXC2pu! zs^y*rfT=eATnrcCM9%UEOdJa~uw$DXa~cSSR~mq$I*%(OW{Y9210kXy21=>1Jg{rc z#aOsu1_qM8*IL&c7~Z>0)kbc=^a_M-gX44*hdnyu>EC;MV-v+qKjw&pLSd97>=_Gc#M%Z9L^|9| zlU$0@f;euLVqhE?U@L}0>JQv!U-iWbzFlJ}1dmpR=o|QqcaF4wI%mG8vDgj9t9}!I zFQs5DO3rP`hc8d&H-QfwQ{+H_-55O03;@bH4^ z;n}6WJ;Eb)-B@%Lg|K=#S->@l_^f;*mAVz!hEt4!;R;LYf4y z9Us5f?NGf|UY}BiIEpbZS2>^#TpERaTKrn&nrkAkKctBR1HjkEqQkMJ!y9@yH8-rm zN6^Qg;iWJ2*UBWfb^tzsDr=rT)~YGH58zWmy_?(1D_JZ6w-<|-KU*kZw=Z^^U1v~B z3Zz`d(9xD}LwRGZG%$70+=8(BBOPe!S`Pu`(AT>P(6q6m*Lq__A7&4M3db$KNXk!4 zY$;Rbf?i>KcTU}JD}(uj=kieKK$m+)S^ZN523bTg71M7l0KZ5|6)j1 z$DV?#VM*a=X<2w&cv3FE{Kb)HF7itRP26dT99x`|rHbUa*8{6r&q?HUIU!fOuo2%u zKIauRugI4>c-e`539EbVO+dx%2gCi>TZlxWi;$=>Wy?{?}Lkd)CT*_0Ag#ki?q(ye(Jc zDvF?dhKHby|Dxr=e&2j(1i6V`Nu%eaSc45u=&{wyRKnO$#nbcl`)9CGj&ma`vca?9 zY740yrK4a0?^AzbZk4FUo`UGO+}(a8>z2x%BFpkr7>Cpqm>Gw6)_F8-bMgUm3pGAz zHK`6F(IpRG4{3q|ID8GI;#(vP}%SKkNDZD`}h#kgb^HE%t<(khA;I= zs`sFWXllWoW})OrX1LD@ClAq~ej}9y5^_>)zFM-&^;C8gy;4p*6d*nq03Sf-q!@Y5QTavDMC;DHaVr znYxA>Cwbh1MFP;=zJ<4Wjc^Gx6?Rvi-UUf6`V2Q99Ykz6$F!4yV*N-e9Uj)GN0#8~ z!i7nQSB#|qJKy@Kd4$N8LSf>Uare13<48Qs=aQK}!e0j_P?!%fPPf$tmMmbat_z2k zL_M4qC!YEAsy{e5wLdofLQ8pSZ|%H}iqoH8!??&i+%V|hxt3iZaAIvknFC?~E4M20 zC#fML^SCZ@)j5z)cX?}80p_jM+%3d0|22pR_8*(;aW-_v#PSO}yX{zKI~jCv>_=KO zcO6iVmGM6|?>>rpl5#&#LqeFn*$~T(sAhC35m)mWa{aG0`k208FRtR}FeHDRT05RS ztlp`}?!Xe9_kbJ0mX?9od|202*!Z&orGZ{KiwB^7oZH(*3R}wF*vJ-y0LqnAGe&LH zH^7xKKLKwO6{<@;Q7$_ep13lBf!Musz`)GdsA^oH#GjtfW;*FQ$0k64fRIVDTSVUu z5{PG903Ax$`7~8910>uE=()=;W}pS226Bpw#8m=~$_jAFFqArZgV_PFh?f?D)8K!I z`5Y!B66LkE7yaS9lG0lX?joX7o2ycHHFg@;{J2+9b8B_#LX4>IXu&;eyWAa7 zC6?0~TZqIgumY-^(|Mi4%d?zYH<9gahrQ$OUex2V=377_uyApP;^};Umo{e2Sw<7+hXdd zsmXD0RJ}m$#%kzi-t#+^HGd6UjlNW;Wx6o11x^j&U*Q(F$AwPRzSlNl%c4ls7c0eT zQg$5YLHVR`KVTeL^IL#5^CQPeq`69uK#*`NEqp@K6vq|T#I0rkdqz~iEjX9-;_Kre z91O#H7g)Lz8*a>?_liVr5!YPc2q#3+U1!y({&KspyYRiKLai#VKJrqUhd=i~J28o4 zudj(NPuLiqyx-(tiR|{IL=#9F+Mh_)wkPhW6_ZiJH4KagLy+u{cXkXfhPkv~}uLqh)Yp=7Fg)N>vm>>5XLnfyWK;J$vX@zMYe?zQy z8SxM(KwV%glYhK}^>AEWK>vWHpE{3DcA@nJEzDl*CNI<`dkU@YEPDw{xxrAQTZd3^ z6mO|_bMC^IGVTRBIUh7PHF9z;p!oTEC`_ER&y(}Ii@mQ>R9827=B@!Dn{VCzU@hyZTj4MnT(&+a^3Uf$-8VGe#05 z(6r{E3Q_^KMNViU&CJuBHWCU1Y}M*;5r%ysgAn>Xlow z`Aq67qfwMs_SFK=B($0mjFCn_t8F@b1=iIt9$5ngEoemrt)YK6OFr$+mJV-AdbNQ- z?nYUA7T0Y?)7fK9X&MC&0h#BAacscu5z7qTlslxCgob1zw>aJ{*GR4hPzMn?8%ni= zhpGdKXHA)l-Px^4FF(fIj$n+Yj2TqZQ)tfd$FTPRuJiBiNRoeH*gK9}ahot}7($Y z%@Ek*6nN+tjaZf)CK6hor9__T`^^*4NlAEBO*~M1(Byyi`JK9zWo`yTq5QIGh|j8) z5H=E{ch{RsyUcL`f*^rt)oMtev-?l8j=3+!tRWr}Y|b=~znbYn^D@8|#Zr%GA^3;r zAg4cp<1`uZSrCTbZ^oyXvLMFidMaJKX(E~M4e9!=-yDf{JW86VJ#^ye{zH%dqvSAt4t zu8P>y8Lw}f<P9TA&YGa6v9F$Mx$(0{U&pYTwrH&y#=!RR;&62g_iZDnN3IfpYsCiB{XH*t z3Qu3MZRW^kZs(rz`iMgw;!`ns6uCOe6F9%d2J?k|g$byn2qN-^RV@u!%DuR(11Hcu zIsL89Qz`_`-uX8JH<9BrJBq^+k-C6Eq3oxKrv#e1CeLE#g6=I~K(A_$6xyFHjOzUY z2>=5hHYnZ{O=(TI{l}DZgGS0W1~K zYEw=lS#hvSEt_<&&z3}YA{M6EdPPz&%~u=2G)XouXbO|Y75r8fMD8Gk<>k-4hq7f{ zv=D#opOc=^+<@tyB0nkKIY8mRK;OVe84+2Z07c)x{8|qyLX#h@<-U@bI7jX~Zhnvp z=v?4Jrkn^|}Z2N_J z4ug&m-L%$V1LU4MnJUFigE`NhE_qhSy^Kcx!d_AU*~?%f?NS;RPw?#799f(6^=ze3 zea?I&xMyKuQ#ga(;Ln-=$d@J1&1S2`hB=dcG)p*YWR17Cjh9DzhBbBJu{&d!ja{tP$fvSBCxgj=wOloU$*=pHa*gR7!f_cKkZ|(*+busL&C$J{w zFsv-WHEea20h?FdC;9^a3IQMS)w_WJ40}V>(S~6uxO)f&oEAZtelFoI-++N3Bbv}0 z;u~%>FvG*vEE}79BY?bOD@L4Vi%;HhM_8}8(foB3a2?PKN#Ze9%ZvWg)+L(!MmXol zO=o7tY7u!bfFS1x?a(TRC#nO{OVr}#(v}~Yg=P-Hdw|?0T%j?JDh*Nrz%_NckpOT> z@>7a^aw#N69YBlLY^xpiEw&!$WvIsqX+4j=#Pta-=w-*ZUvf)F+p$ZvL?~AN+fVDK`P)^c)j6==~AR~vw!9Kmn*(hbTI`z4+$y?6H+t5{IH%X(E6men~ z*p?wvoIuD{zH&5QmVHq)xobQxskCtt*zJ0JE=#ma+kx%$gml`Y(NA2;Gt=qcMwS;m zNY*;Kym7U@vAlC&KaHV9yCjxT`5W!mu9jVo6XMbJ^gos@%v#z+Sr)ILGimSbv4%*U_k6!vzHZ1bd8(1 zqV&bpuOee8XF@S`!)9JZa}x?(z@4jw4MSmLTJM6cZC;J{_`S3A6$;sfR)Lf-k(ZM% zGxVN9)r4Y>R8CX_C8M-Of8P)*1_H($M*mN3G#?=IlN1YrRZ<3!w7aj8$5n87Jn$nS z>pggllIwikFLYM?XV%J;m{;T^gkxU)cM!{(+qxwusdYg>E8a!{z;~M+_9CWTxKnB& z*C^f^??$s(SqpTd{b`IFZQiY?!s^(cn$OqR;!G?fPiRY@PRPVeMkkh9o9bXK<6>#E z|KN0O(CxlmKjUd~b|-kxznMc&FZ(7)rdpDXR*Fb7n?E#D^r2&N;UmLxw?HoYdyHQ=*-$DNDh$-NXKZ|`WYe*o0}5qu`{lN ze()uGX$Se6n9DjQ|6n52dPe%ns$Wu!4aHk0KV+_N(5}$gLYn=s>5DW=XZeB~eMD|q z4Ay{+Mm+HInE#*Gwpq)L=F#RS%x{grY}N!n7vsQMOtB@eoiKV)TbdW;jqF8susjm7$Y$=5{EIGu5 zq%Uq6u>~u7^93)qwt+U-sw1nb%^<}N9&{5z%P?fl?1UCF@LQ4WQ`p8Fx`i_4PM=R6 z-%`tpZ%?e3diG!c#PRF;ar`Rw-Y<3L>kL+jm?3w-O7A#3+Wu@y{yDMK(^d|N1VY@Z z9)H)EjXARv*acvOwymI_pP3dUD*?NMLJK;)6xzlCv$8mWdUQA3P%I&i7EjvDs_xB0 zh<?BDV8Aa zQBJd3@0D}7z>w&~wN|*0Y8!ezD|1!m<(Yk%8;p2#g~Rd9>3=XQ<#6?9hx5nS z39>O)9m$tbBRY%t`Z6>Iy!AqJ0TSqGUV35ZRm);P>5_4;Dk91fzEL$Z_}K~5VrO^7 zHr~!AuVFnv0{{krp7^ zEbHD}Dpq+*x=emW0erW36d64-$h*ykf_Iehw%KETLd|``<)_#c99bf`yXb#IeyLRmB?(XX6&?cWUtNrETH3LEkZ#Utz6Ham<_ycZYPp6rGg4{W8B@U zRI{Xe^PcP;Z7TIldY8ZSmtS@1aVb?eS=x8 zR`rp5slw7Km+596%p-0zTgZ9E5h0!vW*OI&)eX2KtIcXTF&(6lQV|u2u@-G+4dUXx z(w?q^1B3lN9fQD@Fqs36x9Wy$28~QZ@i%{gPQU!~z8PXTMp; zrQV%AKIEZbO%7L~OF!$)`RE5V@Zq<{q37;m8?Bzs4}aIJ!Wtobwp&;Da?UpOz0_0g zxt&e$yrp~daCLkFLASV8gX{S3W(E2{#Vw?Faxhbun&o(a7XS(1h3Om2*-~`M*&@O# zfVOjqaOjp!c;4Y2#D-xwFT+-r<#Gt27#tlL&tIgllGcM4Iu`mP2fN&Z>lqFfun(;6 z^UNCI5=dDXJj~!ZY5Qt(wqsSOjJemRYmV{MTg@6Ijvw*Dp_^QZD^uUWzC-&GULk`7 z&szbX$H4LNArK8lJ$lKE0@d#EM_2+b#rax>pAwqT^u8(FMHY*%e zisZap#p{JQdstCIr}bvcc?0SXWJ}ySl#GxlEFh71`4`Mu0NEaHn%`SQ(XFkLPpP&mQpyao{J+IxyZHUZ+QEa-26>+uq-j{mcuG8Bj>Ypo`H|yleAKBXqmW7vWVRR3g7%nLJK<~5n|Od(Uslru*&uglz-d3)wPncvO) zp4pHq7EmfJ?4Klyn0%*ML;8lp2k;(Pi?aVyW-V_wuARn5g%y!A?PR`=&r6q>rC7>6 z%2_90z(v5{wO>DIR+J@T1{rL!3g0kGcq_$m4g_1h;wbo}FYHf^m<_Z^9K~8J2tpsF zOxNid3hgLmL)z>H-LB70OaM{~XA6?k;PlBBs=5^_^N-(Js8F>RiiP9jVB|tvN6cD9 zs`r*~GFVnYRFh1)CEc6ODpkRur=wEULe}%7S&zKkDhndv@GH0>lZBY&bVw?C{SC#` zlR`$$GpM8~EN@xrMzfrZcF>7|SD1|>9&)?I5a}s&bYK+^!mo?<*kx9e{de^3-re5Y zwR4dDflZwag+W1@Vkt<672T}GtduR1n`DGSe`r>cpwUj{ipym~PVyZ*3%_%|a$)SO zm}4waj2=2F$Ar~S4wMM5;LNv|Wes)yo0v~nU!(z@U1-i3VDN%Wq9GJvCKTkYh>qQM+7!i&5@0DOjrTWCBAsPd*>*)+>E~_ye&%3?~iHw_NxZG1K%wnWYsSF17iuw!?AYz)p-uo?&+F4xoi4f8|O4SsXh zgs9sfm?h>9ASS+_UXt0I8O}_I8YKIPrl_8S7%7LHz?*)fS&v81G_;>EBB83TipWiWI`cfU6#4~fDsT}_Z4fO@K$hC~(a=$|0_RJk zDP-%?P-Jg0YsXPv(^lIagrMhH#O)VQu`Bea%NSMJxgG4#$u{;kT@hvw;V2mKWlcg>hi|bfpwXyRst3;!xpiohush>n;uuK{joe)1{A8NS=c82oT z`!auITD)Vpa{@9I0Hh43V3y!CA!Ch%^>ecdR={8p>2(0wkIVFz$eKH*(XFZ`nZPrV zAHeBBpTZrUG3!{gAv=KwNICM&l3zD#`@42_^>^**=sMWd-{05I*I~k}Kn*sWy`Dl& znC)H&(?iP0@1jl_xp_nw?CT*ZTAkgquW*#07>UGIYeTJ|oF@>wH5;8GwLB|V*kxn<8RiiK$D~I-Y-Y{sFYujr!%JFU= z80hKVb8tt`;K3WQ0)dIL6cp(+N-VnE!b9aB37EdR3eLM!x*LpTlvEnvq&9$Aqr*j!<9JZj4uFge)z zSOOb=$(I(TmZjd3KAA~@ipF9^!L*Lk@-aCFJV*h9Fk6 ztzgD>Yd2MjZfisO0@wMZ*~tDNe_+f4zX>TkKL#XnI6u*uAI(Fg;bm0wreUmlmJK-( zbFmW#3Ka~n0T-Ip%0#?jO)eqz70f1lrbeos{NUWbRam2C2;s*(ezcl!1&$ED%cdSR`Y$#!aly9T63XscY= z6Xx95kaD5dqp4p`{YvVOQ=jlvnJX#TuE2!XgP#?s9h5y35ex)XmsvwAA+*{gs_)6j zcYEbB+-y2>s8PREhYNABFETBnB3YCVpW_%mXJ9kd7u(%+1SjD7s#isn|3o&&J6QO} z_szM23C;8~)-Lwv7`Tb!S#4H|n(6}tlUoh7NQ+Lnv#7O7!p1!2-C|bhRi<(>ML)vI zoipZ*2*L5*jXK^!QnP8&f*FLt6pROLZW8f7fQpMKVGDb=f(R{Dg4Pq|fVj5EjYyvL zut|W^!Is6IX3}pJ7Y_ljrVzpf_Q>0f)iYiWZ+1HmQn$JotNqSHQ2ruRtCScv+_r zo@L&X-j2DiF)b*X3=o3d3me5oELDR_CYc6b-y+7nUtWL;vsy+x1EOs1D;zEqkBXKt zeRmv;#J5j~GNvp?S)6%|DPS<)5yqjQb1#GgIRU12so5m3v2q)~2s}9f;NvxAAMMWm&182LSw=ew*r`Q$)?XU>tKNZE9>`0 z+FdOte7)DK1OR~6Z}Jp3f&Jft5{1PhFs;G6Wt5vtSVO*ybY-4~-g36Pv$)5ZN3zP? zvun(Hm{lRlbn3wMW@QfJEy+(pe=jhrkf?*R)ec081dm~LLVFYISw*{Dk8{*g%MUkf zmjKIN@J?@7xT!D3rU77$Sbte)RVY%kLi+S-$_6NX%Je>zS|mWXrOyy!ro?^w3ARfWS78F;FtAeSdcU& zr=p2V24Z}z4yl&nWe&-e)gjj~~I*F5kM~d``gAf)5c>C06fQpEYC`W9Ec`odcYNd#EA|S`RCdvAoWVGzD znt6+`E^4zKq%5k8=mT`UTH+%Iixyns!xxz4aAvT)=}Y9Lz2+Q(P4vBBR>HI_v672q z;IVoIylZP1)_1K}@@z|-+DPyv7Ao#bCDooi1B30b#QJs$uR9+gsZ$WukC$GO-jG?5 z*&vp#a0j77@Vc|$3gX&~nhOI<-O2GfwP0Nqx>(;HdJtg!W5Gma`=r@8u$gC^$8wK% zG!W3(h~+rzy+rPGJ=6C>jMJ~CcCc?}O@6?v!VUwfld}BK3rOUtr&A|WKTJPk&JG3_ z-c>I7cZ9Hoe{};{QO!DSS`7SA#R(Mdg!Kz0NSz?$_riYL$A|I=Z^ZW(&|dPWpLHFp zcmQ81D5FPgiD*N@gfStaS@hlNgi_V?cYQtc@+&XhCggu1^hsvv`qryOCe)(?jm}xM zvSGJ7U5B335wjLyQD6Y*MWfc(;^cr?hD{}*O25lf+kJQpgvzgdS3ft(}^Ztq{_{{P&pQ*}mx2&supV<2l*k$`=LNys+!OlD2ya(E{7 zgsaLMKIbyt<<(MNtqM--MT7?6g~Txe7=iJmGiSpK0q1NPNSbQbne?Lcvh=IXavW;n z08oI(L<~Pq56D*R&@#x<+RX&*z)GD}eCmUOqe(GLn9*_wziZAG)h~318aq@a z`9TuEIM6_k$nmMKnsY2TIv~*s0Y#DhzRj#2E>>_6NeRA$VXQbNK79!kjRLJO$AaWV zsQK4hv+^*Pa#dO5&+|*IsY}W>KMDp8bAVNh*4`Z zipz_e^EKzRRIldr6EL|C;k3cK1X751@~^_k{4`^kZ609`*m==A%4E`H0U&8${cF@k z6tM7HfEJRjozy+HJYKyB+Qh_u6Out40@ub9;k9)7h+Irr0h z%zEH(W1`m_aY!xc;;TY*9I}tkf6#1rZ8Z-=9Pjy+_}DZexR+pvmf>W~eVKbQe_+-R zY=&s<*NS&yn98KSZ#E5VR=v5wZx^bL0@)C`UJZgxj4kZ@cfm~rw8uM+*+hOODkaiF znR7b*fy_J2Ql)3*Z|U!5mS(O}NJ$$Owg>0O4>MaMijFe26_|%IEzST8c2U6tQ^%T~ zu;;KBV!Od?)J46I-d$gWHw_NUjF z=gY~R3G5_8Lrl%Nn6y)Dl&>pc%7EW$fHezd$P@K*!i+F(C^;a)gns3c3BGf`!>MIFnQ<7XlKB3%o zlQ~EI*QE6brcM(3f2D=KFw#~^3i9TvPgm}0pf+iiYa=Mp&}D}GjLQ$ z)WQ*6aG?K>69@-;=FbRsS}PX8p5ji}<(Pa`q{R!(aJP~>-b7^UO2oNv(a2)UJ4B)S3zu(_u8t502nSX-S+}2LY)*i9mF{K zBf{)~RzI%`CtiMo@zE%k=f-Klq&rNxO|5N1LS5|-AVJt}`(U=|I-=phj!WI+}k zu@ByUa66D3pCf={$#@ptQF67(9&`3EV#%P&C|`32TUIx#Y}h^{$jf7iSOn(`u*aV# zq2D<>bP2evWl~A_(mzgG^+mJ1Qgrs8Fw$qBqAe%B=fwBaCk5|C-<6^T?AVP)IdrnV z27+j$FB-l&vR@?V;)5(4!h>cdd=<8mpN#%RqT14y2hs3GGMVXp*2m*43m2s@_4g1X zEYduV(Cg)K76%&yeo)L5!$7SpG$G@iLQ^E!mEWedWXIAKs1&4#d!-ZBBhv(tuDaZT2R zlwC0%C*K5w5=Mv|qf)+HEcg%u-(Sx_5ko>(kRCmtI$BVKGkJpF ziOiL~JZe@6Isi~Ft4Z6?O3WXc2h1nU7Va_y(&<{t!l;m!!{4KPNqyz9BuF9!4k)|o#r_o3Tmspmp?U730XyuSNW-%H<<{zUpou#b!3RepzA zU12a!v4Bwn-51I9arkusSrtZM?-eV--7HwalV+JruXj*)S3>smQFr*!x!~ha{PVti zgL{$YHQPu0>w1j|)Q~_zwjvvV)k2gCOS95-UHX;Ob%@vPD^!6#FcwCAgtv&U1C5SC zT0Tcu5M(n)triH(;sfS9tVtt1UcVSXSWdaq%fX>GCax9kA+Cs?1v>!cz(m;Sd<}|; z`R)d~o0Kmfo6w(R)>jMFE3NSyGW_VLyYzeWyQNKCW$DgCHBiXBL^ z{3xBpXB))GvZy=WbjY`=o{?WIGbW+xuMj}Ey4(g(@XW$8-kgI~nXhb?z4-+&`V8eZ)DQ;Z+PHO`ztv_9p=%MnD#%Fd zFMxgm1)hqwvp&%|)C3DOAj(A8L+VeV-o7cc)zD^yM!^a<(RiSLSQQa#-w7{IZ^u$G zMo!ciz=2>2SrOqs2}H;h5HwuJ_2A3-kr6rLODqm*o!kTMVF$P3PVT2`!#_d5s3tE0 z=0UR-CM(JplmYVT0Vj3t@&mUh|HX_tlo$U5Vi8tqh&}Hqk%2-TS7Q+-lm~=}RfSY- z!I1B!SOy+5PN~angFSza94>MVQL(VrT?j3f7zn68D=4nSIFb?G3lD(CWWw~|%qe{) z5QtnHRfQdPkodDDpdKAymDbC_i6r}QD`CZrXAeuTJ7qu2^q)_g)r375uZRFP^HHt7+lFa30~11HRLmBL}6P%Z>9%oec6X8`OsK*10{8Y4&S<)vgR$lidC;j~ds z_fuvAhKG|dia1xNCCVYZ)U5H{R^m|P02u9yw)ge-D7=Q*fd8yzwYORm9{%ou&BGFU z!h?ooQpYnE*y7ZCkbk0W!kXl$_!nI{$VRExjsWyJ<)Rl_WvK)H8GGoEzS7I_%sG3;r^BO@HJau0c)~DKwJNn&2wg}qx;uM}hkER| z7_Ep@&_z&Dt17fqx01|`$$w@*w`7u98{0>O)X}xEOr%aCL#>`=agjDAApn~7FfSPB zVSfP7(erGhs$)l*#$Lb|FkZ%8Um7E^1~9r z7}%iRyuK2Reeqf0#wWDC7pz2JVu&ksj>TWWK1eMn=G<< zb-r}LeE{PP+L>*hfwp1;bEr#GZ%(}>_1g&7c_{U0>T@Z`(2A6cILZsOBuE-T1p)|# zy1P&y9iD6iKswye4+zu4g1{m4>F%Awm@YJDv7A3TU2GmPpD>>?kD1S!Cn4b=-IP@e z_1us5oaV7fnP)ewQ3|!-K%5%X2t4md9-->afacs!{kB;Kfh3R!m*UF+aF92W%jbQj z0ip(9E_oyH`2iPFHjZ~egPZh-E6Pg?Rb1Oxbql`}Scnuc!(_p$);Qr+-iP0X$>Qk> z4I;og$;5C}sQ!v#ME5+!`8~cCxQ$vM*fG9y33!(UkCu^fy3npn>VnkOsXlu4N9hd) zCVczjm+j`SPSzm|TJSu)~BoZL+Lt0KaVoo6LuK9ugryqTFIU@IUT3%YXcr_GYr zRuMR$EH(9&^gGhuMo2jPUyu`(A|*S zQ%*>q^e?RF0<&SlYDFQpCte2!K3`A_vc|z;PXTrdvK#6db-dcUrRj|A&UWU=tfJ%BC-6!r}*Nh zW>NQMXM#AsyOm{dWk?{4vwU`ZxjYsQjq&e=b(has_KPu|`WTWYp~PCNe0N_b4+yxq zq;GXcfgphtGFzy6HAI*2<>db`%U!^=P<92bMq#HmhE!JlrvklzVxiI57>moyV%Q;w z{l@lhGgWiM95u(xadVsbW%DcMb>{WvSIr&f4d#vJ*UYb*H<>q^-!ONYx0t)kTg}_d zZ<^mSZ#Q?FcbMNc?=-(-{+oH1d3Wl^sh_3(Z|di%$@JRv%hRt&U!C5azA^o+^uK3X zGYH_Ui%TJ;AjB9Oq#N904KSXXE~Jz($uzuBCvf>hQX$l3+J>oUD_!ky9lX_R?TtHYWp=Eo=28%ZAVe)?9 zDPiQmC6-Qp3_&T(+6DYzX72x@BxHDu2e< z_n275A=CzCfYn%JcaZ!b;v@nsao10nOF+wl7fGlyO?mjtm}d(m z9db$3Q)tLpay-cRPzV^$dOG!k%u-mtqE2>-A*azQWV`RD79*Z{6`^pLZw3a2d~k|O zj&f=ffC#BnKj>};=WI40%p`l9@LgU5XgPDHfg_C$$3?{5)N%=bU{sDwu?#!~=73Xc z@WIc7qc;$;>D0SYkFtma(qhHc4qB^y4V#@OUI$~PePB?OhAT~27vTg)8E%4ga`M7I zZD;xBAYCUIes0^;HJO0}Oxn2!YEq zb^ATB)B|IeqQZ4er%MT6IiRg z0vZ@X*n*Jt3+Z;-R~TpMM7hjT(vZj)&ox0L948!!gd_2MgQ!#qDS#5dGzhl}aWoJL ze2?}d*)s^EQKPP%9>uN!)~!-2)#@@Z77>5D8X}~E@L`wRi|J$#i2q}_16nx$!lwsdy#9**6&{aEAA;KMchGRjhg{z0a@x2Q09t{J^pKMd~0h)L00GJq$r z)M+%MVPJj;Fv$+7Bz(l2{aPR6BWQ|%Q=eJvH_M^Z3%VkV`P>?>%Dx?Xn8Z!Gj`$O- zGSo=ug(7DsiJBP1!A0>GluL*K0|uE8MiW*m&$61TPXCB3&o`jWXknWYjR8?8VHZ9D zBu<1J!MJ|LrYH^zsnH^Ava_qBXHQ3HV9!HWGpj&YFUU5i8WwryQiCpw6P-omH5~U% zt~T*SxoCLdJ$&_C1|oHcw`O2f~Pmodf(Q_dZx=?VbRqD`nk0rXp( z`~Jb;HvLpBufVaHalv3^v11&Jj6^TZU-M(-IGxXkX3LCekd$WPJmpK4KtX>`W{iM7 zvbtD|QBecHIKn5?WUXZstBxc8qejOJYwk3gFu)wi8_PU(7$c}^uex(5Nvhz@44 z5TM000w!D>;`C=^);M1_CI|RnMBkO>MU+tAt;HG8G2HKj=tP;|vLg?}50&EIPndJm z#NqbIcJ$Z?2`n3wvkeSqudPyxW?vQ$Jm5oWOoIOs=5xpc9s@iWhLP?NHgyty1_o7- z=HZ9nV|3Iyg@^~DUP*lxabik9vKBlcZ+S7`GKn#B>vn@#O?L+Plqr^oM8xh7 zYDqy&h2UZxAzyGYwMhf#!17Ayl*~f-JdQNu;i%&XADf|`18|jLPzSHU6@~tTFi=Jd zaMAeAt^2H@Mn%_Ox(p1po8U)4Y61fj9ZM^BE4!hj-)zq1QPAe;0qQHk<~eFB!(q!- zs$X00g2K}5VNe5@gA6&7{y4(yKhn@VSEP%^JN$z_%pO4O%ZI9ChlPkphsY-fmq$H+ zF$4Qp`wfQMpbL@%`5>)MH5*~UwG3-96N^Q99yHIVjB;EyI|iLWeFVztgrlNMM1?K$ zaJ2=sBdo-!n;2s+f(Bz$e~Gl$?lV-UR-SK0P1(E$kx5UdUYL4Wss|BC?@Ikm`n~A~ z(vPGch5GPKsAC3(NIX$6--c?TMU39=LlK@LB2y&nNp3ZkkD zKA;ow(0^VR9}m zcWoK7;Wge-pmsGdzOmzj*lekMuRE)$dcONnA&4WPT4!u{sd>^dHfi z-%UV8m=b+f%Fnr|V7=n4#HkD$f1GB{C7fCpI^G8Oeh$c(7HL1jTmy+9d$tR?MbHZ6 z->oG7!z>0t@_$ftX`8f~PG58j`v|qz^ck z1R8-mk=qO_nq^x;IkT;%MPPscS(v=Tv_vjP!V>%xl?BB`?i31X9091#rWZOni$yOG zZ?!_k8pZ`MnNxowN^HbEgAoB`SUCi}8lVZo95`$Eq=cVqzOJy23(T@=AupB$-az~c z0V%4-m<(S)EZfGB{1`}Fvf02cH9e9qe+hYFEjCP;mAeIp-F}vFOpF|pU44V7^_Jc_)K)SL zjOAJcE9=378(z`^!cR~Ft_CvT&|sROY0Y<}s>!u_KuA$4kD2zS({=>M(`|+eY5)3gvPw?!$?bxGi<9qIBkJ z_?J3C-2$#C!(2_fjv61&i*>VNVYIOn3kW-d3SC|GySiVRdhSq6NmV7;e^ zQK2Uh@jhU`dEiG97%rN%No8(lCih6Yl7ri+48BE>$uz?ki3Cc^^E@4}^l!rV~sT0)}{c&f*6zjKB;j}BGY}BA z#x7z!L-jd9V+X^jF&w;tD5~LeO0THrHlSx5l7Ip8KHHTABxSCj(oD(7~v?z zGv=K$;7aiZBA^;AqVnX2v{V^w7qBgaq@x=3fIw?P)t`|qgkj+;F`U;BeSkeAX4xmy z-6hZO>H|B)fgLfcp`iqRSiXZG8S;BZlth#9@d3DjU}rr8eSyk}t%(R{hM%2uN}cal zRN4oB(5iPzkQsBad5O7#Kr6+ggU6=VXfTL`BXMmd8l4mg_KmUm^kv6twPi7?^h}cg zz`5|Q1n9g(W{YfgJiuF5iIh4C+a-HUetFnjWKALnzVOP&5K?oXDE7r7VYV}!7@PnjBcVo2LV3H-(Jsf@AMDVA%SvJ zyvck_%B`)Fg`_kQf>~+S9G7~pa+q-|GYF~xx_`ORi+)dlh1px2g=z&?N= zP0@b9-PR-KW;mLYPWnVnI#WHE8y3mp*5B5PDJ7x+dbp~DJeKJnrjg_H;zBnSeS zfGo#OKX6Oekqte=kR=HK9;Tv7<&2&`Un#{qlYJ6+%Eek?{@grjK5af@zF_{!{H^&r z^HuXN01R;U&}3fB1h75EpX%DW0)b2P)^}wb+fg{9-jZOv+(xOMC;m|$+f7E3Ecl?o z5{T(({bkZJ(z6~v{Xher)KRm+df+;V5tPJ|<-WmdfPfffF}|ukP#vn!Uk!$H>fQ9A z;h4$G2%?~myszX3yvW|yc*{C__A7;pawoSO$iDGpy}+VA(9jSK!NTvfiDe)b zXQ9z|sj(HMdNe2$B6Kg)x75?bqm7A@@~@EBjCmOPqtQA@`bELwe9-dP$h(KcR^FK z<(S>o5nb2UUmYPq%#20mM4w`L3&8whB%+=Ul3zLKSNp?8JzazyDTPiQG)q*3YU$6f zr0;=20FpfpSZs{x9m9fs(;#@URJvurHxgomEYMrgAY&48eB54Hf=Bm?+=2QML`M_S zf;^|ef(-&FwgKb`1CGnS2TpqlwFYIty#du17<5GS)#5xql9bRDP$N_`P)_34;p0&d zv1JV&62i}*uxW~ZqmBZJ2U?)xQFTNB@lWEw5Mmrt+ex_-YW0XzhC7Cycql5aE;+cx zCKka#wj-lw7zQc65h15C(GIyahcmxUq=`Tx>ZJuy_39iDd;SAtmOhjE5i;hMpkUB) z1Xj1CS0lK3LwX}v*g42CJs%0v7o;yrKQH})^o!CjPXAK6Exj#$dHTxq%aC#U%JhzO z7jjO!)7K&(yB8tZ1IRqxj|A(R5tnx${i^hivMiKbX2d^+4*QsgI>Tj&zDYOML=y=$}Gb#bc?@BC&#nRR^tD1-R>Y-PS7+ zc0=~JUh0kPZr^*bqrJCxM|;P0k-F+AXG*5l(>vJJKhqoiU7h<-6*{I3UWC%MzpMYI zxEGj@JmA(`|i_(*8{^b`o?l)c@qX1N-K&~JHXN5t;Mmy1BPUrYZVp~(v{B9&KxXSCfVsd3(4 zk)#p(3Tr@;aFI+*P=wL1x50DKH!|WFAQFbu@^Fk;=o+7}sKkVe_u=wr*o_!LgNKmS zi)WMfz?y=tTi;s{8-+13HVVC44#@8=({jMz6yn*yeHaKZfh;PFcDVxhc7hEHQPE=j-6mf$6!Esbd_k#Pxyp$!EJQbLP6?)VNY}{Ar-^PZ6YP;Mxe%WGnmt z384H7=XyN9Ix*~rG|+uazw%C0-4NZ9L?pa^Kdvp%zyg}}bn6qrm)e_YKq*wOYR~9-$6M9QAy1 zXAvr27Q+deLnMYNT5yi1^(12(Bey2XIQKT?)QGi0`0C0~1cu4o-a!&snGzSnI zeHI;bTso1u)n!fa(>m(3ZQ(YXM4{m!Aux$V&Nau18hsfm$=#*mEDL@Lp-0;`YuWRdf%7NFpBHGceku7oE_-X7Oh84<8z zE(cf^xPhX0z|07#9ov_5Pmf2^XwnEj6OLI_efUqe1^!0FK_@QIU3KdRsPE^hbxR_vQ(PztvN=eBQ%HKUGQ4PR% zpeQ^7W5-xaRr1V8Wd z+CX0iyaXB%dun;=Y1o1K zJ>Y;A%I5yA;-!+K3{PZN{+xj_w?N?TWf_jX5e2SMvqGGqoy8mIkz`mf*9@w@4TB?= z;z#ev)?`hK5SbFc$jO_Tp+(s#nOqn#oR&*+eun4G40j;T$;;0im%yy$y1AO1cAk5b zMna*LJzHhj5F7U#tPG-q1;p2=0z{2@xIzm_pcpJv*u}K2DCZFjvqtzafjg=G!U2NQ z5yVi?OH;$q58Pkt(6ZxXsylPJ&-d-S%P7c+tKo7bRP}PP1|W953Rmds9}x9qnX*J8 z)c(q_6fxn@Or7qa!<{kq=x`G&%V?52dB!6Ruv(J*Mzi=Js}hkhpJ)j5VDwCXC9x{#`ur+Z*%Co z)h6O-5p|0(0oZ{!DwbTtD~F;f^m4ZMV&OPwm~fQWQtM5SQZ<=RnWakYD%(+#VLx!I zTd8T-6asvUI2G%n-%Sr$h}iZ+jn5(|#ilx{ZmlpqVchP`Rk*T()bjdv z2uRf0$u^OON9TmZdhvWa%90g3DO^Z}nG;tieo1d%APBp4$;585nFs4J>KzbpB|2$K zaxocceuDtJ!svv91iGW>p5PF;ywg0LYDEO>H#3J>Jpw&J53OM_%SY@*4?I1rFNsu= z${{KfwCFi<+9Sf8>OZE^MpeNXSv1-i6{i)5sJ@9CXY%>xZ1HvWR=QPvqTh!06?Yry zjEKfWQC0kbqmRl|QX&R2= z?DA`78T4;wSkasjCK%XuG;0^721Gw*Sw^}42^Rv3@hmJ4MF)V+0yf|ZJz_Hm_Vf)} zM4#6VlYp#pE|IDec{@cMc1^a|8Lx-zRRzf>7_c1Ns0%MZ95kXFJ*Z@1B@{k{et45S+kXW_cf>yaO~l)0_SmG^YZ z2=@{MgVrxPD=qAeJ}6eJy|OS+rY$~qW$?|40N$s>eTwm2aB~Bo zMi_;td!)8oRPPb@Fql&AaG=*3Cd2sIR}iZ-A|TNQW0Y)opEj)<&ETSv zH|U{`DcL!0AY;K9trcZs_Hb(lcZin@$W(yZqjpri)e9DWHf=A+I(NAXuoFy1zFML- zJ4`ZAy)BxQVF}0d4{VrF*Y!%MqN(7_+RDvNC!~U5&d) zoU;j;{mc{et9-E)QB#1>YKqIHir_Q!;q#ZE`SC1I>hvd}poW0*Vcc5D$ zvcQj3MTtHf55(n#0S}l0s}TDJWs};`VP$2%Xf{X?d{7a}av>mm%fZN~MG3%#yg?MF zV?;EpHL2sq{(lCaJE5U#akzLzBA-F23WXMOW6|?6xj!B=wbc zVa8PZ_+GhA4$dCxTgnA&O)@fik)HXm;$d zF!b{=6mR@yuOvg^nt;4u1zn}DV*+5g#5~82w*&XGI3quWLj}osWkAvhPSy8bfNwh~ zBk@Q$AwUpC5~JokE+@CO$#$T@1|~m`!$YC8D4l^YfKM5eZgR1SWHl(sgKlNGk~+i% z{vIU~1dSY1T{PJX7NMh_Xe(vI9>d$HzqT6NnmdFE`r#eO_lJ=shgZxjJHy5K0urzI z5yE`2A;J4^wl_E`2CUR7L4i%92mYsCo>P_mUOyJ6Q*k3}>a zw=`GjA~2`xgA!#}GmEHF3(!lRY{0)&q0sH*2Su3-n}a;4ygB7VX0hb5aC06;YF&;%a?ZEWh%a7kjEiG#4W3v%0XHQOC&s=4mUMLpqZh)yN6^*nw6S8djn!dWdnBU)s5V<6Qb%Nz^1nkj;=0oHLK7A zTUjZFp~4_sLj;0j4MDXKKZ1Sju=hU&Nh*8{u4OeBfB!I42wReY(k{DxGw$Qn@HrvL zEV41d>VOl#bc6r_$8H}&9s=X%G>?{KTk^zUunFmS#5OTgN!C!dq>@!7+dv0XszEMXs-sk?WXmDB zK$C$fH|COt(6_OZU=un40)+5@6A~cMKp>D#CtwHxLdPKn(DC_MX0s2GbIwTcSo!r}Pe+3=?(64|DSaRgD5Febt@4NIVh|yC|0wilsOE=3=Wm zgNK7LW=(<-Jw`LzbPhpfI6&czaNT8xf^y|^|9j98#rK~(DxN{i{<0L@Brs?8w#n3A zm!?xDBSk1Bh(Urzxi%|3dGtm#A+uIIMZb3f0SGhLVBLY#`WJj$2|el(g}SEN-krYK zx|*TWa?<5NZF6(=J4h>qB=^~u zlNjFMKq8ma>SVpfwU+o`cd08Qo5_g^1^;5Do3OOud`p4cjbx#Pb+@O}IOECf3%TP@ za?i`?YJHXaT2IrxdY1mxchbT7=i9%KGqVe71qRCNX}wFI@A8)Nn;D6#9>DmL-k(#q z>R1ORv{Qz9gTF2`Xc&vBKU4V3giUFg@oD~Nm(G4Se+0wl!xmDHaQ9YaTn{4$)wT8Hb>pqw>2;0G!J*8?n-t7yz7v>eI-%j zFbJzk3Q-Qo5Q7$@{7`S97FgrB6i$iBe9f`S`NXix=&@i4X|(tzyL!I6^v7|B7{Txz z1k!^gW(m`h(J6*|)$LBSOBWSOrCyw!SmVi7U6dnk@FBYIe}R@5qTh}l8L8DYm&CKI zxT??guHT10Y0oyxHPsWn@h?9ludlPsffDc9Tvh9@<)~2cOw=6ZSKS^Z(VRkU|4sRp zI3?tYGr<}Ffu4QXU{p(PpQx4iONk7h;e8|p^CBw_!S{aDdu=nDJyHPD<9t0T*x-r5UboKtPDQsW!`y* z#a@JY&>ea-yQi;r$8SimtkyYcpY@SkomsKA{9<^*pt1JuBu*bnty%2Z6|=3!lpvb@ z*|d<wh!JT-bN>j$NfPr(h1C0SyVT~S6g+ftdP@^1L zTIWp#1bXC1ox{#vI*&j9*&>Y~s_qy3fLOXU1!1BNw%blvS;s%saU%XHTS(+!7vQ7T z3>B%zLi`GymdWYdsOIhJEHGJRQS0YhQZG3unzWH!*4g##&_3%FjW_RIOkDVBt z29AxLTfvcYsgE3;A4&jSE6g9sHDW0$zy<(tEiUXF;Z+^czDQ*)1_4QERA>ahy~jn2 zOx-(CeHlZymGdTG8a=LNLKQ?D!pV61A+X`5H?!4;uJ-r3kKR(thgwDpIb2Ormy}=D zwP<)PYSc{6g#F>I2=a{?apdRd36m`q_%I0Ef|6S;!$+!7X41PWS}R+tTB}=YTI*XI zT4%I2;hAkx6O>By^Z?PLjQ)N+fo>7v|9Yj>(WGKgxplBSlx3}d_7sk5!Hm8^NZzWA6A*kYeAoyBu<%6xh88?C2P;PU47!|m^T z4)r>0hAWwam>@~GAdptq$ULo!D?GK$UCNFh?=dxypIJQtqU+piB#?+2O+)YWRqQ7i9` zTO^`i&cY@}l*Zhz&oe3#@D(Uknp*RHX;p^o#ltWt1rd!iD`$mjsqmq?msDEgF{93v z0};E-AHZ^#&uXK>Sp87VwiPh#nx5+|yA>{F?4QR6`zJ4+8ln2U5(!y7;op+hLf_2N z7QriUvN+$7f)5@keD^eKSbU!1^m)!a*N6>y<_g{M5z&|2!H#I=n5c2Q(?-v14}Vj7 zB>aUG5g;Rq5&e+_uEU z5Mpo*z>%9Ko+eYQE1vvy>d#RHScAR0{X(0W@boQc(_5fG-w4V1PuqVFiTQuG|Bcpm zXVDDy%JM|{%j(3xqzr$|;m%lXnJ^ zbGRm=D#l?030c;8DTR(!UO?L(fU?Sd*?>WHOT;c`AFiZ7p+7pm`sk|sQ9YsUn*33t z5n}xjS*FpdNeoJXL6KQ0&^|ER>j8w`*<|hFcd)M=_+qY9QSn7HRFnRA9M7Iu0o%ZP z-3BklB2J{R0T9jM?zR(N218FzD^`q69&bR%I!CS&<7W63bjL#*$@9eH*hPe^Gdmh8 zKW3iQ-Awg$nhOkt2B?fMaG>cX3(_tuKaO?cjx`%Kr}gGmXf`KgiQMR9gRhu%t=pRk z^L(c~1`|)c-)qT>stEth?O$oXhUwDxtHUA2;rVdezJeA{nzmX}%ZP^}NmW^+(z-1Y zYERBZxQEVqI)`&dx9uHbM+Eunm7Z&@SWlg#}R|fizFNo9Gz^b&?PpKxn$&p&(QD;mOD>lHNn==0}SzgKFGGlH7)5-8kr{wa8 zaTDEOD7p1=p;5laJmo=o76&1N6SwT$ zqYZ;_l#Reu&%y{GXoA3HTvJ-b-&*CPL-B%NP8)qKm|1i!z&T3;yvX(9W~7{wm){U_ z6;C%@gbZ#1A?G?poGAUK)ONNX3P3bB{mZ!>TS3(TWB#WIr4skz6m!gY&jCl6l8Gg1 zW>Vf?z9Y}H4Az)!99Sah_9lk}^*1>}npGU6S^{uYJU7MxWEYcgOS)Vm$tqWcf+}VFwnKx1 zRmNlXm45@J@~h?Fl@zV<7v&~gX2?FF;?#U*H*&0s!tfp0^eE}S#fdBs!D}pNmn`nC zqX=-5-(8&5RG+i> z9Ruz|p!a}jl8!z9Iz?QaJ@lK#XATKXu|4;wV-a+$@X|WOHc~~ehMiq`A1Q4Tc;i)y zr+z(c6nR$!B%VRyJ|i~*1Z|q=81SPS?DMJOseJDV0;CN1DMVP(dO4lyK1`>&&Dc4y zM!M9X-Yo7}xlrgJoz)Ouy<$^*n?6B!9-1E}{k>QOndt_0Lb+0#{@`DaI2-?j_XB|o z)-q`sBi)iJh_C>GrkFK8TgQ@7XS)}81zbZvJ~hiw%UolF>Kk&qWC++&A2~zp=U<;X zBn?EXm%$nJme6v~avtXnRgr^MxsY$`fXFbv1H^QT=j<`>-F@p#5owmAwDMG_9h*-teYuj&-n?IHV z*?paEZk0e9>spb6$$T8QEMMVp(Rx&Y;OwBL;l?Cr)HD!)X>S2)fVi%hh^Bhpp664e zuQ1UL*aveq(jp@Z@6)xi^<8SgpF$P*B~*alP967L`>x{5Dm0vJbZnCLc@LGCxzt70 zT&e-*(+7;`1DK+_tqrJ}l!8}&{EkGn@WuhUenB90O$kok+as-ODJAU18`wvRH&)nD z9wcud$#kN2B?^k#S*kU4sD8%LqLhkDv`n;?PM|$HCjqiSQ-E~M*Bg#@;{jA$j&V-i zSDZO?;UaaOy2k^G9n-5wG?vigT4^vZ{OifM(U8FNI}OUzpYI}Gu~X^s%noYwiBMM_XQ{7 zLbM$)YEa2WeZjy28A25{pCu!2r#keVtg#Zw2q57vq4N}q-!l733>=tydJGnyf)d}v^k?$QL8##qTCuOo^^n1U;9jz|p8R(GP*rkw>XKs1bZ5A3a@a6Uh$tF` zVr-I4o^E5?qbjS=HLGK?YUPK1$_g^lm45ci+;jNHtc<1XWYI^K#y>bDna2T6L5yVW zuLGvh+Y$1KwrcJ`fF%0DD<~P68VQoksejdLvuhRcBVKzoAlH$u$cPLWn>c;BpWs8b zh<*>5GHMGrNuv;gA}gr7kTTWAj~|-r-5?6&`HMF@6}9qx9Q|JCMhE_4#g`RIoM}oM40%tX0uUc}<66fk;UKr$=y2Y_bCR)CWTE2OIrXp(C)s=SKLW4iy_@cObR+GtGT9zpb~!KZBdeU68223rf3Yq3 zJ6HNUmT*P*={#Aozie|8CoW>(-)+C4e3O#JX~G1WB#2NnYpg)}8ixp5Dzv`uPEo6^ zUTLtz zR?U&GK7fmx=!aV9_vU$4`#Sr_XO7V70ooZMzjAc(Ld@@FZ_^zK>Ah-`@XqKSQ1@s! zy}@5Q2y)fM2wraA%=tpnwK^B!M5VRl3I0ID;wn`SIvImN6u5OsSnccYwAJMtt23tK z+{IGvs)K7xAc?)+!UM=6cBVz1*RpS`sB>!az3alE8xIU$cI)L14=A7F`#N|HL*cEv zqjhJog2@I_LUz5rB=Q3u(om|qK_bsCE||>viTOiNz>klQrOh-}#v`G-&&R-GIMw@G zcGaVQ1-e%C=kR>ij*LMS$&>(o2O_ayx^vx}fDB$D+h;7#D)$^?s8>|0?@OGYkT@C* z!A4K)^zd}FjF(k@<7G0fL?-j4^lm-DTB7nDoyj0xAPq3?oJ$Iu`=(;;5$AkU4{v*^ zt&OCQHy7vCtFXAE#RwH4#lg}t{vWOi7}=flI*Pi&#AUDi%RbajE;|o=FNpa~04t!uaRDrSb4GyT>2Z@-IC_csad7g!RmLG#@$re8r z?}ZeEgoZCnPthwi&r^BNz_N5%b@am21Px!eW>O5Hq8nN5aW-Pi{j6*;F6kN9D-?)v zy@Z513{m8wgHSwzFS%4+rfxxy`DCrn!D;9Z=ry`XCinA5;we~K2vVO!8{>cfTWY&N zs?Kk~ zc4+33N*1)xZ#R-d?1;HZ@g7Tf@*`@UJ2;IRl$khrW3fD1VEQuqRf}mSO#eg{SiXVj z)LqjbU1+aahRxAY97tY3QUQWKDlSPLGz90W>Ha2vivaLe+9K_sMM`X`Lc&}34A62Y ze_|EZMV-;%Y_}g*ufe2wbEb<^z~9PZdvQzg5^=pz=Tk8x4%i!yA)9W=!=r+sm1hX3 zUEa(e6qG+|$)lns9%-Gru3m>T9&}Q^$NR-tE@`Dcrw3+8#6DzbNRY9gu=p?Z8cbC} z`^N8BNKIQpd#YEp?ry!2c?~4b(Sv5KX|ZKkJ2FOBT;2$P^oV4J+3_$!fqU|Oa8HOn zRYtwgi&~VFA%HAa9kk5x(o+RaTOw#KCO=^Ngk;oImdBQ(91eF zxD(v^ya~;EUqd$?05)NAgf4ePXKMm=ND6;*fQ;Zs(pvA!|u*1W8{B zN-m8ybY8@y1JEtj6WE3r9^rBNP)GCzKUj1+tsjglg3zf-W@zMy&SUSNbclLBXD^o& zJBk+;hs#%`h=g>e3Rru-$dmnsx*eJf-xYEI0|C)l6;Sv|Ks-AKH%IRRD{G6BtztG< zGohn)sNdq{T5{^tWLP4lry@l)VL0NyTQ;v{?jKT^TVUZqoSRO%TvBCbSoAD?Uc0T? z4^+GfOc_s$3d#-ifc>CuffDJA#ZWmOgyVE(x^h^W*+D9cX}qO9if+Hj?(%?`YqNS>0&`F zUEigKK&ktvP}75+ACytGHRYcir)9SuPDx0#v*vBfCrz!N=U-B26j*{HhC9j0!%rkf zeCFIVTQvnXkI-bV&@y#@qFZGcq>5Dpe`phaXyO159?^ho&yqy8qgR$J*@8x3+U^HZ z&G7cYy?ZHu+SyDoMI#nnX(^SBLD%aq_sT-daWuokauIyqEqFhYfSN~rVEiZr1xXfa zLYA)f%tlkhXo;wXh|Csmv_!m{mWXd_-P?LQ4H4h*V;ds=8To=e?cZ+yBmMi;Y+L?& zun*V_TC!+AWfX=gZ|&55hEkFtktTbzaD-S@O<~e3G!WrBp3Zldy8(NlN5t_oSgLnv zw?0iH*lL8EjPN!(_;X}yoWmYaCU8-ZkB*Z#Hk+uQGGf3E#a z62?o)|5$##{KxWJ<@cK`uh_jc{A8qjLv!xCw><$Np#aud7+ql?9j`s5xWL3%_ob15 zlCnf)+T%i>WQ?8n{=R%8sWFIwvmIB*o!(~^m`|f$IZmQf@j(hx(9FRte4V^7#BFjc zDl6KIaf|Z}tXKm!96ZQJ$$zDMf!cJ$T!Gk^AwJRN)aKt-t@W6lZ4A zG$J+eb*M;C=%XZx&LKP*Hp)fD(VD|e9b7-ysO4q7$UAS&%hSg;%j^fcpx$h?e@=?ss)(AiOI`ZzX@eBR9tuVM~4&^ zE-V7y&G~;`_fznwH94DO-Kb}zH+<@N~IxeE`cnv$KhqPXT%Js6whEe&$`r953#rZfe2L4L$bayud^yu z(a!0`QMs6ZBBsnS{ZMKKHaL+~04E++z-r|m>hZNG1q@$L`La&aM>M6T%2w$Ts?+rn zZz(R8Ki=O+4Dd7pstq`#IE@^apX*CzH1AU?vcYJEdDqQ%)v?}b$9iX@*O@-;&ofdS z%v4LWoVIaaDE_HaPf9m6z*)x**OCXbwpOT3kc;tb?2=ZI1MRG08n;6|$mKx?IfCBl6_dLmJ3W{r_< zpyrMJiBKlokL0ZjxAYQUY0!!{QB@FX z$v#nNEPOu^0563{5v_U<0REzheNQ0Fl`K78tmAr7ULKLU4g7k!7Wl>qVA3m63)eTs z)DvC%ZaeX`jEnb`P{vr5ByKt?lzwo3>&1#6qUF2`ezbet>+py_0EJR`hG~5#Usf!^ zsA_`_h|ZURH+Niuw!InMJbF9JF*yb{Gd(-enXw_m=~#c*-77NzNvngW;^_{E#3))O z^gpHjN(YAc$Z1;wGxM9p|3ZX-LC9&%rhrHnpc;+u;>(C=rnn#wtiK6r(Ebip*a(Sa zP?4JD(ri$_!45UG7=+!GX^FXI_Bx#$IA9u%HN3_y+L>xy6E&v9TR`E)HT5bOq3|3%` z!IwoSRtCW5=!Mb0m(90;zbkuP4*{R(e5>M+*;i$0{z4USX4|IArRzWcxMWQH$1FFiKwG z;gencMJgt9PCx0LA%CqS>h}{@vYb=~N1q_k2WGxFN7u6-n;nWA_=Tot+~LiB{K1*+ zuIKfNezjN@(3xEoe9(VkW~x8{R7;>#?Q(UA*XTBm+Bx0s)R{3{Og}1Hx8RAc7w3G& z3#ESy3`MfzVkv2Jn?r`Ax}yx`H&JYQ4Bfk4hXwvn$_KF^sLL^ z5&XV5ZcwP^mlPG@x_|0eb%uhe!+b;3N;n<5DJjDr2RiT#z@;^$zeZD2Pw)FHg&$3!CB|4%U`0)8A`W#$<3p`u@FI!Xs#$8YR#l#>ECUAjFwmbfvy?kX}f_vN^FBF z<0JY*)dn3;p06AVEhkNce2|h0YU_t*;WPwYi>6$$r7uzfgCwW3Y=hW(4k~3MViU=K z%VWxa;HS_gTr~Zd#G#j83*Yu)8hq|%e8Nz9NS$cPpHq!b`TFu#i#{A+KP7Ema$ZSi z7-c4{rJRPJ_g=@6dq(b>oH`K-BDzahsYB__Qg9H!%gdP<>RbvKatQ*=A z0+y)esi6>CDJic5wfPU)#MJP3IFRgH+ba1?pXUmH96F@`^jbd8f?)?UfNrwEp`n~e z(;j}Ae2H8Yd?^*gsGI{#5q4T znqHTtkJ)^|&*fAKskwVWu4jhX!aQA8rap@@WcM2AYS zDu0Z}D6zKB!`^OCmL)1utcCoZpY=&`TJ=hA%zdJfhM+{i$F&InQFu{(uMK*;I#&Zi z>m4Y=V#Rf5g@@R(5nqO`iL3>}i<{sqyfwvAOQ;uABIdIRP^1~KRe31C2|l`)oKbat zp%g~}KySnXimotmut4b*%3tLB>*uUkkQ* ze>IK3FeS~K9z(!iRK7WU%Me9z)Xm_+X8DuAZ5j4jQwAN9y#{Uik7LnB#yDO(+HehfRZNL6m03@q-Cib3%rP zeQR-c_IrIOn7VR|V*s6+wc{*dxn1urIb?da>`Myg&!^rbk2sS&Qu@dP;5RrkU1NqI z1mkyVAQHzSITKtAXF}nn1u^`|>+vVodpE7g)UwI?_9BO9ay;vnDXNKONd!(}cmk== z(m!fVok=9_Lu4D{ePL``;&VS6T28oNH?-SEz|ydp-k3n$>l`EProoG{({46{-BZ^4 zx~QU64T8^7Kz8XA=)uWqq;l`KqcQ#yU5iG8kP{BmlvCSI*>ApD%7Hz>)t=z5Dj(CMbPW^jy#$Qq zMVNhTB4Wnh@JNte05pNTL5YaJ=|z0;MHfx2>+q6-G}n7eLSFQ-MGixOM_v^g^?nmd zBm~0F=$t~N@L1?AC2tiMDdi@VPsGiX7ZRD{7pIEeY$9C&f(XDR;A|gFXZu40eGbf( z+O+1h}A0h)J zljZrI){a#3q;q`PRUBmb6C0)5rihm0AJ zdP?i5tqaxuPtg?{ArH9fn>!kAzQYf-5F&I<4s&%Yc@pwZ!kkJno0FAj5n~D}Mcon! zdE%>zO;{u;Z2NOHk&Xa$17S6OE^jgvX?Si*`a!rLkZ-_Y+O!YYGnU(?de2_*A&k@R zt6_*15(M5d3Iv&0A<#V59RY|$8ce9mjl;V8dP#m)Xq20V$Ola*?9=~lKSRA$2JlWQ zcSJpa$HvGOP9@-&_Y@6fY|hU>Jk2_VU7gc_l-_4%115N!Y6GNv-vjv*zK)HZESXZ5 zpDLD$Txpy9eVe}RovFDa(6=>4PYOcP-5{rl3%iKr07 zlfsncNp$*(%)iW6kZipE1M<*0Vl^TL3hjr@sXr7BevSo)a!Q*o{k`V;m>?Y|BX?Q@?! z@?@kqX@`}{UUo=%>`)^Qgn%?m&6|qbEjxq(ap!zalM=vL-uN?l>owEva96>%V)=*W zq~5M-Vdtl$P}3lB_(Ku)zb4ZEwXW}Le*sYT>1C%pZgN6OcPco5N9nO}<-5xF^D{8| z^fQ*_Qa7r@&m8A{q8awdS3!NrVV2(cQ@Oqh-K2;PVy=$h!l+Kg6k6Q(lE-iZy6wWgd?v4VOdbjJoQ#FhAUc(T9V7R2;Xv1V#rL`H z$SFA80BQ>sDq7k3y=6Kr(8Gp_f1? zQ|+EwS?QP6=t-&KaK)^0Dv0X*Vm*@^0Ol&hM=$zqgVfn_i>c&AnpZI{7h2dU;M?qj zDgG6+RE`x77XoybL^e16plOZqq$qo-J!cC%`6;IH%uF8gkVA`7`<3liwO`$ahi-1Z z-fMaBUyJY3ndi>dn_KT{KU^}6)Bdq-*I4j8w9%he>NTk+{q8)PY~CX77L}-?KW%A0 z0|L~GfpFg_wpMv3U8;Vm{8Rcle6jpe`IX$&q5ONA=dQ(a3{OtMCPTw}@1t#ILQ#58 z&?-%tS0XBChJDq{>JIgFI9Diq`yI)F($n(p6@xH)P|?8Bi)0l5uS*`WQ52hsSjQ}aTOog^UjYX!(}(c8{pPEv zLx6^;|Hkfblq}Q@dbA~ST>-de?-+4a{P;M!*IZS-{0rDW<*zb?Bq^V^CaRiW5j*S) zh{A6&Uu?t^8dE{UuAK0*yYs1H4TONXqt5qZpV1{HUDLEr`3Kn>J2^-Ee$ zgR-Q07+lp6V5-^96x1spqvD!Y2QuRys>$3ekRGmrY|*I=oVeK`{2o(cYxGB6zrw$0 ztIU!!r|ZZOcS=WrX5hks2@go62(?GjUA9H`)LG+`;N9R^(uhqHlh%(j&LUE&YEOto;FoXu}tk8Lu2QRKc=wWtR0&6a>I&gzT5(LCf)mCU;5B z>BY)_E$EXVDgQQfp*X==P^=icN8##-(6Y+xYrzqXZV9@^BgIl@%Oo#9EVhIXxs%MU zmTsn_0q zR#7r^HC5%*eW3;q+!kQP9!=c5JcueoGCEl#l5=pCJOS>BYb{LTI+IQSdm>!8O-1?c z)U3v`3L?8Ir8sky1-#2shZ2cNBD=o$Uh&VxW5vG||5`j={Gj+@@o&YCic`gWt7x@b zWot=s7XDb`$VXqYstpH-^l-9)k z0d?7^eBI9s4j|OyF0!a=HvyC6!GtOAjR%?Pdj}r#OuspZOpUYHEz^nWpHL*Bo6eoMy6!! zQcDGx?NRBW1^9?PM8d?O@liKA*O~Z^tzUmmH+8)cVAh(XOgytwTd>!XlDUOZ{lmq9 z!`IjC<*P>Y*H;OKx{HIp9o;Z82e9j=EWcuM`GwX(y?+#Jpe8LNcP{$pbNO?3yxn^N zp`_N0i~e2?VRkore<@6K(I4r7mC|4IkJ&&u29VOlKwaJX28~I-UY%|%>zMs)7d!OeLbKA*R*7w}v--;&((NyRBAmECXq-Vy=Y z+e=|U@5Q!QVpp_ovLfCd_Dg?>0GNiv$0uiwG5tr5jZvS6(UgXYm7zKTp^HEGk9xu% z6z9bsBlEQQS6qQphd27&_pJ`P-hcg5w$JRa1;dt|O-f)mzUB%V?;9tPULG{M9`%WAI;CxLouVms zH5xJf(NcFYopdkal~IA5C|GWcYMvUO1)s&=&Q9UrjKe2xP4{j*-}2d zIXwg7^T%mPqyLEjW$RkY^D9?8GC`Fj`X{E)I*^DQc&X#L2Ntn1R$G zJ1!WoS9h^j=2B@x*_E@8!p{jYa3c$dzT)>etT3f7#8_Wu{wvqS=c}}mpkB0HfQ z)1VbM7nLNEF9qOER@@;*$>jG{1fMk>PUmrpE%!EZRJ|_)Onao!R3PwM{p4xH8q!|A z>Kd3U7twh)&y#1GeEDbPCy36!X_vpsLi0@6Rn@!?Opk+YkIIc`)MH*!4eINFN(cQO zgkZx_3dbf#>ol`G0pLAWU-q^pRKfVoMn&gFLDibp-?YBg`nDV3zl6YhIZfop%DM6t zB?LxIjT^n4W_E$5t|^{`KVq7r&VlxSTZiEWmB-^{ehaUD`}AN81sekJnam`*HO+1p zNHH!y=+q2OTJWLKU~7)fbWj=iWzz1*!K?7qLq_5?nx~UL4>j0r+EH?T4w5++{`vEY zb5#0&EP-_DV4@KP%_%gEfpBqzaK^^RG-#E;H;6KP4lP<8=hC+G~j*9ZtOzc9U6cI`QVs&#^?xkV2&ndwI7aYt;3&0ku!(C+Ap)*1oS6VxJnK zD*SFFN{GN~z2J8pw5yRAc>39-G^F^Onj zf&jnQevF0|Y4(Nw&~Ba6`gCg7+kYKT?9bG$H(K~sP2k-oY(=ht&??hd;K;bT5iL-l z`1*lrWytU@?eLxcOpb#46ibnP)&?+2@FY0kOu_osxiHS88?B<-I_bdCW2vYmyNG^U ziXQ7mH6YBu#*4QwKuK1Jd*@ej(BXYC z(BmFly%*%MHX5@^n!WqCtd~-%caAd{KzrGKad{Rh+UXQ$4EXt5?CRNJ-a9glZZaT) z{f2|e!x)&>c05v?8;L-7K@J1TnI<$=JjK@VAZHQIgmLOhc4*(|A;#6hRqi#3n}poe zf@36Fr$s%u@VsXDnTs>D;6E>ct`(41y|4A^_G{aJT0Vu&Bmsb3w`0$a;T_@Hfv-t~ zc^&jk<8{cBGKO!brpeeA%R#m$8=5B|W1X~jsbg9QtSjQ;U6rn>De8$P7c%g(u(m(e z`gm%yPIQ@fMfZUz2Qy!|s$D6IBh7CGOB^Ml9<4Ltx=)%1-0*<>tY5=n!|x(dqV_yG z`pO6ML@aHj$@L^<>uCFLVM?B{U=Fi>@G!~=$?$eMJf^fTmtV*B(oiJCW@r05#n}oH z7Dp{mma>iMtS}wjhjEv~5aHC_)dtFMq#^|0_EAfQWnwok1o?A!WH*7ISooP)lBW(@ z(^BEx-qD0jB%DvGYGdIYJ0b2IyH=1Ps>eDG6RO;wwlHi<@ zK7`QN>*<18lCrg;{7pP!lv_U}kfso2n_x#;hpv1^IVHd7y43JmGVmNTTbq8MPDd}C zqi=2(ZtL177YgYpo!Q{>Sv}AR^G}u5h_&|OZ&5Uq2N@kC592np{?om<5aMm{Y<-Nf ze7L-{d|UZpr|o(WoVfp4i6)~S(Xs9>@KV{V&kxe=TykhSUru>hw}3M@vhfOe6VgYFKj&mS+& zNzCKDLWKJhHFFO+UpxoLU8Gp&0YKW!#XL*mFBO zQ)A&FQwMX&)kx4y0eaoW4EZ>8nYVM?@Xn3Z&^7n{y`W(76Z2x`APzyY0BNLClGDXO z_IZjLP8?M=>@fw1ybi&JVu(~%niY)otW(9)J(MBsR==Gp!P3ciA8q|=ab}GNk`J293PpnVbOIzU-VI87|IRv0Grm<+CwucG45;j z5`$Ah?P+q-^(^yWUVu^XOrR`k^oxhiKXAYGxPCw>0+4;CAm?M6l7xD#Eod8p{Wc+$LlOQnV*tQXu;bhUHyKd6#)(4nJ&(2)o1u*?p!kKjtXJXt_)MiebfHf( zlz3W}9_Sokxgr5Grb&A@;_-;=U9@Fa8c3lPRJPQazRG^-3&t;#mHdP9-Q+cT0=hVd z#ZQt@)gCpwKj>jrqYbs>d9lIzs-|1jo!9BTDFzsv2-gT`Hr~u3Jj6n#p%3gT zUX{H1;N`H-_Xb}x`K|T5LbEvYr`6cP2Cq=T$1(;|J&QS*x#^em9{NQS8Pzr^pI1{iIv)+P9WozY3;T3J=D@Xn3|Nv+n-(?gNeZ%zX(_?mj7Zi(n4z$>1j>DAKI~BMzC4qW5|Yy{4eG(P6=s za>tZ=JXyN*=R@kh!3Y#D)qJsRZ1ONJnbv4a9;jqbP$kSY8l@xm0;=V!NgE}cij|DR z3GGUQx}jmX(x~$4En#6tW$mI&RNWrf97Q3#A+`K^mj?1E#t&KS!b(og6&swswQF4i zz~3r1rcu-j{@|wKPWI~cXmD4BFs!EeYwh)Ia4p0j!G(N}mS*69xgb^>e4%MOyYx0O zQ5Xyx&?`I?@AgyOqdGa61`D%R^4Zr394R&*IW&qm@{}{jpq023)xW+WuY0;h&$@Fr zRaOj5`pZ}76w;Ts=}O^%lCU!6kbR;lntU@f^6ouJL#g&=4S?+Q;eae{D3+1Lc1&bR z)PoW>9u>7uXW%VOHlXC@n^9=m=xfVPuUI&DSUyG7X|&-}tgsnon0YNB@e#$C^+z#* zKJ2IU?;u2?YT)u_aW`vEE>5iWjQ*)o*e1rt&``YuLv*Wwp)#7wTL0R5y!C_D>DGL^ zD0jd?)EVrjb#zzzd!e{-n)pp0( z*{P{YE44ybLdY^iyp=tm=cuA%Ih}e5`V>`sKUQ30ZrS%HHP*LXlNhED+H{C;q=a-e zgeFXU@_^2vVwdnCdfE8<-;(gkJ_Ph}@~H}7;B2Tly>IZsps6+ZD9elAqlok|^-eP< zbUpoo%_kOoW8DFy77w9XObhDQij5K6?3jXV1brfLK~G)n5jjy=l}mI%3}tZ>CM*>K zxVj3HmJ^hzS?*BPCJoRKi!QuWOGSeniW1efAd>p0i&mn@-x>D4(#*ye;7>a zS!%qLN8*NQtQAA8mb23g)WZdemMvd0b`{UBgYZgYGL>$UVjW~K;S}?f*u=Tamsq$V zk`F5Hh};N;{ghk|?IN*4nEJ@HwY~Vr^evHFk^XBAwjZrbdu0nE4_f8;MX#0}|)1)73B(R)3c%5ep@Q z^nzN;W!LL8t#Bq%zXTJFR3<^0k06#f#8KkOg|oJSnXq&=jj@GVOx9Wcac$wHO4dln zBlxs5O6f!{dk=##Ptm5i$ZxwqX!LgQjL1pj=j*(s zBQ51pAL(`ER6qemRz#QC33`+VQr@zHupIrss2<=>*- zCn0tgINSA9wT`5%8Bv@u<+>6nK@z+TZlK<61CY=0Xv3Bu3HeQzTHj$?B?VAIw{xGNtiZu!pQx^kMkjweMs4~!3UY%Is=NFp@__mFYPm|)IP86~*L5A&=g$m5cR_R)D(@Ph*Mb z^32o3VQ_asE!*o1r}gyA@Se5bLlb6kV+NY|&4~tr=8X&RomkCd;7)xHe>0mo2?Uuw z-89Cl6BBDs=Rrp>N#m1Yl0Hj9nVZBPFU2`Qpj^QN0Io640D%bXkntD*G7Fzmu3-X; zDq)8ow#;sjk9TT6Yg(bi$|CYIf~&NgBzyI6RmEQISNrEt^W)yt2?KR)F50CR=HgHQ z$t};Cg?C*J<^H3gpwVORAa%d#sOZ?dn?fK~K8>)1D09Z#^dTk2jW+7N^?1ahtB#J3 z-`>m^_F-s!KETnOzDlp3a5NoPa5SK*g*aOLO>`F1l^d9@)C)<9MmYhR*>nMxOo@c( zzZ2eS1NPPLps611P=2A4rX>TsUv{jMo1=WvA^=^%FXjgaSoJa_=RiN1UL4`lpGJ&9 z%X6{C7}HQm@655{ndyjPHU7Q+A-d9g)t|#Nm~&{r)BnH4c{7?T(eGKh0!wy-&q}EG zW5sQmZqQaYW0|xyO70t3k!>qmeeJK7|HJCQE{l(SlCd)^j!r`*fJVoAt834bhI87x zR*^g}aPKN!`3N{<1f!?^lls3$3cWt%UQ*;lnlRu`se_LdKf%dZV2_4~Yp2G$rW(2} zB*tkgIj8!nKt7!MC|lLq^}C`UZRiz&HN({tQw%lH@Sh~LbmY_17|_%AITp(%;PE+! z3jW(SJ`?{5*=r7)&#pjicXd&Gdj$q|e1;%J%XCgbu@1NMR=eV;&$p$anm61T7~Z;sF4}ud8mQk;3a85J=&yi zsoUjv;-Lf|_=UyB)Ch0kcX##=?720ik+~Pg9N39_O{Ote_NwfVTW_mMA$MbJ@}Y!S zk^s)-pYf7<$`eH&-i^b`jk(IMt(j*(nULM*l!5IIfbMF9ARVKQ2(<;p@jh+J+)5en zU?(=0R+PwlkX9?9~49Kp7@G=3K9A$Ffv zU%~$j(iX$TWb5f1^Iw9)#Tbo=6LcQ!u?ibe&)D(n@Gbhsjz?V0bI#)3$T4BkvUPIxFqte`Q^{SN)JP!qxH8QR| zC+0NJI(+4k$=T>dsP7G^hw1(fWX-Bw^!~(%89KPF0Zh@2N@)=(hWz6Dr+Ba1$Q^Pl zVwL-NGso~{D%c~%vExSnai3O>mlmo#J*EaTytCG0UvXBfhwaFM1rhn)8<$X2+yd?e zNVz!Zqql8SlX0z`_Ds6R=!3)oJ?Q{j9#Ys8-T&p;=PGDLk>M<=`-HVFI+|h7i$b$>PXpc>4)^2b;V!=`sA?5l`@ll+Blogh##4{F{pMIEmuPTx z)#pmKT3-Jrd<1r+j%rcPK`9VTllTopdL5uf6O%3sPu@F;&~U@~`soMZSY(1m ziFlh5Jj(CH@R^;x@bW7whIRhvn);)J&cH7?wX@iQg{UyZX28PYpZqI9w8>$Tr0quv z*m`?bL@USSC5Mq*6Yxiri0}~rv`R11!S4b;LS&a|rep9;zn_Kxs$ZX#kJH(Lr2xY^ zM{nAuiQ{p2FJX|qy1)lwqK*(36<2bf+HXoByLkg0!=a{ipTH|<1QskMYFi~9*fXJ( zASvpwWsx(j9DreRI#QyDn73WcC@sJt>>-PmVd}bZR!5_AG;e>3>2ryRVJW2Y5N-~h zQzK^7`jQGltvVZ6GsFZC-+;o(Zb|zc#d$;wKHAok)1dPNe*@EYS$%^~3ruR7W{D$w zW-fKP^EGHtww-WQB8mGVpMg9PyGb*Z-0)NaHd&m*Bc+fgEe>8!Rnp>cd$JRg-U zxStKOJ0Z!sv3LrfxZf%Va0HF zkr`JyMY{Qt)(s2-Ia<={F1M=IH%Y>VUkMao?*Xh~VRBeo5QvT_M6ru{b~<0E@T>Bd z;1x?mRZZMjJbjZ9@SBTy5k=HfA97`hK8Gc&ab z-z#EhdiQ6&g?>W<6p!83aY-ryEc%fA7A2~}pn2zDsJ>B^%uz^UI+PtMrN5%hTWa|N zP8KXk9swqz+>F>2i8{ySn2*_#R^~hYSdc~Ux*>834&b@j^43w9lD|Mt-d}Ce;T9^# z#<^U~d*d7}J3;CE`h65O5PTx9EqKMB_4F!d5oz1wIAoiu|sky6GEN(YOwHfo46K}d1Mz-LOm?fO*wbFNX}fV zLLoXXAU0?^M!#8x;mTc08e@HL_ek%cav9;SYs?7_kX8MuU7C=kW=TrYMqx4p6RDGQ z%sFsrRHp=WO>vIxl_4y6Aq@nXHcNK1Vv=GnxriS#u63op?>N$e)Bexx{~}RNmEGyY ztt4=62K(9MU3M9Vm6vBN&w$NAW~`Phn=M)^C4+fI{nh-@v+9rJ0faB)q9ko6eveH- z^faxg*dpdXM=OXa2%J&8; z(>T~{OJD1s$+KQ7UMh5d0rrl@^!-0J60toxPm(s2y{fwVe}}H(z!52HqJcw0% z>$*wxeq!BR)%WoPpJj$|MUnzO(;SVQ1LKxI1f3d3Rl2A_d3bRQ-C7EIAw-m8+tb=z zNIw;U1mZ)xOPd~elQWwcK-J5Yzfk^Pbldo9`Hg~NmPjGn^aH^W>P^SdZ!(=w0S>d> z*=TU$W}0(iIm7xr-8HQFKsQXh!rKq1=}T=*^gIkV6FQSX@c?h=@u|%~E;bz-IlNEQ zngt33^(+mg)$RAU*}7F7^E-2P<+25!j4dVE%YQ4LWPvps4=|D9K1fB)QVN~M7=Icd zuuRV`E1hgj!{edcihdXTF*MR5e~hMgfXmx!`xaToAU_=qh(ZD_E&|8IvAoaZ3HL_Y z5BP+(vui$7aUe=6AAX0r2QpvIbBB(o{PW63LEF{DI=SGF8rT__MQq&fS}T15jY!r} z0D+CaK3fBN?5H9TdULYVh_68Lb;m!Dx(w(vSfu)Jo$?+^T6q`OSXjbNHspa9#=kfh zb%i;{HX=biN12D9dTO;~FoCmtLR0;%lT~^uXjb<1lF%eKva$!d%}w&$BR6C%d7i@z zZhKrAN}c5@O2lH)RXf?UE~B?0<;F7dt1B@_9zcxS*R8Q6VqNt-C^rPLT-;WF#BuQgrR8V3cP=6&kY_taU;xg%x+BPGX9>_J_mw%9bP zUCW6PXcavNb$3`R+zWW-uDiTPS9m;z4pEYD3}1~Vvt44%jkLcjeqro*<uTJ7h@OU>>H6;~xO2#l<$cPiLb24ufI8bmk#3v{q(re;cso4v zk(`aUd%!rcFO(Bd6^T28;2TQ!(uC*jWwy8!2Y8-Z5GF`mpAi2r{fZc5oLEZ7=p)#| zX(1^37qfTIhP(pO87_vasg+UQ?(=eq9oyKeV0dTzhT{zgxOb}h{Ab2nr1&opuQD$UUFhNCL7OiMhPI1XpWXX5Yk_|4HK6qhF zoc9Q8n=5AV84PDem|cADLonDXW9F96+zmql*TM(TT37+ z(Ho+2L$7}JrI%~-=Qq2q3Dp**8mWu_d&2L>$`Fx<-~TF2=9o>qRp>M-z@CHHL6XXg z?%ZHRXZb|Zg*pSRwH>A~a)^;{>L=>w{eg?_d$W{g{I`@rxH6SC#d%92hqjrPAhJ@S zAxTIoEA0h``0w3n#Q5wN#Q$@~q7{b2UP4J8ADV=`TP+0!1fuE9nRC=@Ym#Q>0EC@i z^D^biJHgq}&p&S*D!lhy_GYq*;O>-Gp1aVolrglotFuf~lh8~HlJIg|4r1sk3jK1W z(U1ZCtdmfZgnVfQ2(Y6+nycqkyAsq$3X(sN@ROczSDfky{kSe;R;bX(91#)c8g2q8 zjCq^6V@$}RV7L^#Eb{tm1vsSh9}*Qg8mTEx5D1-?3BLI#86aZ7p;1vDEFzaC9v5GL z{2)D|#I5}#$3t2M8ZkPSNp1yCL}`Sk$I#&-;r7}%ZL+;n9JC0>QHp2QMN{EPW$Z?G z>m<6i?&RT~T!p)>#(2}l)4L~~`%&fTx^WWi1cTj%E))e}B5-n|RAt^LshtvDq$&~^ zzImP(&-WF`>e45H{ZP^N#`Zns$8^rer{|8~sNz(maMmP3%YSuzy@rhKHg484VpxMY zd19?7t{tRrm@tc0)^qLrG&MVEPxxzqG{gcD2uogs{hs zD|0bx5liAP_(RPqvT~9*f8S7S{~S+HtvUB0!*kdzs)1s0XjIkj1z2A`^@-BDx?Tj-c15whkr;dB;B3$3|PGtSb&^5Vq6F_JPw=F;y39)qsEa#4@vp6V6(U~x-AY19;yRGPi7wy#e<`QI3eIOWQC_n9{!GY`2(TaK2A!EAZG{u21 z%|f5(9<6KXv9UEQf>ecitT#M*onmUQeQt+exZkaR_y`6?!y(jkY`%z!%c!z^0);^@ zE}p4kvQXeQzF>}SPm|ncNI0|Bz{+#_dBpL8OcCk4kQ1J2z}AIbeN&9$4A}Lh6o{c! zvs>4=7VnAxoX=`+AHkJZo6!C4Pty2~9{K&n88}hHIO*ylAAY`eau*cyI6X>Pzd#E01YcNrQi6j1RhFp`O)VrP^-^pY*LZijMmq&+cl}PZm zAEqq$kBZIl>z*I+0uRcM;?-{RQ&RCD$UXOj1Aq4!_VKFQr4TlX;;Y7XJsUL`wNvGXpavKsBf*)SBVI4f=c;p<{EqXml(Dh#y5OV8 zA-?0W6WgaS>SlDseQ)NCW_OGp8L3r<9{u7veBZ4S|6um8m={E%-bHBR)d5n~iEjFt zrh2NWKN9NbP3PM~m1y`N`rU)@c>|L48~!xw$(l(T(v8y9S4w4WpCa+5hon(Zy)*(b z@7zWnAu>hRqidiVX5R&$h*AnWUD}BqUW!c7qK6JJ_{}7~6Y@vmi9kg5GoDj-;}9mV z#XSa!x3>FB7(IxIaVw7M^oXV`b)Ru!FSXyn#xu1+9z!^f^<_z&fg-ah7%PYd#3q(O zrf9rWg~bcnJLtV1uqIE;B%OD1cdsFQBfe3xH;@^=$V-?cv)W&OObmxDITur}bSp7OUtII2$^N z4}hJV7pThREUSbQ(kNA9d>)FS^JZ{jlI1*7g(y(r{-}xV34W@|J0S0-a);4ectXX*j(MMmB`*|Z2jV-rB(*8cMfspWK7J(LtT5k8|s#L(o zi)DltgAs%s=r)~IRi*Kh<+qPlJus>gGIzo_bJjb>KJp*a3DNfkU*Ob@PmZ4JDg5uE zVgSGB^>hb*p!MKf9n~`8RPlCL!%| zsZ2dnddSTp{O+xp^2rKzy*mzf)BX_D5G3xOnwuST#?NbdNwI>1vtx|88(Pk1DEFu! zJGre0pGK^YC_UBeuuU~E-=Y+1YAUHMKak&q>Ph>2RW^D_@$TYFp0(!*yH8X=BFX*> zZ)XF93&m$Xy_(tQMyY=G=Q{F8MqTf|6tDB;^k9AyISg8%L`V}!uFz_F#Zgg+h&*fC zW})_Aw6j@@lr#!|A~D@%qp=69b8<7d5LNQaWC^QPMyBQZc)6GSy5(zGS`s%8~-%J*JtRc z!c0c{ez)=P;h=%AGd-pUYmMlPI)onA@;jez#Lx&CcVeu@bq?9bB{5cs)O^P3!m_UfUHFSp`NsKYFTfWe7dEJVb zW+_P2#GpVF*bp^-5eClzRz`Z5!f-t>oyV=M<7pkp=~J3$18&OhxRC(+hZMI-50M-i z+B0}_W>SaA5Hh~E(cm7yCv2W~m*LmOqMNs{&f43$iR6)ftT^6#%%D?;{Xgb_zM;#X0*Rc27Sclx6C-aU@(p*D2D<$##kgE)|Czn18 zk>6i;q-EH86hb5LmNCYM*`(`een3P2X-z(572#GmSNQt(6=!h)h--8n8}4+wA18mY zSY@W2Fis#XA z(^(mX;tL{dUGT)e6C&GYp{OVgV>K(dkV_Js$dx1*HLTH$Z?%#0;BE3Dgv)y;slo@r zaM+*SZ>B%5G2g_tCX-Ic_=W>D-Yg!H!6Hqea&w9Eizqmr8D}8+yS51`>W@ZLdVZ?U!{rsVSSxk9@K{UW zEJv4~m*eexTCstg1iL**1DJ67xB*%(kNMQ?@XtBRyP@5Cvl*W~I*JD)pUzjm*4~v= zq@VpeiY<_@I&H3vD5K`w1d>Je*&5E{Su;{3K?=QhLwiZFj;Q3ex`nLH|Gh;ytou{& zVDO=8tL3M71e_)h7xYsOIe(?Hvglx@g<=}WNTc+-LE>4>)(9e>=meJe%wl=x=*|(U zLG`=+iJWVn$BRN9XpCcipwUTs{=cWVO(}rXXBu5 z4^tDH-GWlOlmi&)yPI=fJo$aj8VM;ZCHwtH4gt66MbC2>*<&j77xJNfp!)vOPa7ht z!v2gw0TZYiDZgpOk1&VCA5 z$q=EZV?5ah3rfqnB5p2@54V0MSdyWGENo=EHyID-5miSK#l6MG zV;Vp~ayImcMntgpJgwH-GR<>F)j4ofIHb!&B$`k=6N$-3tdTQm0xepjzg&p^b92o~ z){3ykJ3&}ecAQlLX37hdI4(hj%WD;aS1zNXW%00D+MWd{&M7XYp65A5f3c^yu^1{3 zi62$|90B*M%h#5#D_>8hMoK-gxg;jgyCx@Yog6)K^l+rOV8x^lVD#&BeL}8O1-1I6 z>Hmaff~}Pdc{BLdMRz1}k1bhoRyo2vBLQR9;=aO}%4I0Om(zQ)A}U(v=Y$x5yZwSc zVDK8<({BJu1)%N(Y70<}}bxu^%n z`A$0KY#bzHKJFnYgj!b>A|Vj7w!$<@3Oc!$%Rg3yL9`B2oG)Bv(=was1e;`3{89R%k zC^c2jW$qJ{z}3|9(Tg2#-`##Nkjr?{k(jr7S+P{$lik9@4I+5ji zn!0Ntb%cF7vVjczhCdvmlRo=NEdX1d&rXx@A`Bq-L`k+eNm_ycCVe~g)zuA|Fl(IJ zN2*b7&fj1}xGE{dem)}9~W2rQ||NIfVLP5Q;(-W22(iL^+c=}>Fw8?~B zH%X98RTnQzB@vun42aMbi-aEVaj`c+p9iMBf!1Lw%bn$}a(B6}94z;jHkM< zDOY)hrUP+&SW(Jw%3}G`b$~M`JRs{09*_0=tv{s2_J>=4)cOcXYB#aD^-!n7bJ)An zekb4l*_UG@^qd-^28kdLs#Hy_4I``1iwcR9#Q&eR^U0TgR=#{~g087QT8-I?0~?U= zl43{k!s2lGDv`DiCpbtCp_Y%gO->v;;95IL`JRHl>=jcFY26%A;63Zt5~*x3k)of``RoTDds)OIKBd|k$9 zL3|fZdr$s;sj?(~mInzolor_){20CG*)$$zSf&1x6q3}UiL|2?UrpzYs8VN$PcNr-rkooKw9o}4l@sj8TpY#)iDMl=-qc1OpIXO256T9cY? z8z(IQ!SFT|dYm^Jg?*&hqPGIpOBKHT%#N)N6EC+hdDw}eq_|pTzaO_`>?1APnVD`p zl++NFS4dH{QS9kD)?3WtE_hE$CVbi?Ypdp_K|GWx(+4Ck6b36y)9^We2Mj9^N6lD{ zD%3{`4d|OY6zW^cwxa!{_S4$`p?!J#>h_WLO#6=Z%PT0+DycG3CqGHwR25mmNzrg| ziPEF6$`aNfH(c3O-+G0v!LnvHs?3fAlf-PJIgeidw~I3mr9`x@&}H5S4Gmx_8)7f- zqDD;C8r#`3Hrjx9&aSNoOHGeS8xo5?2B_*7OSKr%#-UxWg7w)+XE1LM_>UM{F61D- zz|4^j)ttGqP$y}!SlyV2q*b6;ggASs8E41AT?){bF`w=>OnUYIXv3=Lp3qcULREK3 zOQ2GS!+5%-j5bGA^VaS1ugd>ftRtN)eK=Zoj7Bk2w8^3M(ldI4M|Xce@-6yZ(V@7d=E#=Bg`x*ZOV$`0l5fJ|Z}AujnUqmCw=_|crZ zIR{a|8}-OkDP$D-tcAiJ^8DwjXeiHD*RftzY&6i4&e3oO49TJuGu|Tq867}UHc|`4 zJWJlk4a!E9RyPHHKmLutT8l{Q%dM}p{QZu1WSiPA)B9lvgl^+Y3G+3Uv~LI0vnNDW6}Q1?%iK zs^1R;nG0DnM_GGc8fkh-0aQ+L3P;#){v&oEWA26wkRzzqHCKUuV`~==9kq?6d=hyi zb|OR~^>y!uKB_)pTJiT3Yo|NM`YUxIiGW3t(Nj5CTxb=UbdZA9VS(4#;pmAxoKUKtK5q28XNl~2hvrFBj&jI`&qT184@g~r})7W zN4Na>$QlZ24csuTyMeT@;@kfd&?rZ?v-O5un9VF zOQ7fX2+7wFsDr!5@4V7>iTpJu+!+fARc(K@q&J~kfPDzLsu1o2(TEqbs$)Uj4S{{= zg~?H2inq-kcfjjm6PEY)ef@ zcF3iUtec-%11vvJQmmToCt2Jk#t11My2nIF!H4iN)~l-nSaPB(>Mg)e&!3zY+RF)x zhZJt;>Q>X4bh$SPuo1(IxO`j2sHUjh4MwnA$as^FDE9N9{?pZKI?-GX^l>2 zt=Zdfh`rJ;X~9G299`tWSUP1=a@CB!zKm7}=eCF2H@C;yhubeJI3kIkF3ERPc&03+PMte@Bij(K`SrX-crAhfRQo68? z9qzZ^Kmo*;phf{PqVW2OU}h#~ef+>0)A8e6F8&94K1mezbY^Fnfsp&l*q=_W!Y0rL zISMH+>aCH&j=7$mf<6OKrBA31>@#|%AnzKV44i+xuigkuQvfUpX^o@|cQbDEvSOSUN@eOzb3W8 zLK2O|n@iEGFSZs}7e5UR??7>D@zP?XI8=-lW9{E5f3|#O`HSVR6ibiL`9_L?WO^Tg zm`_mM0Y%`GQeAHdIm-YCm)^iZypIM5D_R%Ojp*vubKz1vO#AE)LuP4t_VF7Px%q@& zHV}1|`$ZWI$ZWw%uhU6~w3+gCTK=a6%UO<9q@r4h5OASb9Pbfj;)$X+w$< z`A<#&+Aq6j+E0Sgn(M(XiR&?=9Mks9wAE}c?^|c&*i}~s*r+d3;+?BywnfJlJ37)- z)Z7^tckWkDji1HcGn~WoqDCE(xCWZd;#U9>@C^H>?ie{S>ls~syqBleNXS|P7}GwM z)_D)58GxqD*MV9XpsP`bf@*t!(>%V=K3vrTLXEFMZK@Q76%tAMIoeVid#p?|fH=zN9-VG$ZBSZy!u-z4vD z9A+tB<|MFn*2h^&#;PW7N>@4g7s5XlHC}zQD&>*hXvsVS!nnUUrQ5|;ks}@&pE-`>oU^}W z`O;p7I6)(3M2t&n)VCGFpj?(|Iiz%NSrPaBmZa6-5! zFH1_Kn#E}**^=uA)1w9pNYgzfrNEr)$n(%^(qJI=fPDuHRO$8p4jMRuMjlH!prCs> zMAwQy4q6F2v}xgq8iBs>uEJayj<8!Mj}Qbp#;$3HhTd3lcPy~`SE(PANP~$v}Z}g3KYPlVKhc; z*8F61V+=a80-~gY<)-`*O%Wu-=!2$rxVSiz6(0aj$SI&E*GA8TY;4DqV5uygAB%iv zLg<`Xw2=M4z7oo~Dm|9W5}}6^&pFX1>$3w0IQrGvsLfz1x~VKPmhF$0l=qguUB12i zAY~%VB1lyx^`gLyb6`pTjai<_8qD?+oxGJqP>SIQWMu$BEaWffzVmN!9J~kM&KPU* ziM5PjdHw9kP1Bw~YHT~@?rKNhazyHq zn|M>v5vHalXUP_;K_Neb*(kN&06cVhmw+f<#BiCbvOvZ>fY2vNf9S=3Uab=ohELd( znEUay+94d3Zs3m4_tW;OAWHsMX8(Al?=n()9rPuaI#-g2>j_kkoB=04J$+ZA19TKJ`wh>72%cEp%4cvDI%I*QB;vO&b8qO@ zpu^KiH*ik9A{qT=O`D|Vhdj2C-y~Q6Ce^Y#0O+GP(8Xjp0)OfS_XwSlr zb~QgbFB}<++-yqxG-OlHNx#04)aqQj;&|p4i4@l+zpYgW zoM$v`^|wVTdl~*&S~|H3Y?~PyiViB~6ph-JDkj(WV26*b~V!(XxW`8Anz$ zJHdWBK9%c{H26ka0vqC-S<$1xrIN?p$u(`vc6xq_fz@8a3a7&5KP!SQH;aBfP#ncy zLHkELPu&PdYTXfI_BW|1YS=a1@+#b8Yq3SC84MMtY!|EJb7C$m-i{r^IW3 z9k!RMub!|XN*pzIp;W(0bzL2q!r)_#0^BSgDB=1lUqo{f#VJ%!r|i*X&jzs2w$}uj z%NKrh#lnxST=>y7^+y|Kj2hM=t1TNTm3u=u#U|NL^yZTb7)b;>@FJpn~HOQ6YRuwUA`5PCk$GC`ylX>$2j%Qk(E*cUXCt`Cb9A8vCfsTnRWU z1E-w779tgz;CbY8ZxQ%JvDN5W?eW)}W#4^k}wI6W&BJu;hA^oN*uqO)H=u@=z{ zufpfsE{NN!_vKR_lTU+GF?!qxyS_$P$`jEdeLqIY zQh9|BWMwAxoNMy5&OmJpD%%1{C!Bs4Y5dzKk2WDT&fR*R6+dHkhsUEiBRW6E){Yz+ zpXzHTgzI`2h#4B@LTgYZ1@tBlL#gS= zp3v^c-`JuaxqhL+89GnsGu%A@DMh?0PTQ%b7g}`8bKRXcDKb;@Sw=M`sVPRf#{E5W zfcX+RyR|+K94oi4*JsmNRaXUWTn*MciUSms?Zp8c4ER*f2FQ|VQ@u~{xH(Og9@Rsg zF!5sn8?K5I5%xfWs8+OP56B5$K9U8*%}|cmG$;H8w;?P%<5K=NT)g=I zWADx5>nf}L|7Y)=p=q1a8Ol_^0*VTh0)nEDrfD0URUA>A zuLBO?1Q!(qCqzXNhpX2CoKVCG(Tf9B5mC?%-}h&&XYX@PlJ@HTdcVK#_xIu-rRSXN z;d!1leb#5K6`mP}nHQr-#Wkd#dDcKfEo_@lVS!(@Cs&y+}}`dT`j#kk5?#*G-}Bz{97mbNKU>2QtTy>WlyTi zlF!kB{hUo=>ek6CKu;PC>s%ZYg$QqJifv9d(B|B(5lXrFsVW>{?K0)u=m2m1b<3Cq z3Gh0VB$?*92{wvyKlwGx9;n#J<@Ni53x@`2NGK}sV9`2)Tod_GmyP7NOr=6=H`$vG zgOPQyGjaGJNtGEQNfg!2C^ZE(-KCN*r!6niSyGtLIhtpUI85*dr50?_TTsJ1l>PW` zOtss_z$2jYRhQ;Vk(;{{W$y6xDuRlW%OB0Mta$a@lIdpdaW~9=I8;4$;w_a;t5)^g zemv%xwLES}rA_E6$$R&98r`5{mA&nUmEDhAuL%0F`YBz{7MnkpQ&sf$1dWa#$6LE? zc*yprD&W;A+2oNua8a>8cz-aGrg+%8;SEKB*MWH*0dc}0&O!+bZvLB28G_t6I6U_3 z997Vbpv8K?8V9i8YR|=5ssn4;J2b14T%0lmxL-!zM6DLy+cT35$;M=phD~T96i1)? z`FtHVX!kw1eVAo3ziN)p%1jHtOlp%e83{eYK1^}m(WBcYA@b=uz$O_BF>ES zrK_co#9o2MOnL$o-hkTAAIPRv__C!T{h`?@UVqPl7NnI^Qq(W^Qv&Z? z)ZdtYV9OUXBs>g5cPX1>dCSGb?jCsW$q6lbq|vW7CP_Ibf;F$*HVR8XS}{&A&NZ`n zauVR=iBK&+m;MJ+R>=Dr6j#;kNu~~#VhlF-44EBr_b_Iw^sI0r)P>m#EOuQTrUC!t z0OC?Z;-hu*SGYR4oenYHl!O&-^;{~J8caI|R8jRwU(5xKr4Q4DFYNs92*1-RRaM?f z4czDy0^&wxF=7ilEdv9_cO;i7bxg!)6wMf|aig8j1BK^_L1KZ~!Qzwtv zjZ63tw3TTW`OGXWS(=p8L73Qb12@YX4zuk0X=Oavjub@*g+w^C62;x)jG428@rxdU zVR)M{L;F{vAuuZ>j8(vEU@Wa`SS+GR%wQwv1UVD}S`_$X6!@ zuMgQQT$jQx+x>6i2MOM>b-POcvRY$3+h@aU;_;I4%_z9>z6QHi33s>f&mADpWiAa! zz!rGhT29p>jy>3d;+x`?Ht1Ht743Kx4z4<3PFw*ZckrThw;Mua(;LOyt*l3aXs5#ELzB&A421jGtc!Ju$H*A`|ajB^C4w~crScx z;el7x>cMtEYTHoMOtUBaMAb>U`HoO;!y~oa$Rin#4RJ^+U&7zlP0V$+Njmxw-Jy(u zU>Sp3WhLd#Z}Dc;!`sO#{0RUI+xLPfN+ z`)>3OCR>TM3&5Qz_SZ6Fw8^HE6y;)-X|HJ@7RH|9zV(5Y9ny;;$J%B|%HCb5X9kCQ zN&(7$o@K~C0^VYqsWh=tAlLjX?5_70KZQVyf@jJxkXE0dG7?*-ou zXF_((^hA%5DO9)18ANGvw9r+i4u6+7N*sV%1aU$ML|flB!}||5-C5B$OY5Yr_Kr>= zH!28lc-u6V&Mp&H%!n1EK}{~o#1`4_FR6h#vngY2vyLbq7};v*94ePl4sDMix)X>N3rfzD3x-$?Hzb$uTk#Tst^ zjO=IGec7+FhjL=yn6cjt8}!No$Mv*6 z=G4ip;?~By*7@3DDFDBel)C80PEEt`Hrjb4X;14jom%Brb2or|){HR_x}xa|SW7;C z%9bKMPlU4!yujSQiaSmYzWbEBl~Zh?X;U#D)=~{fA`Lgx zRMxuI@lbF{tYx%zwk#Pyjq`ZFp^e4^!Ef^TpJVW?3gUvEEXzKXeJ1;y4u@0!b7C=B z20$@fO?b|jID4`ZQ?ChOJGY)-FAD!+n~f}St8YI!4FCf$c&uDrhp~*+=LG+pA+d+N zK^xmgQrb$LWn~9sCxw{(LZvU1Eml}a-EY?oK`k1i?XMaDF<)jc#>S4BSgeRhQYMz+_&0f<%*5I6w2h7I61^v9FnA_*4NU=7A zD<(QF%DnN`=0fndvCEJC_P5pvy)cnOqTdMFHX6I@RH`M@ADap(L$E*;Se3rMtwNsr z`pm9=I5>OThkUqzI>Wp2li7|`Z2|mhS8jxdAap+5nP8TbvgXf)e&Il4)#Sk8IpcC~ z_E{ZvY{WaJUl$lhduvDE+NQQO#_rtp3Cp}WsHK;zw{VuwoM(3G&wBQRfCcSr1!;V2u%)nkufo=b*3ctd?Wd{p<%eynd$ee~UnN9QK#d*C zA6UvjTF}Vwh>Wf5GKLAT-*$9{OWPY+hpaP&poQ3u`TdQuc4pO4}yWQ!cP#ShbQtVV|{(c$`gAciij;$7D zx9;RQC2!WoowVY-ByMMv|9i97>k}T>9&cy2jeGOuk`7SVT6Fg_sN+ApAD{X%sI9hM ziZbOn>k;?flAVE^ZV4h#nQ|`t-fL-@tfB!5+4Ue={_Aq?Lrgj#LYQ2u1flyRd9QBP zPhg~A0C!5Ym=7DMn@_mXG4mF(RbCe#W5H%xlHXI0I_}dz3>V`jEQR<(dtL#73gL1b zt+LPoIf-iCbfyg@(3EY>7 zRvyk71}xPbN+a4@J#A|J?uB>d1J^Jg^z+GqPMtCjR#UnGo@U6HG5|W<`~Ias!~81t z{-3is?fGr2nh!OR|0Lds)9_3CU4D~&{Z70zDVy=4e2(fIPb3r(B&l~!h}W*o6F zo2z2aM3WuWPFA)F)^is;5P2aBA%k111FhHWbUHP+PqOY;Ps>ivmNUEH%45OtnT=pU4U@J=e76gBZuuIEa4r*@8U_H6FLPKeg_ z%HBD~LdyMlpvH8z6_c~k>9Ogu^b}epv{`BSdBomUUY?fH@pOCog1``V9pJINqrMK# zSJYbc>}|u&*V%c29n=EWbzMY#1r4js(d<#6W0(#~P#6M2`V#6ri9AVbd`Uh8 zgsByRC3WI+0jsnCPk|PIN;oP0lTc5L|7hZ)257;4U#uUa zPk_{HxxXFiZk{WP%Gf|p@p6NRrE;6|?7b9}o^a3G!eXAsdhh96%>Lt+b(+`)YypsLCGe4tsWmI^(bFdXJdr z=287#e=diiyKorx1CtS}V`y*{Zd*KeI;>v4>>f0iK3=ZHW=k*Iu3PKgim;9CCQmX? z&PSB$+*@I-UW#j2*~3U{HVtu{kN8RS+>_Z49VPP{!v!t!p<$-aAXm!SmJBsTF$q2m zEopT`W}4X|MUSUFvN2jlJ|7N?{OGCoViQ)#G#y&f1InXGEi2M$^7>E~vmA4wXjHsg zbWeFY$73ryK+*jG?bd8x>0d(145-)rp$kLfwh`+Dmv^yL{KG{m^V7VL^3#0EImdJG z@=v|yv0?TWVxldj(XE??2Uhvk^BDVq30pOipG&>(mqMK=P1>kkmzskY%{?I{m6tjN z-Qg(i(ZWP|3TZB+%te|Tmv5pY&u`VV)rTWFRFHj^kSibR!!33`C+sg)508Wdnhh!I zDljRLAL8b`pM>HR{dSQ+5jZdi1Lxi@F@s3=8-N*xj)9 zg&MWl>#=8ab>tuvNj)+aM9R^X=2s+Iag-+v z4pz>--5#-lKN5*JBYnB{$g>|NG+%6Pclp)cY)np{aCKQ}L%5I<%)|y>cUIhWiMO3@vhFRz#f(wYmbGn)1Zy3 zO9f221dwpo7!SYfc7-MI`d_@=^@u(}z`eWIG|n#YCt zMh%?N-dLQ$mAg`dc1&)M^^(ncCoDfLv(u1IBr*X)Fe2TI-_(XsIa}Cs0!<&OUn^{omqYsD))_ z=H&i3hMM0|o-=4hPT9F0^4gp1$7c$g&Z8f_60r@#UkB9zQ&gl@g~STHRm6f*q=dLG zz30c#O)poTke!&vdYlzF--jnm$>7r;Q#&Q)ey&8@XZ)*WB3K^_%r*1TL(m*V6SVjt}^m+9&54)*v?2~)oVRydFny$HAzAo zb!+)&J9Ni{1?$RMkh2gnX#gsFM1T0D;DLYvdzv&Ed^mY z8lkt^b9@n{*vYs3dVevnNXy}M(Q=|4Kr~OhCX^tZT$bDnmc&BkExtJ&boGh0R=gk% zlU7$&MGrA1ZDtfM{)Ga|^E~F)AxCL)R$6BP=+ar8# zOw5!u>1Dcs77$T!By3gQP*MvCrnG=JpvG1GD~*C+tq*uWWYoMX@ECvmWnnJIaibQZ z2*h=X4#VrFjNBM(V?*1$ZK75j;u`zdP4^+s@99Q|#@T$81lDR_%v~1Y8h-ZD^eq|0 zsP*Lk+($e+94sa7=TpKAgMk-~_DMFA7iBM8Xw|w8I;>2GEAYI>>H>PljSU%6P$r@1 z7)a=e!pF;$C{CnyvrL8{|EJBaXaS^Uhd6EBzb1daP&G>C#|_~IS5oeFs6~NQ3>4jj zbg3Jx0Ll)qUCrtGT2$y$#k)=2mm2&wl9F}w7^i5yuOSeHy03whb#)NM@0@b%U1x<9ZdKH4frrGT6UeL?JCFOw^Lw>Z7R~8}FQutt|2-x4K z=TDsc(MjcxRA^&rJRfS}leFHM-pF{JF?Z*8o^4G4G?kTP9SqAcLt0q13yX**zuU>> zOXnY*TK;G{#3vD=oFKqVEbeZ=k_jsNVoKv($p?hbN4l|=@3*GIaeT@d{qn@GSr!XK ztU*>4P)LoWb)%xbifNLLj>sJ&5k@zUsvt?tZ51S04Smbn*0mFIJO|-%3=Zbb6f@w~f zYt9#<6KlUQY}b{w@}KnEv5mTf=$OTh1rvxv}8CNspQE z?Y^sm>9Ld}E0uJR0pPJaLhJ-5BvjvB9u6s!a{4!$)NKG3Df=uF-1(kLcV1o&uUFt6 zdgu=a8txlKSx+?qJ&}HeL1Io`rz-H4X-P03`A8t13H(S3n5`zHu&(_DorauD-R9Cp zCunr%9*MHRc9~-X@bZXJa#^T)iZ~BSd(yS(K)NAiJc1GiIY7(zY4ZDYdYI?gs@{uA zkvruk>?f+Wfz!!EiM+|XV>pjw2fBT@h;o1bfqUxy?&^?3kVxBIpMtpS^I_J7mg2_U zRVfcY1E{ppynLFhJ_FNL;T8@64WIKwz$c@F~|PH#Wev%1?ud@Bo&pEXr}mMf`K@>5t= zoTrvQB3EccURgI8?R-hQHgg75B;hN@edms%wjfhiAS4_%8d}OUj%=*@n8M74Z6h{e z$GC8$cj^MS3>k*7sOmY^pXfhPfS6w z$Mp5E1u;W5=V_cG1fISnp;l2 z=NzY6m{K6piSgBJaX=;&T&XEbjF@~1fN_p&5%#l=@rLY6pEkyPW}eMFBaXPzV5@m{ zekvg&I{{~U5dslHd7lh|t`ASkr$cF6UuYB>;n0>h-lOXqRvI4z&)9ZWPmro9A)PXS zmb}@dR4U_hc?BmoNv+&Z^GRa){z0QLl})vD3H>DH9!_!$6$C`gT>G)h=d$;1qkWJ; zcDKceM6o#E4!!xg+MLB!GfBQ^>vEufwH(3=Aj-BCzzO#(MCVo`wMl!C3FClH0SI$7 z5)2CjB0Jkc%Qhw&fo-9t29LFL(#wwDZ3qW=6kyEWiHOQW;Q(^X(K|#>6l5}csPAYv z0}ttlhcX9EV_vdtmtI6`#SyVo{FJ*96XdY-c8Ku`tMMVd=P1f!x*`PIA}xm6uMUXn zzQp`3HZ9YP49Y06W5UtauBAA`o`QgM+t|>GygP@7AT`iy9_0741r^H6^9~8x*bkfY zgN8Tb4GkUGsx-P$*FxpZ&||>+q(vLgp~ylG4zDnH$>-14~SPk1AUDP zt3nUCi}jXS%2kq1J3#+tQ?h=z`6~{0qv7W^TE&Z3-e2LwoN)XJrUDPL6Sg9U1j>X7 zt-}`-JLNG_kJ(=b69|3hsgDCtzoA6AeR1QZAr~>Or!>#8B0Z(5M(uW0;JLrI32pK? zN-U?2sM!cw0oD$X7xEOsQ>+!T7^uc}^{g3p5g2$a(=SNWk&{!`&3IDhFfW|2cZh{_ zvYN#F>n3!Yw|5U+sLv%lyD-?Q>F~ijJ+6c}Y1fOgBHd=jzgy z*b!JK4M=`&Wmlo)r9rnC{T%#35PIjIX|EVAJ6JN?Z|8BoFKPv`&YUOgsAuue%)t10 zJdk;vX^74Fic>blpT}_wvB|#9_VMyEBe0?;S%fRcokj5zPi2i0 zgdBCC(QyN9wv|fbx%zOJV^9?o}0JuMvYxRuG6*+59ez5Vl9;x=i}d+hl5bE-_)Z&56l^%rG1&z; ze@fwcEzw$9o!gZc5MO~lYa+5xFzdi6JHLY1*wfv4hO0kwade||(e;)uiuZEdyB~)R%(!$Br_|g5l0xj8 zCFPehgtID$4F!=)i^Be4s?akq4x1BZWMX);!3_DS9>AUK1lwGF%avJotVG zptURpU1d>sepK}>b)v<$?#@j3R!T*e_K4T=tGejgydhr|9-x&53n1K)%zIv%_o?N5 z4)IDt#()jc<;Fq)0l%E_J~#j-U1y4Uv7xe{Q``A&HN?GO$XGS<2JW|#)F`a-w$%5P z9aD^NYE=uErP&iB>akIc)Yq98fruy)W{6mVc9uX2V#*Y) zaCp;`lEy6Yn$byEfD}Ok4XeGf2nwDJCel&)61EQ=SHa?tM?X)=qBDESp6)#COzw>M z=9)kJV3>=O+XIBbmyYS`knTD=%vD#TF`Tx_6G$%iV8fOwib*QUEwu|bhWUt30sDKU zp-E$pa9WwEIDe6qfhp$&cuKb089dWABeGab@S(s`FTg4Z+%4DiL>@c+S@khD9xxHg zwd3xmLJ{Q+VjG+yFV_#{euIR_WRb<13JS+2fU6#MlTz_HMP9FPPDE{ zhfEk{sE+~<*WrG>Weuewa#v#ai^bAeer|6|PhS_%ZcAHBdrL>JIh+mYq3L7N$EU}q zC#9Ry=cE^=&kc*pT0|OT%Mdj~rrNnYqpy894iE6R-Ql2$sad9CZENW0=yt%z4q!z@ z;TdAz@{%;JwC6qagp3HU9W|~fmZGaSy&$gMOv!0J6v$*$=x=jVTU%dqdzTa&;ggWa zHo%LR$+igB76`1EFcv(<;UYP5ztI50Nh1h#2r+kN%Z4crG-E6eLB{N-6Y7#DXsRCB z4Q@mEolzl8B<~J~Pt_{LwT1b4cCW^Qf+;8PD3LDIUq9d65qx(!uVrkN>RT@inK&nD zMw!9G@grPlL=)u$LSiKK5vY}>_$*#6fFcy%Li=l^y0b$L3ri+^(=SvDm}VDf2#s{q zI-ibF7vt((m)2+07O44v_jI=7RGW^ZW9h}|^RsnTt|HRRZ5CKo!y|+u>BwCmN@)si z{}!XfwwlYS&H54eZxix?F zdK-@AF`mscQ2%l8vsV6^M`Zqk0unp*+k=L9b}`}yg8(m(lo8?}zr z#1Cs6(+c?GntHwxl+&4E_Rlfnd5p!xfn8F&JqH&8t|SdE1gYv$0CeE(Ry@}<=v)#y zf()RGNE+th89(&)X?bg1>5-B(`?6@poM{vb37*I%mui_A=qkz6Ya@Nx8}Se5c&q!8 z_BXFDQbOmazl5VHd(vb^BlgvQyc~-B52ThX=O$c5C$u|9YRc=Ylm6XM2f@u#fa`EL zbk^YjSVGUrab@4C6qzmt{dYtE@aCdz=dQz88E?;aE>4mujQayU)brRnF1|%81-??# z+F{BmwnmPvK6c-R!jpwAY7>^_{f(ph*^6qld5N|-M;kCDTeb9L)AqV1s@mADZA2?H zwWhf}>qusrN5WUC@OZkw%|w`f<}SKEd^Trqw| zhu_9}N{kdl5P11s=?Lc*+7y0`mDtYCUXqhddM1!f+zG0n)954|ZT46sJ9qkGsHekE z10EA2L)>XhWP*amQA|jx*7-5|A^aGvtshA(_A-Z#>Ai1ph`AaOSJLlCY0fY}Z~ko* zTY4~Ki9m)UAA_RQJ;li=`bO-&){=W}Pf9Ung&)g3D--e_U67DZKIzm0-l-_C^{0|v zcJR&h^27E+ck@=c`>h?iPZ+Q&W^Ac{U~gx`cTTp`3KwuH3_@G=8=tttOA^4$jiXcv z%2vU}1p?Gl9A`!85d(~?EyMUwr~{z1Fjc`1Oj$eQHB_HJ#Y|9y+x5xn4g&_2UcsP!#=+!#YKDuJ>9SW(v-aDpm`|KzRRqL_uZ1EER)MA-(7~0~X@s-X(ex zwP46h z^jlu9i&6-nU}{`V3@F)QDJBHi`t^f3Yx4v<--j9mh|ktv5jJzcu{oA~DSJ-0mEc-!u;fnGpgaC+u8M|w)RwYucbPaJIYcJ2aBGkBXz&IeBJ#Q zDa^G6zZ`K!0h!p;c~h43ap`|%%%q}dt(tV%WrKCs5CBx`IBM!ZQ{7AEkaBSKNY#Ni zZ;ZaG_`JstlYhRikX=&qg{g!3{2DrSkVn^vIC>$jUirCUj^^OKdu)JUo(}9N;U{lF z1hDv?gL_4#<7uf7DW~CzjFg&fa7v-oNJAT1xz);}*xyCf*v}e3Lz>BXhJuqiV?EpG z!e!An<+B}GXV#USopsybtE#5F4(h(bm?#@?BZP31CNP`2^Tpvnp=({lzoIa@p>ToG zChytfJC7?>#U|DSFABIfD{to-#qNSiiNoEiR-__!rP5(h%Lhhx&di zwQq^wtJ!$lL`cuMPS3$#o~Cy5;D8Ckv`Gz53^lrF z#9#<#1oiXcGYT7P?)I$YcR1Yh(?ilD(qq!&(i17{Jv+T1-I{JoFH!qeB0_udk^{qT z^2q+^L#c^;H8d7RB8wGNo=S%;?y*Gdv)00A(2M+7=U*2M66O7N2zm8G-5&DcJ$mH* zp!>fdc{#M?HzsdOu1MZR9`XasQTSByx#Ww?Wfvh&e!1=pArJd8Ua~S%bH1gZuOdZ` zIm%Hn+V@TsOuM^%M+(VsVg#-edSIDvbjl=h<+8~iomBoP`VgKUY#%0(;fC?@oRCwI z8bLki)a|B^B8S3!Fh%ZI8kT~>jx3{B7%r3~*M3OCfh@dp^!10#B^@7SNFIOV$y-xy z0)|>(Dgr$z0aL&z+=rsUDWPTP0=S*{+B)`JnS-XX`HE*XM~~z~qd1VnkDPRK%*icL zH!xljh@v9`tRRL6&*XLW;_j1RwsI2?F^?_E)h0?xf<%f_wN{~Kp3>DBqSV$^p{FZW z6$%+x<%N&^ks)DLDE zH18gu9`%F~)b0YuvyF+t!)Z0mFKUa@CZ>nRI> zhQ-=^dweIBVmK=qV)_x%&vjk0xDS%GVB6L~WZ%WqumJ|$=-EiOvM-i1b(oA-X;BAi z-q}j!tFCQJb$xnIpwf118&eM_q6z?BJhW&{MM8!Ro?+*^P)?#Gjuf-b^%U1d=u=4} z;Xx+h4w1tfGc2xY%rcJ!-&F6VO61rV0JUB?rPvESsI_UE&@qa?+WA)VQYH-AVcEzJ z&k()VZf<+}a))wyn^%(DF(64lyFX`tczcPd9G6{K-;#ItNz+z(G9By!Z8qCaPP1D4 z8;qwtP_r)1-WRB(5IbvB4T!BP zoL1>?g+;AMqiP{~!eJNebyk_-l?s#pP?)%rPKsV5EH2;#vB{n^`J+?IA5AAYzE$vz z1&n6}iaDZE1hd+Tz|d9FovGOQtVnHP^+YuvaMeq>b`tPiGBp-ui3MNZVB`@$%4aVC7&f&wC-LKi6H;8H?7}~ytM4v7qENGC# zc^+sX48@sNL|W+Kf=`jAFWg)IlzB5BY8VC)f?F@r+9vhWyT60x&o zo|~TX^%9P)Q8;eS!84na;l+d=M_d(VZl&q~hIUSCAuuw}!vx|;Yc4pfVs}nemR*N#iHs= zewa`Vhy!5JPBt|;)|E&A6t)YX5Ej2iw@}s1+)>H#3&X;4?Pk-+NJ$wtpm}W(U=Wpo zst(OvB`p_?q$-f3Nq^#n3LTxjez?pzjVW=7;0wMm zxs0}W(d1)!0CRF`&@|olojde+G6^T}XD~{@&$@i1Hs5hfodh)B}w{RPN zpZpjx_BKYlw~J}`_Wbk(>NTETmR_E|)@H0;0cG*Z^s4mT z>3h@nr&rS^`ug<4=?&?}(vPQ~pryd4831%^`uX&$>DN(&-$}oh-kJU&{b71{`lIy6 z>Ce)8(w|#XX|-ItKi!f3F8w{t-T#JKPo#Wdpy17o(Nm`MC-G6YW8F>sndYb z)Nk*MtSMWbwZx)`y!T##SY?z+{`-f*JamdA4WxegoN40 zvX5t<$ZoPmzMsu*&2G!SkbOD(TK28%+u5Dj53{?oA7?+w?#X_h-HXh=Kgz62?0hC& zNLG(RHeE7L4yS}u!&8vW)^L`|Srq!}f4Vcy4%}$>zU= z7ljvxOT$aTOT){;%aPSrhRedM!mGpO;Wgp4;dSBl;SJ%9;Z5OR!<)lf!dsE$x0@8J zL(~V6;Tw?KuOY8LM^(I>eNB+ovnR=G3F*AhyS1{+2@e1uO|PId@cDp@^we@ zt>nAO_oAHrL_?Da70PlZDSIe+B>8Ldw`6Cs3p!sdK-e^Bpwk(v*qH7|^TavnTuAxz z(*?-f{?zC#qDt>zs6vM!dyh$vMEV|!{5?K>A`*CfdIBY%2bGsrg%%o|B%-_{Q_nXQaH(LjQ`4?wUeMz3Wj~QV%Z1Hau1dMr8BY?6~X%r1KQy@(iSL zWwx3wnCgMqh4igO?#fd4>?n25$;M3bwr7_hd(X?BpS?gW`H{evB7>Ki^u0EFok`%E zqXb@+z1Jl0TIB6V*-vUxqQC*{(`F=MYj{o=#X{{(E?)RwNXBHjxB|&|ckG>ZZTNuM zw;P#8a|^R)?y%W2l8`@!zl4X8kFph$4U_#k7z?&IaqA^(mD{RjvsJQGYGo@6mG`e0 zB8HGiye|5##?}(?r+s^-* zNfPj^C=I+mWAdrQgQxeb+4C_mQQ$ z3hVci^rz7R-iu`YGTK2&*KZ43_=hR1p=51mlr{ifvx+s?#k#B>+t`pzH~UzYyt%Y7 zou4hp78aKBAhVT+Mp-Od%cC=wO1GJk%;T|~CuGZz&y%u~_i90#vlSDpXdCjoH#_?D z>^#OtJTrS%))#H+09JJfySfp}I-EV*tm~F+#4PM{ve78*7iJe>YbVP5i=yq7H>+q{=8Z2FJ@oDYX5uomF%n8e_*}8o_!AJ^vmM#*vfpQa$R5c4m_3;N zDSIgUbM}|);p~y@ui4+So!PEzceba77Uwk?5zk8rITG^K8C_OuY2P*t)OR|b{me#YR>n4yy(L9A&!m8_ zuVPx$=46Y_Hr<*$CmBn|3x7%-v{Wvjc;`hH@p!!R%8H2RwUibr;(1f_xRic-M@8gQ z9rt{Q$me>CeQvCXer`%WIU)Y}d=UYCIr;bGD}}%IjpUorXZv>Yox*SX0d~&Y*!(#8 zN%GU=XLxZx$B+Ak#Z1383wS?~(|^|n?%U5h1W(WH-w}9wZUN=*9fQZ`7VtQ{zG@p- zwtsu`{Br9zmG75ZzDn=!0`vc5^|tQA?g3HIHsn$ohrE>5AuqSc?p5ilv4^iAzI&ZT zcyCPKl>Te_=JYLC$hW8OAl`ddjQHMzy?kGc`u@3gb6-~TpKUY$XDnvfUQUiT_hl_B z*&ZJE|B*%fpNmyw3x&wJ zHGFTFY!9ys*BeH6qfOTQn9bI_3B2y+@F|}R@YnFS0%Hiw151-EVuEgQrzbO#nMtFumUHXN^p^h(3%slXqxfgo;PWO~;X$S* z+FbHvIC*w*K~iaxN2{#z_T&=7A5soeEKMoysy~!QOo)5?0*tTj+Qh1 z>4fOH8cCi9KST&}89zP@j)<`1O61saF^WRAa?C!{q;j zjek!O6Dyl{J-Kd8L~=w}QS9Bsug+5WRl!gZ7QCk_7IoY=M|~GZo9X%Q$I^8zM|+PW z6Rx~pWptV2yLlem(Ou;Nh3k4Ya4J04(cChY`&>}m7r|9=rpjxlz-q4|bExR=TDU16 z0-?RpSShkuVx`=gd_MVmaM-C(SjS+MQUC8Cu;qwu-x#dpuVw7jaaYG&J!;!K;_8|9 z$#`p?X`c#h-2ykP6tjz-Tg)?yQ^#XD!uophj&C${bt-ICe477VT=lD#i~QzZ@{r=- z^!5GI%_pC6TZOH_nKSW z8)o{C<`u;(P*(9@D>90nPkc{BCh>zs7O|W|oQ#fsAye+qkBI;UZ*T7i z-2nv`B4_a(YaBk;jh_2D-LhV18Goa7@P_iaxjCA0zVU{{ zEXa8U7ew~Zm~n?LG%mq&jW?8Y2&(yeuSLqm9H`_COwAg&7CxWL_$Q3VcPkt|Np&S3 zpwe@@8wQeCeR=lZGye~jGy5^Cf7}F5Z0}k9M|1kFjsD)8{y&z_S2n-Q(b{(&KlkbO zmBT-Al5cl($>9>C*Z(q(0T#C;7?`G|>ZJoK`icR$BUI`m|@A&#ue%=3L zIrHf0Wtntz+1r~LCt6PB@g0~Q^ba!3rp}j3ukRfZh%?g7SsshP9#UtQ{*Qygx1{e=3B#mQq5_xX;E{MVMqX38Vp9@ww$=RLE6za)Qe1TL)C zX~^4ChV*%nw^W%Mb>B~Q8ni>V3XQiWZ!fq?m3h#-PQ!h|kHV`@^HLDF^E*H;W@}-@eRctT84k9{G%#2Tz8!Z z2fUvK44W+y73W7xSLF!BbXA7XnXb7H__8Yh@6G93Eelw#<;Zo^_0)3QXx#9R8}s!u zMK#AaET;S}^&EE`XtX|FG-d*=@^cvAtDmk40e_^dWnuGItHE~1pc=%EF ziZruo=pJRSSS8V*YxthsbM|9?|8N6f(` zYpl*QugsoHooAkLJJc$&mlRbR%Cvdy=SleNd5%rB8LG@!ZZ#RJtrA0Z7^($TjrO^Q z^G=mb6US6&@9U`b6sGcySjG0CqBh&H6IDWpwfUb_^$)6O%aIb*vMsV&Y*n)5_-&ro z$}8H=DiDqw-6&(X1BTwJqEog)NbMVnO6vEJq51$-0}~P2JFP<6D>uuYwpU5Z&wj*f zH`9c=wt6Zyg%2#UDu2~PS7HO@nrPtx&rF2|#17p>4Yb#d2`}|bjjG1vF@KyYG53|f zNJW_H!Mu|4uByuCUzo4_YpbX9%4gM7f{MnfE=NQi56x?w56jB+TB@JiTW$05Y?W0} zma`(~Q@vcqL-VLuRm_z&R;sXiZmg%wanZcCs`I_`*BQT(D#f^;BKL8NRgV4&Ntx6KgWTnnX@1^s=DaI2P-{|Gnzd*M#wrB7s}|7Q>zJ;y8Rrp#M8uUz$9i>cvK z--##2x~(S_HM}dR$r6U4T$SUv=NJ7Yob&DYMc!q?E3SmxzSNo;zN(_TMBZECUG$Yu zZIv)u?o2X6_&gy+AuC^W&H(Cb@&sC}Sgy*T$eL`r3^4`i&Uc1wLj5nXY;NT>N)W=I!>tD z#Hymgy(i|ZbJRi^D(T<6p8fLJMZ#;?Rik<>-6K9|wW&A6j8on{qU^<#(TcB9g?c-E zB$Ru)vp^^AQ7;LTv&>MxMRa%Ze6YGlsB?s8fj1UXmgjgs1mnfCyT7Ini$}Fq!ydb^ zD3`06MnC^Y*!j=dS6l1t^Ovm@s5Of)>C@X>$4Yek`6~h>J&X5EqQ#QCB1u72ZE`)sa>+6XaY@#A|~*vm6aZbzdPxl)v<&= zIYs{td_V6y&`vLnU#PEzx>3;nYlL1+v_-T2q_oW9;hMsJE7bU$kzMqr+FBYN*PG(h z#o~UT%)>(iZ4~>hvm))t&IyhA1hQ@Yql0?+X{bD!>C&#|L<-$so?RXqnmapsdYd|W zd-z(-E#vayJ@nyf3wCAuBJ(y^-qjVr)NZai%=AbTxH1^>%jiyNr5IV(V~lPfKs#sKScExoHdSM;rD>1pn6?c#Uzt9nzI7u&2>_H@++D8SmCw1-)FOFHjn#y2T1bfaEK z?cTEZI!TlM0kwq$cvwh>=W#mu#x_@6!FtWwRh5`{R!CZS;J_MYboHCX5QOR{v{<$A+13VSl9Qx{Yc}w`P2ppCg-mOgrJ&yKE6rvB$zI)J1^I?(d0# z&bJqy*VWy*s=KMZudB1QqqnbXb(1~3iu0jK6*>U)F_nwDCN~dfL2^xy&O&ouloH{ZI>R-G&Xk zBh2V->1u0gZs}`p>f-Oa)fA8UwDe6yB4{+bqNTZWMN8kB?$+kc_O8wj=9uYk8L9j8 zu&AS@r?+KA-^w)|%{sw-Rr(>6l7$?=#;OMV+=AItTlz<6XQ!^D@x54z#q`wfYGce+ z@9OTBp4FXgE9^eC?CHGL72LM9_uM{I-`bY$9`2WlSi>~h0wN1S`R5eB?+o7X$ zCOzeQ`$y@_XIG&~RG8ImbD(t+&U@y0&*Z2s4l@}$yLFpJCk^#)u>or}XVDLxzp2C7 zP_pm#^h&099jHfRk(ySlkj!?T#ZPX`N_t0<4;uEX=gZ0nk6YNUH;Y};l%N_}j&ve_G{gc{~Bm^`HqXD$3i zZaR9r`z(J^OX<|x1WshjLT%5cq0O6ZK~1NYHV>kFdDS&xmIi~EQqulQ7E`fQ!i<&? z^_aD%U~krk{k$144JW->zitt8m~_4h4a-ZVaoH~^rDMVsgi0k0wLvvFWAjOXsxg)T znX@s~a>H)5mO1yC(e`oBr{Y?BOPN7yB;$?QUgGUw!a{a-AP-PM68%!vc2%56IN zs*yG*=Nhc`Hl%GKjv`&-aptyVuL-ltZ8+6yoL^_8duh)XW=03X=Ar9z^f*pys9V7l zLX(nukWO_U!DI{_c$m0?^&E?Edb$}E*KzO3Mxr`-VUA+*j@2PBHj=m8~ zg0oG;*qU*M&bF*|j;T48a4SpmBV!NVM;D~uM=VT8nB!oJEXsOdATnTh*b^q?C}zIA01{?G|T2?kK{EE4^JoXotDl>XVJ)Q0WI7Pv^kGQ z$4QT;(x7d5x`M`RXA;16r)y}#)|akNhtf^?6v*_2vQy?Vx6?Ej{V3UJG;8Z!|735a z558=^_+J@p#wfCZO|1V_A;UiL^TQ}J_@b53TcAZS^>}LnvlQv*h|ocQGC-Ml-uO$v zfZ&|>B)1{CPt@oIZ;$RXw_QFLqXIR}foa&*SDa<|R+t|Bx!n2!Zg9{`J=+F0MJKCL z*VHF(CY*T~s`nYRYwM-ytvuY73|TYh@-T)m(5`q39vb5Ha5!k&h&8e2Vd&J1t2aEh zB~E`qq?iUUU4!bZvo`^KE7!Sf0B~s{{lWB!^g*2_0u&r#|^hEhQ^lN6Q<)K z_q51c=+tLsCrt&8jcS4se|8!kd_Plz)#{d?%)FWo7F* zEYlBZ=&kVxy_yhS_Jr&3&q_dX-%5Xwy)evNfr4I6>^0yISQGw8aQ@V+6zVowmtyWx zi(YygZrg9@5nd;Yx@4K|ooq@mv8wW*EWTBC`Pn{6IIX~eBEpB@xy z*E3aHCu{{5oc>SiJXKjiG%>$%1?FHSIs`pI{Cs}4CHCWduJz)4b(q%Ow60H+TY0Js z2kG`zd@&6oCPImCuvsbZ zO5Sa0m1;1>+tA{^$0oFDrDW|H)bKGZsC*%xRkCEM85pVs-ZtgeC-~Q| zJP_v6k9mw3!2i!Y3!O!p4qeIQW*Zz)5uwd!ZYJdFJ-4gHT)+dSyw}oGb%pRRdwUfB z`c-^A(`|Y;^DX>%z(RjqXt056QNZ23X~5H@S39mJa`-;SDdG?2#SOcKKB#vTnxKu% zSjR?)hpS-|SK2JUB?AiTap+KHoTt|@y3|7Nm91^PE!}!*Ox~g}v$dzsoo3=Zes?X} zy0g8#sk?R6YT1ceT6D?!OIKtg!zDgCG`!vT#4X7x`lX%;-u8P%)O98 zJsIh_fSlIWICu8&>@;w}I-jz^b?Vadva9Hj_g*1NVUA5GFeD961m_U2JIq?qva$)U4CicB%Q*yTD3n>YqLo2oW=$mT2(uZ7 zv;54K=H5IAVPQTOW-@|Y_O?WQ9<115z}=vEk)XN3iQBc(ncqu$5Q;(QW)O?*`w7MhKY zvuwB&js^!@rlH0hGm?m*aclqhrk$;n|h{;=f%rBc0_t`Js z?jAx)QO_NrekE{6XZN|>t%0t^N71Qx8En%MoYL*-3&NpQSn&j_X#h?Q(yh$bQXdpC zG>Y_(4i8PKhnn`TeqtHy^xQgF;3YtmX>%?LegY^Zbhu$A%bToBz z_JCw`tmxtKQf&A!q3$``N&w8PUu|GgZ!ask^Vrb9RP3R#t@ua$um(MInH|s>TWm7#%H6VX?sK6g{@=E5!8Kf*zXS0qJ467mXwp)f1-5_nwSO;`aQ{6 z^nz7zcNl>1{stkteat626dvu}DtHRBfJi#mH7&=9Hrh4EbBg z=ou0a>Xx^5G}->7^x(TD%v=swJ-S_g69KfbWE%s2M+PUD(&RE+p2n8u_NGczJp-}_ zjw?ah*_ODt4`RVHv-3m4%1*$Mwx%9V%$^^C>KM3U)6W?kg4Npj>u`YfpQGe*9yfN$ zQhy99*q&jIuZ*2-(Mbi|=6ce!;Pf+@MN$}^n%I_=;jS&+-8{oeUboHvxAp1KI6i|Q zYes(D86?Lp)e!+*tpXJ_DGb@#CYjMJ8pql(&1$s|YAMJ&KOE_jW-vt;wq$5YE=el^ zIW(?8AMyuj_)}67=I`^{Y3zXh#uS}gYGTpL7+m5r9CDNpd)WXC=UzNlo`&&O$EX5cHdtnI`-IHy%u#)|=7dwN<| z0pG1||j#NMZ*L%T_s{ie!PD;U89n)B-f|j z@Axa6ZsoKdK&yI2--D5%gK)-v2xAMGWnut0L>)}S;R@#-jsc*BK; z-mLJYVSl#_nis|Rz4h4I0>G)U!5)ueB*5HNq;`N;+gp2EK{cgo?1H}%g(EZ=z7;iP z9bNZbSITe8n6sl_(kA(a?2DdOVSW{fFwWc7Fb(e%jof!8zljkt^S|S$T6W;vaO^&f zg+mjrJ`9hr>&S4}6Dxc((7LCs(~@KgkyEk-2ERoWS!ck?N72ytWcPB?&1d2|Cxf7T z0?Ydiny$;%{@PR4xD_I!mC+Q90TH4yK^AU66^LEKirq@y zPt=y#6uZwiGRsTC(tW8DUnVNhimD=WYP3auC5^*Mr$@70`&p-T}C1$yXH9(8XF;hBv%9 z95HF^`VzN$dPHX5Ah>!A+CCp=ZJ%fF^V@@>H>zjE88ic=^SIUhx_Sc7yvHEJz(ZXZ zj^BCD)Wa~(;Ve$q0I~FL2AYoMSrc=1c)8t2g!=x?Tkxy3gToJ;`_@tC*sD4%nu0|Ca)3znZL+sKr>a8dH;5- z#+qIwi2A^g+eyW+D)#}v509_q84YwG>PtVyUC$xvBiJOkDPw8V!+~pZM}t)}|5Pyt zhtu(rgt}KE#nP6opn;?LPo$im0i8rtt!t6W>+m*iv0)+Ki;@YgYDz-Yyu>M0hs0np zZ+GnksV1$Ov@e#DnDMND}VN4V-)kO?48yhdelxPDF zM`@32(4j+Rv<-6rHXYc3etjuavu`^j`nJTY~aGBalczws_I|L%7zC+l~P zkqXMbM&oLB=YG=SEt_! zb=vZdReTNu#LUn(@tZI>>JW2`K!=Y6S~yjcW-r` zl8rKZ@?H~hB{4Kzt#|~Jl>J&R9vaw&?uckUM`2H%jgWMpoh}d4L`#vn;$db^mTedf zjEf1=g>m~7OMX{_m#ft4?H07KJw?#Mm-T4f_Tl7V2s%(`U3tfHYWUD+KZFd<1fT=?p z^!BY_CoT;&@eS+YT>cL2@Kn0mY$Q1|#~FBS3bpz-M_)J$qn>6UWb0OTU~^i82=6>6RTIxZ}1f$ah71Fq8YrslIMAk9ZYoy(Z+ z$|3%0m}8(w-P- z#qh@AaoIX1?e+nfjhQta?;AkCbrNfm20TCoL-qEyb`VcAPfmOzansw$fQ!AC=e>!T z$$Bq>6QvyY^#lw*k8`t>(e`Zi{(vk?p#q+tDRZ6AzmbnOhL^Y9XUUPR7EU)NAh6QW zs!5JW9%Ihd3?n8MOrgh{la(2m)ekmCy0g&5z+G!|FdigrP}$kXVtZcIBm2W) z9Gz>Nqc?;G(zZk*cBXc|FwEGxZ9QfZDZXj3+y6XP7k)cRCqCDUVzz1cv~ zILe6!2PBV0JSqvrPNy$9Z^A;NVV3t|)NV_ASCLC)Zfo6&&NX0g_ILz_VU7bf`O1&E z3+>I)LhU#YEm7EnE9+KKkgwZBLA~E#TFmXSKI*5@!Hs-rW9J>h<}I-x^q69{i_-cE zM9*M~i}=x+?Ui>osGQHTx6bg@v%e-*b$CrjtmnWMT^G5^KaOFn*JHe-@LcVjdnRnj z3AQTVO709#bOBp~xSqlykS5%A#OOd+-2; zdYGomQ93kC@AFh2R-4}`jiJ0ky*yfQ5PmWYo72%-xJC6G!G4~^E(xy!gcwJl%o;oa zhTrj+%fB}ZS`Js03-#6y`^tw}CKO1uy$fCutisi}%6b;Dyu;i)h11sBA)*70t6HEILMDC8MfGM0y#XVN+Xvp8OYWJUZhe57%+ebGBa=85aDO6x<-+S0JL`Kg4_N1%4q{_|xvit+CsbhKfuJELg#gNtbL08M0$XUGrqWw!4>v?(h zIu_a)msxUVI-j+ji?`(r>4G}RvtB5lLotZsR6KJXr?`m{LMv_w^A%1_X$l|bZc`8N zdYOo@#H1{eJjTjLJ57F^+{0{gMId9H8yG>237gkm8Yyiljc(mEJisM3_uwD!0E~pi z@2y{7DlwuNo_<28agzB)dQP3bsN+sc&q$k?%IrZOf0?1>SYAZcAme=Ay&qO$GxFsX zsX}(}8en;1ucnc~NKdUvR+5P(4-L@Rvd;6{{P`K-U{KMI`%&U4qitt5 z5EU#CMF(BxKtSb|sDLBPmo>rAROL@>6>IbjPqPG0+K)Kjf(q3T_Gz)X&8ul$^BziH zZcFY=ms>l(*JC~(pv3M13PHqjzrm1&+wnoP#zQg>yeh4hc0>a%{5Y zdk}KojxY_P(vbXbgtD3V3do`&zS8yY%zhm9?>V=9d1qUn0|0`QCXlOZ&41*&L^sIj zt3YVPfxILA337L0sM*G%`*}QdYdCsReBC`{&a44SYj8Nna*!{xsj@Yp!K6bWtKDOV z`2hL&lv47p^j4@+Mz1RfU`}yjR^QjdtO1eLlu$PeoShvD^NCY|(jjSgAujFb7>>gt zEDqCFwsqorTEtP4dSrf0XyErUflE*3&mVwWHCo!H^u*3{9Xql*7oT3QM6T^JRm_jds}Z$|2EvL7Jg6* zX61ctfy2g2@Q!_>?0p;a%N2WOj)NyS+~?pDi*bc&0n(Q-UQ!JW){$ZEXLRHc-hd@O zEcrf@5;`^h+zcsD1@7Z2JHwK{2H)LbrCsNR2Fpx}_rU#+$0l3#kiXj4k|Kw;p1V#Y zL6<4eQxl-`Fz~lZo&Ll0=X+E+HzoObNeme)acTvRn8v;Q?5 zPWJ@gyc(mW&a=!Q%6|g|VCdrfH$u8@=Qq?_!Wj@yY##wCvghT4RfP239!`O3ZzalfX`|F zQQnfO(2L8|T7Ng|I3DKqIj>hRM&A%BaKwGTF#@Q%QLU{KQ-c`b^I%F{&Sd(l{$HMe z%W{b-gVHMpAX*XXk-MxbehoG~T8@@c$xpv_DnK6k+odAhDj9PNPCFU*-^C0C=F?lX5jn?Mq&2s)<8q%er z4b~ay@OsYlpDDaZ?fBG(i@+4^2qk~9PZe#~g^T%AO!9~Avt{<#c0Lou>|-3abm@tF zRueAavya=qRgzc}p3A>KVgD9lSreYezi+aCi*j3IjNDJ!zh#DM!VCCbrYJRm-m zKgGZ2tZeG(Rh10IBz>#aG<5?-?)*ZS6%%`dZj`u0YJ<}!lnLs28zxQu+X494k1y9b z(t+pPHnd?J@f?uy-4N0fv_dsOyvxt(c}(nT!lnFMqL-eab*Tw2;orB~zjcqA@KXN$ zdHc7o$IJNlZT4?pkC*fBFWA4e9<|{W{98DUuIMWw67rYr-@YQ3@o$;!^n_FG4q^s> zg?~?vz^T_9dUU_Qg>_ADYg^BR;G*8rLXk=j%atfVL@y{kD_go-I;cM@fL0^@&s9lY zQ+JC;D&qMd_q(aS8c-0x;vX66%m*brAnzC@pfK}H@lOGYC)-RXdcFn8i>tu6qaRwZ`sI%r(aX3JjBY?pw$A$-r>{H75 z{xL)}v52ZTio}@WiWlC3k;JEuK>6c$t&>`e)Y|Lo*P7|>B&GqXAW7tKDzY#gzkjF;V!`mm z{QFCx4m#w@R)w;qJo{M*eA|`teBW%>c|@G!qv9KlavO?H7~s-{4>cBE1dx3e%?xN+ zWFD0KCzVuPMuUNOQ3emmv~{GS&~o?ZSkB=QSS199Tx%MU=S?;w{T3UM{)Nz}BV2&j zJn&yCN^733x5OU(T#?vT<$kQp-M4^CeJRwl{AhSDqi$@2VX>Kquv{`P{L^qiS7+Cn zHf69KFkapXRj3!Lt1XQ(^pV%xa-pgeITybr_Ufk4)grkZj@bE!uuzFc+uy#G-JR`y zl(3TD5s^+=ui2qNXJb@JbuRKH@k>W4atAe#6y@cn={?!&@#jfk_g`!vHxJSX;!T)I zPMVy8mORzm`7j-}-KOQGLGLnfk1CbM+lM!k&#$N`ZRA7w$`v0yZc>=MVrXD<|LBk{ zPt4<$17+Gxl9S%AX>1(8o@_N9JMNG@>qp>&#@Hhl8@w51?CmY*$x(0Z>8xk60pG;TF&b z5HMmraDkDXc*+bQgH9$vi~;xpIb(ojIhVMey@0nE)w6id{6!6f=R*KWIzxRQ`lsKT zNThUMs137)Z23v)S+kO2DlLPOH&9*1`W<$Zl1;hkO*k0*dJQ;IG=`nsJ@$JYhXt)2 zO5^oVaE+@*LGv0?Ro$G)7lv%0L=7^#UbBI+IR0xaG)UqweBL|&2=Wd25={6q;)6ZVhi72S7j3=29x|TSdiFH}> zzleMD_&m!p?f-i2`^mmE-CGvf0tkv@DT;^)X_}Tm+mxhfDTpB?X&XqBngyuKh>Xgp z;Eamnf{KEQqBx2o;~*~JhT`ij!!_dU+@y6@+Cl9X|NzdwGT_cO0F z&vxI}eJ$sCoX2sT=MP@cN*u3}^GNI9PX2!iGp(lFYPG{UZt*u_Wp=_;5sW}n#f_%6N zBa{=tum1*fyjr-#i|vpuoX){iMC8a6fUr|X{S{=-_LRMx*b|(q+$WAIEQFCh4iaWc z8s^7fZk%U0VL}55nka@XE`tL^ZmKvwPfXWSP_~^^7X*-pVpksQp((3%7_!ZaY3lh+ z9W`LE#&S%w!4WSDn(PtGHE$W)E!Uc(fOe;90_-0k{>HtDT`C>u*B`44*%aIJ7tTf< zP?=W1PZDa+8`?&#U)oAa&gsD5^ba)Zp7FSu7#r2i?!7%U#wn74lu2O|1k-AU4B-nu zS4^&pd`!3BkkXw$FC{o%RyY><(t2u38=*PM%=Qvf)?I<2_*F=nzEJogHsN1EH+M(j zSEQqj9yNDlX<3!U&PLS?jr?Hij;vmuCnX+ zusD|X!0UlnRBg#no!e5psM$k}${mY3(x#R?1*9d&T?LXop?E&*GG8Ta@P8=j!^DW6 zthR{x0XlR4p3tNQi=g;IOSsm)^x!xWCl@4i+syrDdwqQeWC?;=kO0PvLo|7u%Mz0$ zK6wbxY?V4rzXWNCSvb!9fijU?5X`k`%bwZ%W^MLQhL417|AACuwRrB z=8~vl?e5sr&52In*WR(-ZCa>7)Cxt2U|AyjrLbhi!f5rFNz6B7>jgf^Q&q+kBzZi zo5IRreiIEsGg;@LWe^eLXV0%C(zo-NcQk455+xooQP=6c1dfz<8mDbW4d9C(1KE)Q zm}m-YO3BZWOEyVw1vu)Z5$>@k)Nshkmqg=BmGGu8zf$E>A__H@gO0rYYM{oH1GFwG zsNMHfz6(c~@bM_d{sp-M!wJTTIN7{{R)y6#B+83H-mU^gw^%s;{y1Szf>oF~G9Va~ zzn|&p+z)kk^q-a^>P$aWH{Xz7gFB&?`=GjO!!5X--l|eUay!HF6LUEgjQMNR-?_u7 zoX_NJTAS9Jo5Ny^u$D$Q)8`x1A~wwNWzLYB(!TWE^gKI8wgPgB{ao(taH%Q1FH8T~ zOg^p{kZ0I@$xNb>;GKO!k(Mp)Mw+tbE8A4f~yF&0gF0$E$3U zvSso~=EBvXYRkx&?ZaOR^HvUxP`oEL14Azhad7_Ap(@I)hu$_j2TSq!uCSZ<{4m1X z_EX!s%XAvEyKwE#8{+{w`x}xDmj15gA?a8i|M$4~zsvl8R~j$XsA>DPLwc2`Of)td zs_>PmLMidd!Y!a-H--ZuX^jlYoRl(ta@@IykOOuofm7YqLLa4J;NF2X?@SYEF zh;|~=;8U4(5*9dtX9^Mv%|`*18ESdx=6}OZvN5!H z4a;^L+d=r=1BjOwVQlk4R^~_f4SoM1h3DD#f4v~>*E$qPZ>OI4f#e!EzCVNG`*kWM zzYL4xj4~Lba#~f}Qjw*k*so2aq!y=Aito_Lqv>fo>Vug5FzfhtLMnE<3ZaDSLw4-s zHI)>(;#hhiG;$6i!```*3t{Y0CfsR1x@P!-p=nXzDWQ5@SNB@Wj#G~Px3CoIDZsI! zc19pPJ;8XcZPuwnT{_Oh{%LfJ_#ERE5W?Z5ip!($s zDhn1KLGoZoQF$eCfwppsEzhpl(C@|_^f$>9WvcgRU8JXMzJGX*EJrL7%khsp1rQ7j54TTp zucl4ln+^|Erd8+5O7(6N)lKZ&e%{y!vBsW6hleQ1*Qb>U~3z(ODEU}Ywap`cVs7LF234&AsOgdNTUq;Tyr)YFlmdLxDW9{dxTDA;uhDWlc%8aDhVd`Fr(5rLMQ=N*It<9VVH|AI zU*(_|7H%2s9NaLrj)Sc4Oi-^ zut?Z5n|2@ET;wOt9$#aySD{uBj%^p7m3ppgy`JZ-#DprE#R0c%=vcj(#N~mI zoTkI2+P?lof~CI}L99#Vt5`+kEmg1wUgd3bLoL|L3e8^r?#N4Wnu1YGF=eJ&EQA-# z3N$-SV@>}~$~+t*>2YQ=^ zyckd>nZ;eRhTW~{u&?XlhQ1pP^o!@=x_en`{$DX|NYSg)jVTld2=Mj8#6R~D=`*fHXEW!HqZwB(ZMa^EH=EjTL8-tgZGZ5E)8WJ4 z0~L(wJN0HWOCWoY;l~0K?;jQA`zInUD{mJS<@}i0yJ5YXci(TO^nZw~IB(IUhMb3_ zheP34cy>ZGGj5AaIk%WU7kk=mFq+;$d!^42z)LN&xNW`6_DtRm#lEL^1yQ!MXA%p> zs;vgEgatmkj}ZK3*d zoViV&mwG{79%Sx5mKWk7Ahg)3cL%79PK~;2NB5Q1 zctU-Ak0A$0jJd3R7w~mP>{7$h7{IQES#@ow5#&d7Ws`n?M&u0WE0L_|6HfD&jbSY@ z36>?v8I()*n?6NjK0IdMlhXS@BH|jAKJYQ&3w-Cj8$X|}p3XD-R&>MoCo;@I$>^Mv zpK6umj>K&1_H{c82!4q`-N(-W`ivkh^Q>lHtMTYKmTO6@h+1cHO*}47&U?B4nA(y~ zD)F(8CL(i3nv;oV)IV;LJy#^V4;8L9A@DVLtbdGf*t=ieYRdiFiQj%8LnLX)O|9jm ztq-UkMKpJAIyvAS_Ky}m~2bpWm z@@Vsv89WJm@;*v3c)HX&d`iB2Md4q7-`_#kjLawgeTDaPHyN$@2K*%C4=;E4Zxp`C zeYmX?UjBCNh5{ogbKnyrjhC^42C+zeHr>nF^52}MnXW$!?=f{Mbe6* zn<%Jk;GF4Lx3aShczX8}Az3TMzzNt4xNYDgIbY^P>S}Hf_&QB5EVjS4Ph&u}3zqr1 z3o1@x8E#6?wPh$fz@4$3g%%?%2E^ngRjlqI1Zvl>Czc0Q7$jP~v#^WmyI3qro?bu& z7`vM7G%$1g)-^{RbmJuP;ks#s)4Y6LVeE-{i9B`MB7wiUpn>NQ=fm%Xrq|2D(i zwv{+guGy?BV>T=fHNLgzQV-%NbC>zG9AqffImWJ{|Kol*hrSa!#bbph3Qw~CEP^h5 z7ZmL$(?(<@2c-vd0KJ-8M=kXnxexel-$g-Zt_zpiPwhZfWQ840Z3t$S^@Kx#DsMIM zSb^1k80+0_(=@6lk`byOgFIF~VB)fDyj+s|p19<-77D6;5xSc1nh@>j#3bPj6C>RblH-wL(no;Nz67$-%XcNDH*iK)e^!pCj5)GBxF z8le-~wf$#dYPZL717A{8a6|qdMZ$Kno|Kv?q>^tww`4-o-U07cn@J*gDKta^sf#AS z?`k+z(YRUSOXl>E5NSOK<@@COnN|*~HJC&V?x(1JU z)h7tEg;JobZz$ASVWN6Mn3ER5Gr42p#?I~yAfn6z91{_ajuMhjv`yIBQ@C@4ay!Ex zTP?b_OvLW*4hn;Fi7>mymEd(mY(YO~y>L$tMbV7(RzoHl@{K}qK4%gcHPG2+fr= z0Uk5%8H{uJ2q!g!wCy43S-~x&;L!J`k6>0dK71h)!5N`k_fuhx%Xuo929371c^u@C zgs!L|j}p~3o9+{>C6A`;Z#gM~pG(-54iC?*{K(&7ws278CuaNVVz%Rj+HEK{qlgc) zpkZ;=EmmUcz$q%7R!+3^jY?ZBR7{gGKAs|p7V_Vt{F1G}AhDA}Lw=>cEZ5V*NMsDXnhvmjQBj-&B?S%&BI=5*9J#)77^mK+eUtaZyf$)4vi zOV)IdRa$|8rQ3mh>+ZSujL)Dhw%VU;LED6omv&7FXL(DQ1LtCRI~IQzdug68njdN~ z(^E~KVLmrh5u~_h73Re!hbkl;(N?%P;Psk=NNxUDp_06yFv8efXU%l9cdDJ)*G(9> zfF>l~lIFd%o>3!_Uxj+-Yvc>^2!iHyh!x*jxDn4`jL0$+#AXKk5tt$zTHVoU_nAO34xreH$AWV@iaVbXP9VwQYZ!NqR1zmr1h_6E}^P=!5 z#HpxIk&`c23<_xGE0!0#wuM@qy624z@~^$;*fNNyge?P##AdjYnXzZ#m%LRKeqEY} zUyYIbV0jzYO%gjfW`!ws3q)C>+w*4(Eu5B{Elybt^Y<4T0|e09j(`ZQsD)ph(=Z$( z!e%bqcztvoS%(-6Xja{m-OiredCPG@Hl&HpCTWu&hwl4 zvO;Eb`%X7epzMONhCu-i^WIRUmR1$ss3L1qVGjzvm99OJ+&3%{eW$&*8xrLP2wLk- zCs2YDBozh1GkZVlLF~WNN|c-Bc2OAfg~cMuz#5cmrG#%TwshYc(1QbVon;e8gArx2 zaQW=e2tkl@pp2ezv?{u}XIX39KDXycvx^DF6-Mg{!f%K-qJIfrUx{$K=X(o>4FyiF zY_(Z2d6-N7gZ|2R4qA82(zluQOa(H@06fK9o>*t@%ol3n&7aj0_gE{b7#Fst-8px< zy7Uv+{mg2a>hBkq_<4@cSUO;-ORGgxW)7g2rpQ_V-%43cAggImeB>4*%A9U63?z57 z@??d1TbHA9TurU*_1?@x-aoVbcaf;%`hn!G$yZRziATuMuN1gX?|LEvNfMC~(HxS4&EAoodqm1ugXT(k&!u-mV2>tTP z;|B!i9|B6)P_ldPiQq7d-VQ3Ogh0H?0v>>#Rwjyo1eB zt_(R%Q}N=~IcsWYe0=Rz(nwU?)ss_{RkhO;&9X+cNi{Dj@j(~*k)oY%00*CV5ZNI8 zDLDuEU`|w;SGh_fQ)rQRLPQ;MC=*!q8X&5-8ZZTxTV@bv?F-dKiu!r^u~h{hCgJF+ zW=QJ^52NQWR}anta#~LCWfUKk>~fSkK>2s1e1nd@#Z)-T)HP+TKsb-*dPf)$mL%12 zI_D26{!EEG`*S)dg30dH0?Q;g^u2la2=y?4BF!9a`_;IEyuvVJ;c7L`+|p<_kRz!E zqaukS&%X*Yr_#Y&`Z4;uP~*#~duyoo;a9e+?~7f_PEJlq+AxddJVapEe!AYyw;@c1 z7S2P;VILB$xqS%fCwKNuWT=v#EAmxn=s|1{35x_rJ9W&7E>w2REzPpUJYZN6d3O9} ziq@&f_v8V-PFR)sN+dPjRRnh55Qft?hi2`*9NZmliJ4z@bJPXQ^e;&IMCo-1qG@t0 z3x1(eF!(n?u^k_?mJWolE5f|2%2@h&rpYJhEyNJDt=8h-%s;?3&Hh*H&vG@YZKUQP z!Il<*6+MJo*p_H<6oDGvbxUXl$)RS5kB*WVWqgC7NjKL^j4v*@lJvB25?SaQ!vVcB zn_!ghaz`Kn`XXTTFXaghAaxQ@-RgBMpAR^ zA9+r%l%6)aKGL=8LNZ_hlk}QqIT>Bohigen;^UCbXB1ML5sz3^iMS+7W&v0I$a4%xvTsTQ55h8aSK$v?o1 z76{w29w2?#BScRqn~1fxdo#QEE;YkF1Euj+P^TKe(Z5pda5yoK6eLDoj*O$xQ?v|b z1d43HAGz!#NT9T~ga({9WCo#a%P#g61V>d{C5>h>e;o##d7Ah>$Qx3e70) zLjGRl?-(8F8`*OQwr#LfjIY=~EG+Z*?a8{`S?uGA+|ZJ3-DM~K2}FNOp|A~5h#xZ) zz+vL|hYyF3;QaGAtK*)+@2t|fo3U8Hugm)Vl^}o0^uKBCw(s^V9-zv-Jq`vyR^wr< zk`5}BvRV2!h=S*>akR*Hei$6;|^2etUe5XPgU{C7kP9`p+sdMp8v1* z{7%suqOd0Qj>zU6EnH(?uN$L6c3M4RXL1bGmu!IGp+_7hXdLsQS>pVC=}ThPioygYq(vO- zIgmLFnZO5yC1AH5ZFEPR)$C+(1kGoCagLFA;UmB(Ls_ws@m^q@36G`B$_;jVUFY`g zWF3|&?>QkPTZ}3*A_Yx<+-yBS{%*1zUxseKgdX(~ox0-i~<)2kT zq7vUkEgk@wZc>Xd1v_9`?(i}?O0}^|t2)0r>7?$pmf5@^*<>Q!b1)7ZOtvQHXL$wD z!e^3yXP(Q+Mr2EGDt|xzXc=zxWb%|;K#gvhp;uY!V%74!S|+;XOWE;G%6B<$qvRyZ z*HgS!wd@Ki`bv(dDk6$my6o>O?YSM&>xc5I5-06`cKkxSnPx(Q_022&M>c( zmaOoOv)a0gJd*z8kKo;ADYa#kgKKvoEFfu-$C*iAG8P%HEDY7#fH9+jNNySPvoN5O z1zXZmN%k$)$KjzEchuJcRelD&?oAx+H;36h!tSOf^$R=rAEF%LJ;uee|APh0b<||a z-NJ-=zmOnWHZYZbVVZz)40}c4oWkGZ7pD656yRCb2mb9;if6ipeF}S-8>}CE)(id~ zMz7L6Ol@l9A9ey0X`{h~Zv@hjqZfl+8$QRa|1>;oU5jw}EzOxO#Yg3HrYOf&{wBi4 zV;u6bL_3{);T9ZjzFYVnE9*}M?f3Ppq&8b8S{tu3x4Ex@S3VZeTD6Kh%9?G<$4Qs; z$&hTrXL{GywR56uvV4r4^L=5CN69mdC#3*s9dz7@I=lSuwh!sKGFy~&RHE)88mP`K z9>L)p7iI>~YGE`ym62gfG>d8G2T+IEs`*-3C_!L^RVghv!A>q5ve^tESaMgh^AeH2 zoYWc>V2c010_o#N74e@Dl3`BlJ$HwC-|OP^t719~6^0AvbF7cb#09qgREifz<^I1h_V7m{$Kty1 z30tw!qFj+yo9uo?NwTJdV{^(xl#gl)bE ztWAjIY!LOEdOf0~Hvn0CC-pbO0{&-fhAOM4KMN2&28ECZ; z*)Un}b&SvvJ&9HFWn`aXmV7PpWW+G}R^i))?@*-Ca=x?h{erkN6(!)p&(z{F()RAd z6WyqLg@<5j!?7v+7QQy5dz&FT{O%Kbn;EfyLQB?)K--FgH(8=V=H^F*1=TJ<_3)hL zi3CBN)?=h?&8D`^JxrF@!J8Nv>(Bg7>_ZJ@Ufz6vJxhpCjAQx_>A8{Tb-79%xs+8G z!F1fr#(~G3jG6#scfA5|qath6+rkH!E8YgGBZ^zJpCnf5su`X*^Hlus`0zGSWOop~xs`V`&PF>^S1}1G;x_=29-Da*^qXag|nM z3{SknvPk1Au=gGm4qwwn=q%1jXWl_bk#@V}@M_{*+2y)^U02sCD?>8NX%Af|@50P? zT)qUC#eNadMkleZRdd#255Kmnd;O`HnsEAXPfyG`814~qC4-R;S;0n47jL64buy~k zXyDvFh~{(8x5jg&GLU!FwAj+d<_3&I@X=EzcO5{?L^Wbs-6}~5zx{Nm!3BZnLb-Dd zZW67^9y)kwPh&1w8yn{UwPsm~A?yt?%Z$&b$+$p|860^$J7{d0U}oDXbwaMA9#NV* z=zShZ+HL7KXw~{F=;_Qm_tVcCz3}F0lf3Jj*rOa?oiJt&ucZc2e=oF@j3Qke%)MNw z7Of^)_uDeKFfx{3UAm+ERVyHfi zLqi7(z2oJ*(fpX14@(^S1!UqZaBGjyE{NH_t-jeJkx zI*V;}Qhikt-DD4&SCx@fY}7^3UoxO+_cMF zWZfUiN61f`yBL(>C{sx9#aVAzMvj4Sj@^zC1S)M|(zO;PSBLwIM5*lRI%-5}t}YkC zX$!o?d&KH{dio^DWIElR2i!fUcJsUC0e6m<$mN+^E;JBVw%i46l- zJbNK!7sFlAJUrK7d)w8GUZJ}Le#S?~B(EE=%B3F@i5(LAS#&MVC`f?~R2vFPP8(B+ zULoF?Vqu#nv_;w%mS5MYttzhSqw@pBn~QwcdT>@mWW-xp*GZ45yf5bzF_PxQZ6?)r z@v@=}&4}E#!K3ioge?Kyspih;z5#JjRM(w;Lz^JMg-@ahvw7vdP*$S}Ss12Int zO)`LXzxpnw(aJr9aROS`Trc>R>#ZSR^E%K=@U zYh>YziR9jpUJCGWIo@%lzFgDH`-?hpcu;sSC_r-2P;zIwC34_mDHG@Ye1Y|@;3CSG z9u#n{+^8F>{O(#N{9R|B4GmE59MeY_E+{>-OPOz-rT>VX6RfSg<{qA+=DuXpIP5`B zZngVXY~;uwwqmFk82%iWOoHgN+A4cLhc);l?X^VaA@^;tuVTvMC{NrdbRBacG!m`f?q zGpfTWVMW+#o@Z}U7l{jrhPbBp^M3{QqBN@LTTBzQph6WS9lh&<)K|Quq?bBqZLXs~ zJM_DXK3r4qCIjm6puAf&)7kX&nUY>8V-rBtQVV*^d(^g@u;J{AKD7{hz&*YSpsW6h z_fp<_066!d9MF|^K7(_;dxT(I@4R?une?G#3@QP{d8wO&df%{e<@`S}X45S~NjI#F z%Dzl-b9e%3?bv`(&Q#n~_Bq`}*|JpZE$$>F)q%*c@5k1)4Rl?ElfM9SEMu51;mzas zIDclVVXDozy5qQgT|N0(6Mv^S;XkBf7N>VSwZW)RfX4F1mnmkxblH6*08Ly{szYLr2n|_7H{M>CJSRCUd0z6u| z;0(*~W56sBHDi?apA-4dI!}a~c;~F0{FipgvRVzDI^seR)Emjwl zca9*#Z}Qy4)%9A3;OI+2OLTo9WI#mAX2pTj84ZX2v3n*Un~{tmqJklR{mUX7@xA5cX7Vnpgmh|XU}&R3g`;r;6j9aa8l%7|Z`AylOJ5KsTBks}y*~p2Ehz2qA{6Ew z!s~HQIF{BAFAp6=a$AYg-kQEG%*nIr?7V=$QV)z>Ht0F0sXhV+rw&tN1v^;cQ8`RI z5E@S}%gp5gZWTv)!s_v4>#SAuvOG_Bff@f@c?7KaO!IW;tx9b49AXHX$25GT*6Nb) zRw!wj0X0%PlXd4Z;ozx2Ct zw>uIGo-YV456j!Fa6N+^3pn-cxyEzIHDGVgO08}E`%;yo_Vw}EvYS#r6m>t35kYCb z5V2%7U)<;HQ)k-nm_=_wxo*bRW!AJwkS%RhX0Y(ma6l=xE?ohfDfafQT9vXXU(G!2 z3n@OG{GoxcVm)3s>c>e$9^Q@Ct7ug+2238<>K8Ifjk)zU46G z9kAlD=^e0UKSS|e&{AMp)(%gs8XtT05ZfFEa*b^>8kr{8C@4C1<3z`j*iau1hr4+- zEbI-vAOOZE%C=Q#s%D4R)lK|>_E1zczgy%%?1PJ-jIbb->6>eVQLPy&8EkYX8$#nS zM0ru`23%3|v#``#D|C)#BC)Rm}LexPM;NT5!D(GYh#4+{Yin+e`x6&9qXIq!43A2 zQuXgN*cT~em4U91!^p$!&C)zAl%Pwe5kpCmEz|G5RqMDCczX_rsrg}vkNDb(Kj(bJ z*U~Jdt#b`MHDOZOx8rGWW0*Ul?G3K#ut*Y6c(rkVlRaQ?${sy~EUMoCbWaDSOz7BT z$k&Fk900f>ED*3?y2Ntd5UUMF-_~q*o!uDNLPk6pusWS)Bg$|r2Az?%ONHNyAc>Zq zlUJ$U1!nh&?0FS_73yqk6&NyDPjE}dnXDu4xreaeE&^HjV*;VkIFeH_w>O8Qo`saX zF|TcE&2d4q%k62OijOMtC*DyEA7o$nV_{906O$iZPEN@#;%TegauaJx^I&?ZA&L~^ z&s7teLXs>T0gvF#(IeLyj^tCNsdt@tjD2P8%1%NXuz%)THH)VepRF{&!Y5_R&^XeL zA$1vI4jdE~I`-gl1rxIfdgr>|9p?DaXIHOV(>+t{ch{i>s>Rq#)BSu%#^OyS#`(jd zRR87?d?hqW-EzUuikyaj-@zRmQv zF)1(kLH=}F5zQb1W9u}uxm{iSh%V`8p-#HjN?N2Cag%H~c%|AzmH$|1EQ{A2b$C0G z`VtNK&PsuF34(c&(4kI@m(6RDJld5%B*F<(EZe4`age@#LS z_6$_v34d1ZSr8V{RY~xc+i8_Y5We$$lCLynXt^3!9(ujrER6?UUt+}Y)6b=|>%Rwi z%8Q|*&aU!C{}#Bqu+uwZA3Jq({duf#i=0{)5swmsL>>vBf}HwK;lSue7GrNiET)|T zhs-$Kva=0NQI!)7;k(AJBEw&do}xC&~j0%=Ia9@lT;96V7}Uy|kpkhYFXufS`Y z$@%{++pZ@3bL$Q$8dgpx>t(uXgNjT1`Qbf0X>p1&I~kSkG8E$sdPkI6s=brSVT*Sc zH*1)aqU+ZR^ZgP9htf_e|F2EynK}7a(pNk0?GS3hKnPEKZza{kpE@A)mN}|3NHuKa zw}Thss-FHLy+4?q1OK58F#|VKA2PiZ|NZJv5(Q3)DbzPi#kHeXB5N%%iN+BPjh&dM!KU3)vHsrGw5TjYGjftZaEf;#4sgR#s^&fRjx6pm+xHfW;94f&U7bQ`k=8xQHO zoSLN@`ZNdCtsF|<=eK?y$yHB6uX-x{DW_QdHT*3+V??XHbSO^bs1k?Z;KJd^21>k= zj8H{q$_gsgTL4ks1L5)Ca}Q(M2pQQ(!za4YE+-t3E0_9JNrbECi`3(O`rx`_gZ?1Q z6E#o&_83j!I-8{wyj)x8$&hpF>s|=+aj;`furMtrvZIRwjpj%ymr^Vx!QN>IA@k=> zv9|@0mAo*QhEM0Xo}<+ZIM!xzLbK+0qap@QDLBX;&~YfIDzkXqM|ckEhNayd_~6T? z(7fV$NnyYpX?SXZ8ADBKkNJ06cpQ#4UKi!HE>BkeifF9555F-p_WMd+s*q~K z`vT+wQg+fE{;&Y9c#L^P`(1ddn0cv6iR{{J05rDGTct&@Ok=lB3|@{+$-dwi8B@aQ zNetJ^u*}%7s&CngS9CBj@E-Mlt?_?hF+GWHY?#ttv?*7S^_G-I9HBT)Xv>XO74G0~ zvQNLA<_2x6Iz%RQGc9M>?16q$8J-jo{2ZJfqB(ERQ_hI$f?=^%P4BwX*L7`@Fs+_y z;U6P!S3vTI4ANeh&6sv{0Cf5EGO`{4LYA+En%>b1M#nA^YdMX6Ex2t+Y0^Cr;r~S$8`dOI6kEmBYQ_Av59w!B9Uyr5f-i9CB zrwKSd7dhbnL9eC%B+kASFzKt|YjiHUE!-Ys?r+m&s50)pi@rVT$@UXtnLbd#4p+*F z8otn2XeyKt`~`)DfSqE7zl`Aci7iK7)7b}K^EsOiA6zGE3$!csaa$W|ie zGgv6bgZCeRT$h%xzdYq=vv$FJSusj*zZcB#3xt_JR+G_S{}IU~YS$>4*tCX}^ZZGc zONsetP2nbFz5l^RD=_~UBOTDgm1(2N*~4@FOTbubn)@Xtm(S)PZ1FehE84q4BEu7iFE>A6W3)?VI!8f#uSy3VSVokoDH2u!8?-l z73oxHF@}Q6F)gCiD?E-z=~@wU=faW6S2=tSaZ%k_?1H?fm@J^`^j_#y&vqXk&#vS? z>McWI-uiPY^m1+0IB0?k+qI~3NwYvEF_YZs(yoN!WmsH+2bHi(#&$bu(%u!*8Y9)` zjo(>TyDou!#42&L-6%eMv4mk-BDCg+2A*ookrEH+-iX^Zu75_3F*TW|JzkCD8-M5h z;fH74kKosz3^i@* zHn-!Rt?RL${IhjfjkR=iNPQh=uuSLAVyf#|{VnW94ctEvmpK)deNiLGUv_dUn=d9` zvkZ{;@|SB_1wkL2OxFG2%P z#S89MA9{pybZT7ZNp|)hiNd(c+%ME`W-neFlxy+0=NUc|j;=J_j2U?ur_Sw71v7Ht z?!#Ht+r1`+{EH|ftT>ItN=(u(V>urQv1^S z^&|lo)1zdV?Hf#WK}Ba2jP`YS^2+6*x@|y>g!Fw`a|KnuGeQiG<$M1GfY-GKNOaGE zNSVjn=8gc{AXa^{Mz{n`tLPIV!5_?J?|evU#mabBnYQ4=$w$H>#mQNgUD60^BygU4 zDl|i@as!SY!fX`A0E;z@P7JS8sXke~2wZ&I$eQ$iFwwW?Twev$I^a4SgP6~d5 zeuU&22dfkS$6&J;e&8!yMbvJ(3AUL7*f35q&BW=Zj(AY|i0Iazu?uR9S>Uoqdeji4 zia+pq}!l@GH0XImAzhf=7oSd&pn(J%aS;qp)`2iR5P zLqryP2f{p{9knPU*}A9$Njw8;@4XBR_#3lbjqi`mTusgqx5B>@v}8&fst3kKrnXb% z*!vDJdLH%YBz}T8_4Hxtpg9np2BUA`;aay_MYG(PHojkmISRrr+@2qTd`TDH9gvK? zAs&xFjlW3SG3bEU!|NXvli5_&5eB$69Jsn;ohW!6eX87>n>C;vtU5r>%yXGd0sIu+ zkpj@v1QI{NZoN154Sf!9-8T)8`-5T65`~=zRMU?O_&{MBMf@pDKCc0gTj#U_r5D)L z&I3d`CNzwhO4DYy?pX3z8h{L9-MSTytA5eif_^MiBOSmZ!yZ0n)!Vm^je0<9A7jeo zWzI5dLB>ix3LZuSlt+!8w%E)jx!TS2`OB-YfE=O4;A4eDjTfY#MWE9w;=K$NuEonu zG@Hi?e~ijXwXWEW7euD3T)=rCO=USirG=4s9j`0XQofR<;#$hcKSxU`&G6UoySj@} z`bqNBGTP1K&>UK9)TEd^2KenIQ7^dyjd-Vg_fd&=qYmGgo@)d`=_hxVxr`=A?VBB2 zk5Qragn6MkPgmMx`^%8k0bpg6@nt5X`iQ|TpN50yTGQi6cg=X8F0VLJC*xvx`gNvcN6TP>g-dUA`AGg)bj|r08;aHqIAMLu_V{&W6WZ%h>v@ zktksoDzZXTyUf&j*Q?CcwwbwkQ<$4==Q^E~G3pA7OpE_3Qb?!~q>*i6A`Gm9T8`m< zvAHS9 zZh=!y3-xggdi~|l(9nSlU~Izlh58;cwA<4A(%%tEaE?^E1lAQc(agKMyKQskQ{K_t z!%rY4kaRGbN@d4Y;>P)PJ)$5CvNLNSnY$Y+GhG96B(CJR%BUN>v&L2;3PT`X<~1>< zm?9!R@1(by91P6g3@Ut?*{WeW4YM1mhT=MmVfp4d_NFtiOs3Ld;0JpXG_5EyIJ%vffZl>P^HWhy3G!Xu?5xVwkfd!sQPBYH>XU6r~<2ITSS#gTW@g!0HjPpaQwG zHv2diR8`mk(*CF9>2yh0WXZnex>i*vSG3P75neV#5hvGro)7-)9kQ$NnRvE$yRZ*2z-T~qRYDnciyKGJZG$A za1+~&K(RZ_Y~en(&5YnzWz~v|QH;7Xn*O)2-^X^$2lB*f$0I> z8KRGdrmzaBJe)K^50$ipdO9v*DZas_;|lteXR3jUfN|_;RUYdnq$q^2=+u7`d_A@! zj$b|RcDnARP?6uGAObF3y?K+Fe;Kp-hEONE0RT)t9IHLQVYl&qJdTj?py7OXZi(O6 z$TuDyzf-<|S1|s+G7-@ML=(9_4*oJtS72^L0}Q@pZ>ZOH=_PcVd{0HqKrJB(yQa;K z!*Oc7igQekj6XJg^E2$?zK6Ru>2m-%a%H?Z{g3oZ)@>D72c^=tt>@Tx)9A*047@tW+Vaq#?F~%uit=l+l0@hO?o|*C$@!CX%iq( z^Jc2i=bDxO<#0ia*W0gY)T}+5{h-#R7D>E;P9wK&X0kR+Rlm$6B|sMYG3`GS#iWVK` zTsk6=JPA9Mmss)~_uB^B!H+Avi1=(Xq^)eXO(&)VAA6ainu{LlSM%MQhy=2k$;JijJ?BZedI=tJh#njG6tI zTTgi?&$h~&>-+=!?`6rc$?~$fpv6-JT^O+0PzRScD^ZZN9Xi{c&bYrC1F^qi(Dj3? zp9RJn$Xv8b#i)diG!J@#QIrM}Y99O=u#|N@r*^I)z}vkDhEFt@mBQV&wnh$s&vFF# zsrFUE;BRq?-OCA9Lxd!TDs{YK+^jgpZG_hpH?+@2HOK(pIwMv1^{_VIGm30%g@)hhsLqh*u$@MfS7ZL-`G zeU1)+mT}jBVgI$erPKG_Wve!Z!`REKNQmZA+-KD4ajY1MR4AmQY}h zpYQ1a%0A>7K-q^HA|o|cwQdLpPCudPF8L%s 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%0D?EaR@ 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1512413526.index b/.metadata/.plugins/org.eclipse.jdt.core/1512413526.index new file mode 100644 index 0000000000000000000000000000000000000000..76cc55ab82a7b932a14d78f5a01876c8495f9506 GIT binary patch literal 307307 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'$AaouC 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 z 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 IzW1&E|3xoRN&o-= literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1516196484.index b/.metadata/.plugins/org.eclipse.jdt.core/1516196484.index new file mode 100644 index 0000000000000000000000000000000000000000..9afca209fdb12bc39c0530d4b625c72d2e1638a8 GIT binary patch literal 25 ecmZP&_VjacjZg@44GQ-3_fs&`Gc>aN4+H>H1PJK> literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1541055472.index b/.metadata/.plugins/org.eclipse.jdt.core/1541055472.index new file mode 100644 index 0000000000000000000000000000000000000000..9afca209fdb12bc39c0530d4b625c72d2e1638a8 GIT binary patch literal 25 ecmZP&_VjacjZg@44GQ-3_fs&`Gc>aN4+H>H1PJK> literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1589171113.index b/.metadata/.plugins/org.eclipse.jdt.core/1589171113.index new file mode 100644 index 0000000000000000000000000000000000000000..48cb69cef124e4c0dee7aa56e21f1eddb1d3897c GIT binary patch literal 194665 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 RwYIjgqpht~%zCTS{{d<}5BvZC literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1592057207.index b/.metadata/.plugins/org.eclipse.jdt.core/1592057207.index new file mode 100644 index 0000000000000000000000000000000000000000..46194934a767ad0845051e7126215d2c67e89fee GIT binary patch literal 2839932 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⪚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 z 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

S_Hny9H`Mu8k~+)oh{Q0#3|p&j_pcPz(a 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

Bg;Bx*gEpUd7zjlpihNCn+?Bn1;$suQq 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 V!D8~o9-Wua9%CR>{nx`A{vRC1g=7E# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1427570240.index b/.metadata/.plugins/org.eclipse.jdt.core/1427570240.index new file mode 100644 index 0000000000000000000000000000000000000000..ec3491bf072d093abdd897fa21c512a46210c606 GIT binary patch literal 222476 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1454368809.index b/.metadata/.plugins/org.eclipse.jdt.core/1454368809.index new file mode 100644 index 0000000000000000000000000000000000000000..e2bbe50d1eaca04764188d4fc490ef29ac0cd40a GIT binary patch literal 68942 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1494953510.index b/.metadata/.plugins/org.eclipse.jdt.core/1494953510.index new file mode 100644 index 0000000000000000000000000000000000000000..df0d2de81bfc5d55ec3d1e934543c97d457350b6 GIT binary patch literal 2016240 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 &aHMZtp%La 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 S$7frZJjhla6WF^jqLb!6#XkyJ5|*YTkE$1pyK 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