From 5d0deba9dad754223011dd3370dabf33885c645e Mon Sep 17 00:00:00 2001 From: Bogdan Vlaicu Date: Thu, 2 Apr 2020 17:06:22 -0400 Subject: [PATCH] New meter_reader add-on --- meter_reader/.DS_Store | Bin 0 -> 6148 bytes meter_reader/Dockerfile | 22 +++++++ meter_reader/README.md | 28 ++++++++ meter_reader/config.json | 14 ++++ meter_reader/icon.png | Bin 0 -> 8605 bytes meter_reader/logo.png | Bin 0 -> 8605 bytes meter_reader/ocr_aws.py | 135 +++++++++++++++++++++++++++++++++++++++ meter_reader/run.sh | 5 ++ 8 files changed, 204 insertions(+) create mode 100644 meter_reader/.DS_Store create mode 100644 meter_reader/Dockerfile create mode 100644 meter_reader/README.md create mode 100644 meter_reader/config.json create mode 100644 meter_reader/icon.png create mode 100644 meter_reader/logo.png create mode 100644 meter_reader/ocr_aws.py create mode 100644 meter_reader/run.sh diff --git a/meter_reader/.DS_Store b/meter_reader/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 O&Nj#L|J#I~PW=xHMUgT9 literal 0 HcmV?d00001 diff --git a/meter_reader/logo.png b/meter_reader/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..134efd8ea99f421125f14ed224f6ffd0ee864491 GIT binary patch literal 8605 zcmb7}XIK+K*Y`IC2)zanDWORcilQJL0Ra;f2@rY{6f`vHy#%C77m*Tr=+#gJsRDw6 ziZtm+5m1^)Qvv0{`@?%b&&PM>!|crLwez3dYv-KvJExPU3jm9bHdY$|fdBw>R)NzQ zAOfJJreSAegR`--!#UwxTwL7$sb?(@_gRmNhntU^4~gL67va;0JDN1 ztf13gfENJ3V8}nI|F3|+G!QCk81!t`kOcsNAyiQ6vqD2fO>?#(Fa&_IQn3k2t5ehH z+p-I}ho$UXE_nWGc#%WHz>e}mSi~bdwGe*gI^Ofi2#nLPzMD(*?xVEP3o^1-HN6_n z9tsEjpXL6o`%ei6>;D$EI7oPrG)+kE2CtfCQDHKVo1~={ZTd_U`e4X!slbK)$ zVqD98S^*L!BTUzQXKiKxd@XvY;=)?3o-(3yx#vR)$K&?gp)_drT5hM5K4frsVr4+2 zAh13uNAUBgwEzs{RZ7YIiW%ZPS%F>1__ezkRnuhV{!2~NW6&lIGeXLzE1}ujjG0q7 z>fl}Axzewq{3FbNF}K67tH_cjiJ1h9LVlkta2G3R8fMh`4v~~fubJfBLDxWbw}@Q1 z=YD_Sft5CO{KBp;cr5>jFtiL(IP4M}8XjF^_e>A*T%kHztYwZDdE8D4`UcD#Y_OcD z2I~u5^dDMbIt7xL71fvm_QN{-e-8+;`wH+|kqXMJHG>rXxPg;6REI?;>qB8`B)_|Q-B&$`>$&#F2@%moXEp#1QI1IrG zkAWL9Gn25E1&E*p`mBxq56R)RK2Ad`tTlNiNv)I%9cJHvG}psGRou2yErt5`+GY%U z>G+`<2HkAmzXDo6bo+JPl;coC+iz_RNzHDl=ZiE+H2)EQ#S=w9n}13Z6sk0c(ZR`z zkf26^Rvnr`)tIZi!pHYPFq$~_@MqH)zBE z`cC}P%tf0NX0wMEGp;yvc0;MJ9Xn?qjf|`%ONq_jy)W2#@z;o{yURxZD-8eSFM11f zTiR~mt%Vb#*i)dznBx`LdQ7tH2xXCQ|5!>?T=f#)(k2<<0HqJCEz zJG0Rz$-6d92XlximDOM&YhV~R>1R~V2AuZf5;!dML8-V)cfG)XeCvLEAS)(G6}6Z4cEc#LGd^8<${|MrX{TNub1U}cT#Ta z+%BdoDA=Mw7FFsHc~N9dIy;ZWZoYx#8d83zrR+o+(B{UkESNtEi6$)?e7{ejZ|v_` z2Fj~1Eq;%G8e=nRW8#cOk)iqFFj!f)j#F&kb7WtQ)yc6!7gs|KZ}8l6Q98S8syMu1 zn#fv`Z|)^VaC06LYq+Dmq~J~Sa9qSw)O`^$7%P^{n)#oj`Ss0C-LmEgvn?JjzytRe3&fH)m~HC;Bx47Q?k;}weqF%@Z9L^^zS zZ%UbPy@Zq9)NxHc%QUVfBn8W7U+rqGKW>TySp&A9)%6}}&xeM0$i-hwWF;mvo6_cW z^y%r{C6hH`2Yw+ESr1)*`g$;7E*)>~e`q68@WsT7c5KP10ANs>6hXy}s0!eppNk}w z`(AhUx(!8P%<-#Gur{4O)SYIH*Lbz*vax@(gM)>Xm2Z&_U0NFPyi0cg8K0ZX;O9xK zEP(CTx7JhQFh>YDM}_fMl{x37x=G2HXCY%*=|N8$(Z*m$153f~h;=ugB^n z=v;(@vq%^!=yD(AC1uTQ8YL|8=hNDx?&>ULot$H(C+hHK5joteb z9=CB{v~&ZpD-7tHR$lXEBKN96F)wBMl*&wbey zY4X9HE|fVBZ%;fsXQ6m;)-&Ium87ek!jg67`oQK?)7z9c7_t_Weg`ew@=doYX=4x%FAG$bEma?VKX7TYDq+)2z--xisiZ)dB z!&~S@R331}aM{nG;cp~^HBW(yn85t2t@C-BF5PHUXD>rm`FOF);rNU1>X9oD23|!-FVu>KdRYS zAbIIq;d!$TwF_Yw19A1(;`POD70w(=JwgA0j!E_wGiv~H(f24$R_w20C)9jh_q(cF z-1XpWBgrfK4#l(AUpJy&mp4)&?y#|OToPGM$M;Kf-bSJEkw3R%Z#@g_G-#2sMDWGMJPsd z;BgpCA*}zhX7J3585HaNo0Ko364hktPtPoGI##$*$;FfjMHM9=lqwB5trmxC1?CjA z-2V=V3k(m19_yR}DHr)fJ6{-kdTf_pN!>mlN9$6GTN*2bfdoZJSne-Z64~8nuqa81 z{f3?`N=G&s>#j~~aMPuTN}Miys{3UOJxL@!=teg>XXZlFT=jdWQy{l&Yj!439%AB_(_KI11ds2#+*|_Drq9!#Lz1gfbA@Yl zHf~)aE`Q^^y(0Og(Dp6O1G6lhvM0|lERIT?lZe0F+RrVFuVCMoKV#Wdx%%m8X(JTL z^iGJexbuFC!;mDIjiaYP7de5ro*RF-@wo734X+0&QDWq#hbI? z>BT6mzPPkPe4(p~0k-!wX1$D-2g2F(N$eDesyYd2wF&!Lxx&-dAo8WS_*!qi$_{7Z zuMyENn{NeE&zElznr5J<0MFv~WTq46Xg0URXAS1f%aG6y>qTcy|5(T~iCl)VQ-D4C zkC2!+-nnqxMt6i+@qI)fJBQI7oGn0vF{p8eObQwREZhuW(6KEH1&#-7`)w&Rjd?jB zTTpt^L_m4jQW_Coa|G#AB3QkxLki@$RecI;XnH)>J4fGki%J^wxWdW9W3}AX`(qub zaAYO|f}^EL?SO`H>TfA`CPWrU!r2eP%^Li}3&%@){q2J#_D`cw~Xzs*j zFt;B48=Ckx1e;d2R9o_U3IT#Zhm{E04CTHb^fx zEx`Ic3A^4r{rnVQWt7juS)PZOJqC}YgDaey8%k}~lb4i@BemdKcLrckH3PcW1+Bp| zgXWi`Y}XuE^4Ev8$3E(^v8it~6zu&l1yxBKt zA*D)L8hh$hOaW-CwR*)S;EP1M@+mH#jTesTBbhC|REiHurg5(dvhewyo|eJ8 zo0FtmCVBK&GZWH~N+L@pkEJ+dVVRHmXVWWs_b@@_1p`I=%XD6M+TN0HXkBoO;Popc zP-E*f^FVnfzEkQHz~r_Yh8t95SLjqG00rmRNp3##Q@3>$2e(^~w5iS;P<1mpnnZCW zP!z?GqOKun{^UQc@x*R96j7v>U2K7*J%YCjdx3h2Qi~hQ* z-hS&Po{0UkpS4(l_a;_5QRBFwRONLgt3&2-$5!$JM?Rz96Zls~bSuVHD<2Ac5&m0n zem|s|LQc`Tr4)UswCkX0O8SQ@&+Yx=ng_El!?xTXl$O)SDd={%p+`u#Qy}sA$%XGP zm2%!z9ysZpTs;LKKg`TW)xSm0os-|IfxLA^U7z9f`4YYUDesrdUz#Pll%jFIa8VuY z3v;?OrpAx-*_g%7tRV>fishT(VRTG5WHK&IJLbktQiRA&xkJ{W3RTv9cFaF4^7}RK z>g;B7gUGlP$9Y6#6CvC^KJj?T%hb; zH@I|qE+<$?F)B~z`p7eraic|dIs-KGh4did>{+W4R>jSi?dPH>OC=Tg3J3VL2?BH$dV14a}qxW&WJ)SPa6lp(sYAYc%K{a;+Cu>5@z1Lfzy1^;B zr$7Vr2qlSTH0CHxlLdd*&N>|T`tt;2XtswUe44Yc9TOzzyJ)W)vpIPsGlDi%e)vBW z{ak7qs`E8{oL*0q3E<4CS(JZZ&}f)Kjhs=5=3HkP(8)1KWuZbFSyx}Q&Epk1p84HB zdZ%T-E8-nWQqY#Vyv<4t>T9P~M%^GL|7a-u!YJAut3ict6s6_G7qX?yV`7XY7~eVn z91#miZsU2%^;UrkCipywiSpY@kDIaPcaCOTTV&SMD>7By>@4jpoT*qV62);_`ugAFke$bZ4X=Ug*H)7v%x4-VUz<@jZa&tT^Hyu|c>!Pwaj9Cm z=t5m;bmF^%R{0aeKfgTh1B7dMx->s=u&4*gicG-eEegN}-PUTE6??-gK}lb$|3sVu zu<$GDKuo+nzUR%>3cHEKqVOJ3%I_Zy{Sb;wTHITYZP^$df!WjoGCp^_=O}Mg z2N&R7jvjCkFxudJ zaA3?)Li>&xi`5OGz>hTl9)^oQ_ITr?|5G%V!@?or>zQ3pU5|uqk%N!b@4hoLZ0B3z zoPHGl@={0EI6XgyaEvgLB1!Ael&Gote$1S0DNbA6eD0dNX9N^PuGM`GTUWq~+9Oe$vc3~FVJyvoeL8m^xkHdU-KDIYG~epD9y{E*#PqM{o6 z0~<+qX=p-sF?)4GBfQ(Xyk$_o%Y` zL*g(jm*yPtLaVm*Qq0Y= ziY(7f)E4i+ZJ zWIEZBi_I?BA|f6gR^-;Bmx9@=sadIX5YqRyIKO_@2q18=UwsS5v=LVncv%)!>HHz^ zFPla27mK{lB5TT$4zn8$&buIOtorz>|CBG=o)qc@dupotsyvGyukb1vPHc8o*}k+F zOjRnuK?|*hFfgJ>b3O_)?c2O+-F-3%h!g|u&tc^7r=(K z^jcd!nWkW>K>}q~dOt;0g5RAB&$47pEvv6{zMRg8ijXt!&~{MW-eTq@*?QFyrK7KJ zo-!=!Z&tBTnC?jJ>(qzpJ8u{V)4(_KrV{Z*lkBmHKON-s6r?9I$d%XGOf(kHEf52m zO-2!k)W|PurK_c@7v(L3e=@Qqqy0r`xkZ>D3~$F?XV$lhi`z9w((7Ukmygn^;NE7$ zl!Mvh`8dA~+O6_>iF>GQS=!7@p~wE(yG}o6`P1cRU1L`nOkCTQ9N*s!u|4=g1?V`H zj=Mmb-Fth_T`hW0B8g2d7D?6ZJEw(b<8adn8A*gIj;aA%4x2s+ujMhZr2g{+a1)7UKNdkd7CzV6b<3k?ZYGdk9hJsmUW;WQVoI-ede%0Y z+%p=L%hRN=t^12CJWZVDpKSZ6#)~3pGI}lckZ7J(%{T_UcPl96vsD|{MY53o);n?Z zCy00TyNk6itSc&MXqA4{7Db#nvMa6nC*4vv9s8bT>uDcLzLe=mcHN_q$sM>s<>YFI z9Z0wGvD_*1?wGzo?-wBb?J~ub; zp_DW4nOpF7O3?zizeZMkPPUARQKojvTj0O|;^%Xx->%lyDhHYYU-akw4edd6d z`D3g0%gXs@Uzk!!BWJ3s&Zw@w1$-_ZLm8t0g{cT+atzs_~T2i^L9MxMg(hqFj#%vj1^N~u(nVKSS z9-$n%+4Ri(tM7j=TMB+8h?zl}Nc|1!a2M~+tvLI7ae*By!o0VGr zc>-SG3mIpb2T>8jNZBwn$KtIez>qzi)OM6F5`SAEL1ib6@GMj+6zS9t%HwDGNcjG% zi%Uzz`)Ai9%O#nK+x(|M+Px~sS)z|E(vGV`ykgaP(R~1_ zM#1fOPiM(?UX9A=C%eRZ)|-c~0y22_*T64Z{DK4{CInPI(tYFJs2u=5^l^frn*)9wUdNRP z_auD)s5AJ#M{qF(bfuhG4Z0tL6Kkf_MwT?8NE(xWs**lHmt%L%HjnKWF8x4%&~?8S zsfF*E=xGws*GuXHfqd(y{-GfRw*5>xTf(ezQW~`OTP?}9SSIo;2Msg2BL-zrL-tke zeE;nkAEAa2BHYHMuzvJUzH7C_I<%uU~InDU!eu>C4llrLa7=x5ntd zm`7T2gh!-cpjn19HbI)6gL))Psc8!FF{yr!#CUWNl{Uim#1s}HpjtL?Cn9YGj8lh# O&Nj#L|J#I~PW=xHMUgT9 literal 0 HcmV?d00001 diff --git a/meter_reader/ocr_aws.py b/meter_reader/ocr_aws.py new file mode 100644 index 0000000..17794df --- /dev/null +++ b/meter_reader/ocr_aws.py @@ -0,0 +1,135 @@ +import boto3 +import paho.mqtt.client as mqtt +import requests +import json +import time +import os +import re +import sys + +config_json = json.loads(open("/data/options.json").read()) + +path = "/root/.aws" +reading = "" + +try: + os.mkdir(path) +except OSError: + print("Creation of the directory %s failed" % path) +else: + print("Successfully created the directory %s " % path) + +f = open("/root/.aws/credentials", "w") +f.write("[default]") +f.write("\n") +f.write("aws_access_key_id = " + config_json["aws_access_key_id"]) +f.write("\n") +f.write("aws_secret_access_key = " + config_json["aws_secret_access_key"]) +f.close() +f = open("/root/.aws/config", "w") +f.write("[default]") +f.write("\n") +f.write("region = " + config_json["region"]) +f.close() + +baseline = int(config_json["baseline"]) +base_low = baseline - int(config_json["under"]) +base_up = baseline + int(config_json["over"]) + +client = boto3.client('rekognition') + + +def processor(base_low, baseline, base_up): + file = "/config/www/meter.jpg" + data_str = reader(file) + response = client.detect_text(Image={'Bytes': data_str}) + print(response) + print("") + found = (response['TextDetections']) + reading = "" + for item in found: + print("Tekst:", item['DetectedText']) + print("Type:", item['Type']) + print("Confidence", item['Confidence']) + print("Id", item['Id']) + if item['Type'] != 'LINE': + print("ParentId:", item['ParentId']) + if (item['Type'] == 'WORD') or (item['Type'] == 'LINE'): + print("value conversion") + temp = item['DetectedText'] + print("x", temp, "x") + temp = re.sub("[^0-9]", "", temp) + print("x", temp, "x") + nw = 0 + try: + nw = int(temp) + except Exception: + print("Conversion failed") + pass + print("Nw: ", nw) + if (base_low <= nw and nw <= base_up): + print("erg waarschijnlijk juist:") + reading = temp + print(temp) + print(base_low, nw, base_up) + print("-----------") + return reading + + +def reader(file): + with open(file, "rb") as image_file: + encoded_string = image_file.read() + return encoded_string + + +def takereading(): + # download the url contents in binary format + r = requests.get(config_json["url"], auth=(config_json["user"], config_json["password"])) + # open method to open a file on your system and write the contents + with open("/config/www/meter.jpg", "wb") as code: + code.write(r.content) + print("File downloaded") + + +def publishMQTT(reading): + mqttc = mqtt.Client("meter_reader") + mqttc.username_pw_set(username=config_json["mqtt_user"], password=config_json["mqtt_pwd"]) + mqttc.connect(config_json["mqtt_host"], int(config_json["mqtt_port"])) + mqttc.publish(config_json["mqtt_topic"], reading, retain=True) + mqttc.disconnect() + + +def publishhiloMQTT(low, high): + mqttc = mqtt.Client("meter_reader") + mqttc.username_pw_set(username=config_json["mqtt_user"], password=config_json["mqtt_pwd"]) + mqttc.connect(config_json["mqtt_host"], int(config_json["mqtt_port"])) + mqttc.publish("home/band/low", str(low), retain=True) + mqttc.publish("home/band/high", str(high), retain=True) + mqttc.disconnect() + + +if __name__ == '__main__': + baseline = int(config_json["baseline"]) + base_low = baseline - int(config_json["under"]) + base_up = baseline + int(config_json["over"]) + while True: + print("Start") + try: + takereading() + print("foto action finished") + reading = processor(base_low, baseline, base_up) + if reading != "": + print("Reading = ok = ", reading) + baseline = int(reading) + base_low = baseline - int(config_json["under"]) + base_up = baseline + int(config_json["over"]) + publishMQTT(reading) + publishhiloMQTT(base_low, base_up) + else: + base_low = base_low - int(config_json["under"]) + base_up = base_up + int(config_json["over"]) + publishhiloMQTT(base_low, base_up) + except Exception: + print("Unexpected error:", sys.exc_info()) + print("OCR failed. Will try again later.") + time.sleep(int(config_json["upd_interval"])) diff --git a/meter_reader/run.sh b/meter_reader/run.sh new file mode 100644 index 0000000..1ed314c --- /dev/null +++ b/meter_reader/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e + +python3 ocr_aws.py +