#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Plugin installation: # wget https://pasternok.org/sources/tuya_temp_hum.py?raw -O /etc/munin/plugins/tuya_temp_hum # chmod +x /etc/munin/plugins/tuya_temp_hum # # Do not forget to configure periodic data retrieval from Tuya platform. # A sample script is available at https://pasternok.org/sources/tuya_temp_hum_update.py ### config DEVICES = [ { "name": "T & H Sensor 1", "path": "/tmp/sensors/tuya_temp_hum_sensor1.tmp", }, { "name": "T & H Sensor 2", "path": "/tmp/sensors/tuya_temp_hum_sensor2.tmp", }, ] ### code - do not change anything below here __author__ = "Damian Pasternok <my_forename at pasternok.org>" __version__ = "0.1.0" __date__ = "2025/01/29" __copyright__ = "Copyright (C) 2025 Damian Pasternok" __license__ = "GPL" import argparse import json class Tuya: def __init__(self): self.data = list() for device in DEVICES: with open(device.get("path")) as fh: device_object = device device_object["data"] = json.load(fh) self.data.append(device_object) class Munin(Tuya): def __init__(self): pass def config(self): super(Munin, self).__init__() out = """graph_title Tuya WiFi Temperature & Humidity sensors graph_scale no graph_category smarthome graph_vlabel environment conditions """ for i, device in enumerate(self.data): for param in (("temperature", "C"), ("humidity", "%")): out += f"""{param[0]}{i}.label {self.data[i].get("name") or f"Generic T & H Sensor #{i}"} {param[0]} [{param[1]}]\n""" return out.rstrip() def data(self): super(Munin, self).__init__() out = "" for i, device in enumerate(self.data): for param in (("temperature", 0, 10), ("humidity", 1, 1)): out += f"""{param[0]}{i}.value {self.data[i].get("data").get("result")[param[1]].get("value") / param[2]}\n""" return out.rstrip() def main(): munin = Munin() parser = argparse.ArgumentParser(description="Tuya WiFi Temperature & Humidity Sensors Munin Plugin.") parser.add_argument("config", help="print graph configuration", nargs="?") args = parser.parse_args() if args.config == "config": print(munin.config()) elif not args.config: print(munin.data()) else: parser.print_help() if __name__ == "__main__": main()