import paho.mqtt.client as paho from numpyencoder import NumpyEncoder import prometheus_client import snmpOmada import mikrotik import json import time import os from influxdb_client import InfluxDBClient, Point, WritePrecision from influxdb_client.client.write_api import SYNCHRONOUS def append(points): influxc = InfluxDBClient( url = "http://%s:8086" % INFLUXDB_HOST, token = os.environ["DOCKER_INFLUXDB_INIT_ADMIN_TOKEN"], org = os.environ["DOCKER_INFLUXDB_INIT_ORG"] ) influxc.ping() for measurement in points: # print(json.dumps({**measurement["tags"], **measurement["fields"]}, indent = 4, cls = NumpyEncoder)) mqttc.publish( "tele/SwitchSNMP/%s/%s/SENSOR" % (measurement["tags"]["switch_host"], str(measurement["tags"]["port"])), json.dumps({**measurement["tags"], **measurement["fields"]}, cls = NumpyEncoder) ) for field in measurement["fields"].keys(): try: float(measurement["fields"][field]) except ValueError: continue else: switch_power.labels( field = field, type = measurement["tags"]["type"], port = str(measurement["tags"]["port"]), port_name = measurement["tags"]["port_name"], host = measurement["tags"]["switch_host"] ).set(float(measurement["fields"][field])) prometheus_client.push_to_gateway("%s:9091" % PUSHGATEWAY_HOST, job = "switchSNMP", registry = registry) write_api = influxc.write_api(write_options = SYNCHRONOUS) write_api.write( os.environ["DOCKER_INFLUXDB_INIT_BUCKET"], os.environ["DOCKER_INFLUXDB_INIT_ORG"], points, write_precision = WritePrecision.S ) if __name__ == "__main__": env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "config.env") if os.path.exists(env_path): import dotenv dotenv.load_dotenv(dotenv_path = env_path) INFLUXDB_HOST = "dns.athome" MQTT_HOST = "dns.athome" PUSHGATEWAY_HOST = "dns.athome" else: MQTT_HOST = "mqtt" INFLUXDB_HOST = "influxdb" PUSHGATEWAY_HOST = "pushgateway" mqttc = paho.Client("reg.reaweb.uk/switch-snmp", clean_session = True) mqttc.username_pw_set(os.environ["MQTT_USER"], password = os.environ["MQTT_PASSWD"]) mqttc.connect(MQTT_HOST, 1883, 60) registry = prometheus_client.CollectorRegistry() switch_power = prometheus_client.Gauge( "switch_power", "POE switch power usage metrics from Omada and Mikrotik switches, using Omada SNMP names", labelnames = ["field", "type", "port", "port_name", "host"], registry = registry ) points = snmpOmada.get_points() + mikrotik.get_points() mikrotik.print_points(points) append(points) mqttc.disconnect()