Files
Home-Assistant-Addons/meter-reader/ocr_aws.py
T
2020-04-02 17:40:04 -04:00

136 lines
4.4 KiB
Python

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"]))