#!/usr/bin/python3 # vim: set fileencoding=utf-8 : # # Munin plugin to monitor the pumps and fan speeds # of a pelletronic/pelletronic touch 2.0 # # Copyright 2013 Guido Guenther # # Licesnse: GPLv3 # # depends: python-requests # # FIXME: This currently doesn't probe the connected systems # #%# capabilities=autoconf #%# family=contrib import requests import os import re import sys import json username = os.getenv('username', 'oekofen') password = os.getenv('password', username) debug = os.getenv('debug') url = os.getenv('url') # The items we want to plot: items = {"CAPPL:LOCAL.L_hk[0].pumpe": 'Heat Circuit Pump', "CAPPL:LOCAL.L_pu[0].pumpe": "Buffer Load Pump", "CAPPL:FA[0].L_luefterdrehzahl": 'Burner Fan Speed', "CAPPL:FA[0].L_saugzugdrehzahl": 'Flue Gas Fan Speed', } def canon(name): return re.sub(r"[^a-zA-Z0-9_]", "_", name) def get_name(item): name = None if item['name'] in items: if ".L_pu[" in item['name']: name = "Buffer Load Pump %d" elif ".L_hk[" in item['name']: name = "Heat Circuit Pump %d" if name: return name % (int(item['name'].split('.')[-2][-2]) + 1) else: if item['shortText'] != '???': return item['shortText'] else: return items[item['name']] else: return None def percent_val(item): if item['unitText'] == '%': return int(item['value']) else: # assume On|Off return int(item['value']) * 100 def print_config(url): print("""graph_title Pellematic Pumps graph_vlabel Pump power in percent graph_category Heating graph_info This graph shows the pumping power of the different pumps """) draw = "AREA" out = fetch_raw(url) for item in out: name = get_name(item) if name: print("%s.label %s" % (canon(name), name)) print("%s.type GAUGE" % canon(name)) thickness = 1 if name.endswith('soll') else 2 print("%s.draw %s" % (canon(name), draw)) if draw == "AREA": draw = "STACK" def fetch_raw(url): # Perform authentication and get the cookie auth_formdata = {'language': 'en', 'username': username, 'password': password, 'submit': 'Login', } r = requests.post(url, data=auth_formdata) pksession = r.cookies['pksession'] cookies = { 'pksession': pksession, 'language': 'en' } params = { 'action': 'get', 'attr': '1', } # These are the headers used by the supplied application # It mostly doesn't matter what we pass but the backend # breaks with a lua error without a Accept-Language header: headers = {'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept-Language': 'en', } # The items to fetch are passed as simple json string payload = json.dumps(list(items.keys())) r = requests.post(url, data=payload, params=params, cookies=cookies, headers=headers) ret = r.json() if debug: print(ret, file=sys.stderr) return ret def fetch_values(url): out = fetch_raw(url) for item in out: name = get_name(item) if name: cname = canon(name) print("%s.value %s" % (cname, percent_val(item))) def main(args): if not url: print("No url configured", file=sys.stderr) return 1 if len(args) > 1: if args[1] in [ 'autoconf', 'detect' ]: try: fetch_raw(url) print("yes") return 0 except: print("no") return 1 elif args[1] == 'config': try: print_config(url) except Exception as e: print("Failed to fetch config: '%s'" % e, file=sys.stderr) return 1 return 0 try: fetch_values(url) except Exception as e: print("Failed to fetch values: '%s'" % e, file=sys.stderr) return 1 return 0 if __name__ == "__main__": sys.exit(main(sys.argv))