From ceb37ab427be43f7c6e3e9a3511aa8bad1d18511 Mon Sep 17 00:00:00 2001 From: Will Lachance Date: Tue, 14 Jan 2025 16:54:19 -0500 Subject: [PATCH 1/3] Quick example script for sending telemetry --- telemetry/send_telemetry.py | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 telemetry/send_telemetry.py diff --git a/telemetry/send_telemetry.py b/telemetry/send_telemetry.py new file mode 100755 index 0000000..8536d19 --- /dev/null +++ b/telemetry/send_telemetry.py @@ -0,0 +1,75 @@ +import dataclasses +import os +import sys +from typing import List, Union + +import requests + + +VOLTUS_API_URL = os.getenv("VOLTUS_API_URL", "https://api.voltus.co/2022-04-15") +VOLTUS_API_KEY = os.getenv("VOLTUS_API_KEY") + +s = requests.Session() +s.headers.update({"X-Voltus-API-Key": VOLTUS_API_KEY, "Accept": "application/json"}) + +@dataclasses.dataclass +class TelemetryReading: + interval_seconds: int + meter_id: str + timestamp: str + units: str + value: float + +@dataclasses.dataclass +class ControllableLoadReading: + interval_seconds: int + site_id: str + timestamp: str + units: str + value: float + +def _send_telemetry(url: str, datatype: str, readings: Union[List[TelemetryReading], List[ControllableLoadReading]]): + try: + r = s.post(url, json={ + datatype: [dataclasses.asdict(reading) for reading in readings] + }) + if r.status_code != 200: + sys.stderr.write(f"Failed to send telemetry: {r.text}\n") + sys.exit(1) + except requests.exceptions.RequestException as e: + sys.stderr.write(f"Failed to send telemetry: {e}\n") + sys.exit(1) + + +if __name__ == "__main__": + if len(sys.argv) < 7: + sys.stderr.write("Usage: python send_telemetry.py ") + sys.exit(1) + + if VOLTUS_API_KEY is None: + sys.stderr.write("VOLTUS_API_KEY environment variable is unset") + sys.exit(1) + + telemetry_type = sys.argv[1] + reading_class = None + if telemetry_type == "telemetry": + url = f"{VOLTUS_API_URL}/telemetry" + reading_class = TelemetryReading + elif telemetry_type == "controllable_load": + url = f"{VOLTUS_API_URL}/telemetry/controllable-load" + reading_class = ControllableLoadReading + else: + sys.stderr.write("Invalid telemetry type. Must be 'telemetry' or 'controllable_load'") + sys.exit(1) + + # Create a telemetry reading object + reading = reading_class( + int(sys.argv[2]), # interval seconds + sys.argv[3], # site or meter id + timestamp=sys.argv[4], + units=sys.argv[5], + value=float(sys.argv[6]) + ) + + # Attempt to send it + _send_telemetry(url, telemetry_type, [reading]) From 73b829441cd59b11ee94ae1df1e7b227a187416f Mon Sep 17 00:00:00 2001 From: Will Lachance Date: Wed, 15 Jan 2025 07:55:21 -0500 Subject: [PATCH 2/3] Update telemetry/send_telemetry.py Co-authored-by: Sophia Coplin --- telemetry/send_telemetry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telemetry/send_telemetry.py b/telemetry/send_telemetry.py index 8536d19..48b7ecf 100755 --- a/telemetry/send_telemetry.py +++ b/telemetry/send_telemetry.py @@ -43,7 +43,7 @@ def _send_telemetry(url: str, datatype: str, readings: Union[List[TelemetryReadi if __name__ == "__main__": if len(sys.argv) < 7: - sys.stderr.write("Usage: python send_telemetry.py ") + sys.stderr.write("Usage: python send_telemetry.py ") sys.exit(1) if VOLTUS_API_KEY is None: From e3b79d12a2a4eca12062669ddeed661138306aa8 Mon Sep 17 00:00:00 2001 From: Will Lachance Date: Wed, 15 Jan 2025 07:56:42 -0500 Subject: [PATCH 3/3] Apply suggestions from code review --- telemetry/send_telemetry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/telemetry/send_telemetry.py b/telemetry/send_telemetry.py index 48b7ecf..6615d7c 100755 --- a/telemetry/send_telemetry.py +++ b/telemetry/send_telemetry.py @@ -47,7 +47,7 @@ def _send_telemetry(url: str, datatype: str, readings: Union[List[TelemetryReadi sys.exit(1) if VOLTUS_API_KEY is None: - sys.stderr.write("VOLTUS_API_KEY environment variable is unset") + sys.stderr.write("VOLTUS_API_KEY environment variable is unset\n") sys.exit(1) telemetry_type = sys.argv[1] @@ -59,7 +59,7 @@ def _send_telemetry(url: str, datatype: str, readings: Union[List[TelemetryReadi url = f"{VOLTUS_API_URL}/telemetry/controllable-load" reading_class = ControllableLoadReading else: - sys.stderr.write("Invalid telemetry type. Must be 'telemetry' or 'controllable_load'") + sys.stderr.write("Invalid telemetry type. Must be 'telemetry' or 'controllable_load'\n") sys.exit(1) # Create a telemetry reading object