Contents

监控你的仪表

问题

监测氧化还原电位(ORP)是用来检测水质的数据,最常用在游泳池水质,也用在淡水鱼缸,心在很多礁岩缸中也开始使用。对很多初学者来说,靠肉眼判断出水质和珊瑚的状态,以及应该采取的措施是极度困难的。ORP至少给很多玩家一个希望,一个可以测量水中有机物污染物或水族箱的总体健康状况的数据,但事实上解释这些读数会比想象中复杂,各种因素都会影响ORP水平。 /reeftank.webp

每次检查ORP数据都又一种不真实,因为感觉数字并未变化。所以用一个系统自动且更有效地跟踪和可视化数据的必要性还是存在,所以PrometheusGrafana这样的工具就会上场。 /orp.webp

方案

捕捉图像

  • 硬件设置:将相机或网络摄像头与Python程序集成,以捕捉水族箱ORP、pH和温度读数的图像。这一步需要把相机正确定位,以便始终捕捉到显示器或传感器的清晰图像。
  • 图像捕捉脚本:编写一个定期拍照的Python脚本
  • 以下是树莓派上安装的摄像头:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    response = subprocess.call(["raspistill", "-o", image_file])
    
    # 以RGB模式打开图像
    Original_Image = Image.open(image_file)
    Rotated_Image = Original_Image.rotate(270, expand=1)
    
    # 裁剪上述尺寸的图像
    # (不会更改原始图像)
    Final_Image = Rotated_Image.crop((left, top, right, bottom))
    

文本识别

  • OCR实现:使用光学字符识别(OCR)服务,例如Google Vision API,处理图像并提取数值。这涉及将图像发送到API,API返回检测到的文本。
  • 数据提取:在接收到OCR结果后,解析文本以提取相关值,如ORP、pH和温度。确保有错误处理,以管理任何OCR不准确之处。
  • 以下是Google Vision:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    headers = {
    "Content-Type": "application/json; charset=utf-8",
    "x-goog-user-project": "redseawatcher",
    "Authorization": "Bearer " + token,
    }
    response = requests.post(request_url, data=data_json, headers=headers)
    
    token_info = response.json()
    for i in token_info["responses"]:
    	for words in i["textAnnotations"]:
    		description = words["description"]
    		break
    texts = description.splitlines()
    

数据存储

  • 数据格式:以结构化格式存储提取的数据,如CSV、JSON或直接存储到数据库中。此文件或数据库应包括每组读数的时间戳,以便跟踪随时间的变化。
  • 自动化:自动化此过程,以便数据采集和存储定期进行,确保始终可获得最新信息。
  • 以下是一个python脚本:
    1
    2
    3
    4
    5
    
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    data = '{"time":"' + now + '","content":"' + metrics + '"}\\\\\\\\n'
    data_file = os.path.join(os.path.dirname(__file__), "meter.data")
    with open(data_file, "a") as file:
    	file.write(data)
    

实现

Web应用开发

  • Flask设置:使用Flask,这是一个轻量级的Python Web框架,创建一个简单的Web应用程序。此应用程序可以作为显示收集数据的界面。
  • 用户界面:开发一个基本的用户界面,显示最新的读数和历史数据趋势。用户界面可以包括表格、图表或其他视觉元素,以使数据更易理解。
  • API端点:在Flask应用中实现API端点,以提供原始数据访问,这些数据可以被Prometheus等其他服务使用。
  • 以下是一个基于Flask的API点:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@app.route("/metrics")
def metrics():

# 从文件中读取令牌
data_file = os.path.join(os.path.dirname(__file__), "meter.data")

with open(data_file, "rb") as file:
	data_json = tail(file, 1).decode("utf-8")

try:
	data = json.loads(data_json)
except Exception as e:
	value = ""

成果

  • 使用Prometheus进行数据采集(Snap)

    • Prometheus集成:配置Prometheus从Flask应用程序的API端点抓取数据。这涉及在Prometheus中设置抓取目标,指定Flask应用的URL。
    • 指标转换:将数据转换为Prometheus兼容的指标。这可能需要将数据格式化为Prometheus可以读取的基于文本的展示格式。
  • 使用Grafana进行数据可视化(apt)

    /gra.webp

  • Grafana仪表板设置:将Grafana连接到Prometheus数据库。Grafana将使用Prometheus收集的数据创建视觉仪表板。

  • 自定义仪表板:在Grafana中设计自定义仪表板以可视化数据。您可以创建图表、图形和警报,以实时或在指定时间段内监控ORP、pH和温度水平。

  • 警报和通知:在Grafana中设置警报,以便在任何读数超出预定义的安全范围时通知您。警报可以通过电子邮件、短信或其他通信渠道发送。