From 4d9e708cdf82a233462a90b52578ebd38e880a6d Mon Sep 17 00:00:00 2001 From: L3D Date: Wed, 27 Mar 2024 03:33:19 +0100 Subject: [PATCH] Adding simple server and client script --- .gitignore | 3 +++ README.md | 9 ++++++++- client_example.py | 29 ++++++++++++++++++++++++++++ requirements.txt | 3 +++ server.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 client_example.py create mode 100644 requirements.txt create mode 100644 server.py diff --git a/.gitignore b/.gitignore index 12abaa3..7720357 100644 --- a/.gitignore +++ b/.gitignore @@ -196,3 +196,6 @@ cython_debug/ # .nfs files are created when an open file is removed but is still being accessed .nfs* +# Venv +python/ +venv/ diff --git a/README.md b/README.md index c0ee5be..580072a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ # waffle_counter_backend -Prometheus backend and data collecting tool for waffle buzzer \ No newline at end of file +Prometheus backend and data collecting tool for waffle buzzer + +## Orientierung +In diesem Git Repo ist der Server Teil. +Die Clients die gleichzeitig auch die LED ansteuern sind auf https://git.l3d.ch/c3woc/rpi_zero_neopixel_buzzer.git zu finden. + +## Abhängigkeiten +requirements.txt diff --git a/client_example.py b/client_example.py new file mode 100644 index 0000000..763a721 --- /dev/null +++ b/client_example.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import requests +import json + +# Define the API endpoint URL +api_url = 'http://localhost:8042/buzzed' # Update with your actual API URL + +# Data payload to be sent as JSON +data_payload = { + 'buzzer': 'buzzer1', + 'waffle_ready': 1 +} + +# Convert the payload to JSON format +json_payload = json.dumps(data_payload) + +# Set the headers to indicate JSON content +headers = {'Content-Type': 'application/json'} + +# Send POST request to the API endpoint +response = requests.post(api_url, data=json_payload, headers=headers) + +# Check the response status +if response.status_code == 200: + print('Data added successfully!') +else: + print(f'Error adding data: {response.text}') + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..efd8914 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +prometheus_client +requests diff --git a/server.py b/server.py new file mode 100644 index 0000000..b41d296 --- /dev/null +++ b/server.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from flask import Flask, request, jsonify +from prometheus_client import Counter, generate_latest, multiprocess, REGISTRY, CollectorRegistry + +app = Flask(__name__) + +# Create a new CollectorRegistry to avoid duplicate timeseries error +custom_registry = CollectorRegistry() + +# Define Prometheus Counters for each input device +c3woc_b1_counter = Counter('c3woc_buzzer1_pressed_total', 'Total number the buzzer 1 from C3WOC is pressed', registry=custom_registry) +c3woc_b2_counter = Counter('c3woc_buzzer2_pressed_total', 'Total number the buzzer 2 from C3WOC is pressed', registry=custom_registry) +c3woc_b3_counter = Counter('c3woc_buzzer3_pressed_total', 'Total number the buzzer 3 from C3WOC is pressed', registry=custom_registry) +c3woc_b4_counter = Counter('c3woc_buzzer4_pressed_total', 'Total number the buzzer 4 from C3WOC is pressed', registry=custom_registry) +# Define more counters as needed for other devices +# TODO: dynamic counter creation + +@app.route('/metrics') +def metrics(): + # Generate and return Prometheus metrics format using custom registry + return generate_latest(registry=custom_registry) + +@app.route('/buzzed', methods=['POST']) +def add_data(): + data = request.get_json() + device = data.get('buzzer') + waffles_counted = data.get('waffle_ready') + + match device: + case 'buzzer1': + c3woc_b1_counter.inc(waffles_counted) + return jsonify({'message': f'Data added for {device}'}), 200 + case 'buzzer2': + c3woc_b2_counter.inc(waffles_counted) + return jsonify({'message': f'Data added for {device}'}), 200 + case 'buzzer3': + c3woc_b3_counter.inc(waffles_counted) + return jsonify({'message': f'Data added for {device}'}), 200 + case 'buzzer4': + c3woc_b4_counter.inc(waffles_counted) + return jsonify({'message': f'Data added for {device}'}), 200 + case _: + return jsonify({'error': 'Invalid device or buzzer specified'}), 400 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=8042) +