#!/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()