mirror of
https://github.com/Tafkas/fritzbox-munin.git
synced 2023-10-10 11:36:55 +00:00
smarthome: support for munin-dirtyconfig, power calculation from accumulated energy (less subsampling errors at costs of less precise momentary values at short time scales), total power values
This commit is contained in:
parent
37b1ba1158
commit
6fa1df1467
@ -44,8 +44,8 @@ def getSimplifiedDevices(debug=False):
|
|||||||
|
|
||||||
xhr_data = fh.get_xhr_content(server, session_id, PAGE)
|
xhr_data = fh.get_xhr_content(server, session_id, PAGE)
|
||||||
|
|
||||||
#if debug:
|
if debug:
|
||||||
# pp.pprint(xhr_data)
|
pp.pprint(xhr_data)
|
||||||
|
|
||||||
data = json.loads(xhr_data)
|
data = json.loads(xhr_data)
|
||||||
|
|
||||||
@ -170,14 +170,10 @@ def getSimplifiedDevices(debug=False):
|
|||||||
# end getSimplifiedDevices
|
# end getSimplifiedDevices
|
||||||
|
|
||||||
|
|
||||||
def get_smart_home_measurements(debug=False):
|
def print_smart_home_measurements(simpleDevices, debug=False):
|
||||||
"""get the current measurements (temperature, humidity, power, states, ...)"""
|
"""get the current measurements (temperature, humidity, power, states, ...)"""
|
||||||
|
|
||||||
|
|
||||||
simpleDevicesDict = getSimplifiedDevices(debug)
|
|
||||||
simpleDevices = sorted(simpleDevicesDict.values(), key = lambda x:x["id"])
|
|
||||||
|
|
||||||
|
|
||||||
print("multigraph temperatures")
|
print("multigraph temperatures")
|
||||||
|
|
||||||
for dev in simpleDevices:
|
for dev in simpleDevices:
|
||||||
@ -284,6 +280,18 @@ def get_smart_home_measurements(debug=False):
|
|||||||
print ("power{}.value {}".format(dev["id"], dev["powerInWatt"]))
|
print ("power{}.value {}".format(dev["id"], dev["powerInWatt"]))
|
||||||
|
|
||||||
|
|
||||||
|
print("")
|
||||||
|
print("multigraph powerAvg")
|
||||||
|
for dev in simpleDevices:
|
||||||
|
|
||||||
|
if dev["present"] and "energyInKWH" in dev:
|
||||||
|
# it is ok to use integer Joules here: 1 Joule in 5 min
|
||||||
|
# => 0.003 W precision => We don't care, the device doesn't have this precision
|
||||||
|
energyInJoule = int(dev["energyInKWH"] * 3600000)
|
||||||
|
devID = dev["id"]
|
||||||
|
print (f"powerAvg{devID}.value {energyInJoule:15}")
|
||||||
|
# end
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
print("multigraph energy")
|
print("multigraph energy")
|
||||||
for dev in simpleDevices:
|
for dev in simpleDevices:
|
||||||
@ -299,12 +307,17 @@ def get_smart_home_measurements(debug=False):
|
|||||||
print ("powerswitch{}.value {}".format(dev["id"], int(dev["powerSwitchOn"])))
|
print ("powerswitch{}.value {}".format(dev["id"], int(dev["powerSwitchOn"])))
|
||||||
|
|
||||||
|
|
||||||
|
def getDevices(debug=False):
|
||||||
|
|
||||||
|
simpleDevicesDict = getSimplifiedDevices(debug)
|
||||||
|
simpleDevices = sorted(simpleDevicesDict.values(), key = lambda x: x["displayName"])
|
||||||
|
|
||||||
|
return simpleDevices
|
||||||
|
# end getDevices
|
||||||
|
|
||||||
|
|
||||||
def print_config():
|
def print_config(simpleDevices, debug=False):
|
||||||
|
|
||||||
simpleDevicesDict = getSimplifiedDevices(debug = False)
|
|
||||||
simpleDevices = sorted(simpleDevicesDict.values(), key = lambda x: x["id"])
|
|
||||||
|
|
||||||
|
|
||||||
print("multigraph temperatures")
|
print("multigraph temperatures")
|
||||||
@ -519,6 +532,10 @@ def print_config():
|
|||||||
print("graph_vlabel Watt")
|
print("graph_vlabel Watt")
|
||||||
print("graph_category sensors")
|
print("graph_category sensors")
|
||||||
print("graph_scale no")
|
print("graph_scale no")
|
||||||
|
|
||||||
|
powerIdList = [f'power{dev["id"]}' for dev in simpleDevices if ( dev["present"] and "powerInWatt" in dev ) ]
|
||||||
|
print("graph_order total_power " + " ".join(powerIdList))
|
||||||
|
|
||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
for dev in simpleDevices:
|
for dev in simpleDevices:
|
||||||
@ -530,8 +547,40 @@ def print_config():
|
|||||||
print ("power{}.warning 1500" .format(dev["id"]))
|
print ("power{}.warning 1500" .format(dev["id"]))
|
||||||
print ("power{}.critical 2000" .format(dev["id"]))
|
print ("power{}.critical 2000" .format(dev["id"]))
|
||||||
print ("power{}.info Power [{} - {}]" .format(dev["id"], dev["model"], dev["identifier"]))
|
print ("power{}.info Power [{} - {}]" .format(dev["id"], dev["model"], dev["identifier"]))
|
||||||
|
# end if
|
||||||
|
# end if
|
||||||
|
|
||||||
|
|
||||||
|
print(f"total_power.label total")
|
||||||
|
print(f"total_power.cdef " + ",".join(powerIdList) + ",ADDNAN" * (len(powerIdList) - 1));
|
||||||
|
print(f"total_power.min 0")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("\n")
|
||||||
|
print("multigraph powerAvg")
|
||||||
|
print("graph_title AVM Fritz!Box SmartHome Power Average (from Energy)")
|
||||||
|
print("graph_vlabel W")
|
||||||
|
print("graph_category sensors")
|
||||||
|
print("graph_scale no")
|
||||||
|
|
||||||
|
powerAvgIdList = [f'powerAvg{dev["id"]}' for dev in simpleDevices if ( dev["present"] and "energyInKWH" in dev ) ]
|
||||||
|
print("graph_order total_powerAvg " + " ".join(powerAvgIdList))
|
||||||
|
|
||||||
|
print("\n")
|
||||||
|
|
||||||
|
for dev in simpleDevices:
|
||||||
|
if dev["present"] and "energyInKWH" in dev:
|
||||||
|
print ("powerAvg{}.label {}" .format(dev["id"], dev["displayName"]))
|
||||||
|
print ("powerAvg{}.type DERIVE" .format(dev["id"]))
|
||||||
|
print ("powerAvg{}.graph LINE" .format(dev["id"]))
|
||||||
|
print ("powerAvg{}.min 0" .format(dev["id"]))
|
||||||
|
print ("powerAvg{}.info Power Average [{} - {}]" .format(dev["id"], dev["model"], dev["identifier"]))
|
||||||
|
|
||||||
|
print(f"total_powerAvg.label total")
|
||||||
|
print(f"total_powerAvg.cdef " + ",".join(powerAvgIdList) + ",ADDNAN" * (len(powerAvgIdList) - 1));
|
||||||
|
print(f"total_powerAvg.min 0")
|
||||||
|
|
||||||
|
|
||||||
print("\n")
|
print("\n")
|
||||||
print("multigraph energy")
|
print("multigraph energy")
|
||||||
@ -539,6 +588,10 @@ def print_config():
|
|||||||
print("graph_vlabel kWh")
|
print("graph_vlabel kWh")
|
||||||
print("graph_category sensors")
|
print("graph_category sensors")
|
||||||
print("graph_scale no")
|
print("graph_scale no")
|
||||||
|
|
||||||
|
energyIdList = [f'energy{dev["id"]}' for dev in simpleDevices if ( dev["present"] and "energyInKWH" in dev ) ]
|
||||||
|
print("graph_order total_energy " + " ".join(energyIdList))
|
||||||
|
|
||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
for dev in simpleDevices:
|
for dev in simpleDevices:
|
||||||
@ -549,6 +602,10 @@ def print_config():
|
|||||||
print ("energy{}.min 0" .format(dev["id"]))
|
print ("energy{}.min 0" .format(dev["id"]))
|
||||||
print ("energy{}.info Energy [{} - {}]" .format(dev["id"], dev["model"], dev["identifier"]))
|
print ("energy{}.info Energy [{} - {}]" .format(dev["id"], dev["model"], dev["identifier"]))
|
||||||
|
|
||||||
|
print(f"total_energy.label total")
|
||||||
|
print(f"total_energy.cdef " + ",".join(energyIdList) + ",ADDNAN" * (len(energyIdList) - 1));
|
||||||
|
print(f"total_energy.min 0")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print("\n")
|
print("\n")
|
||||||
@ -575,15 +632,22 @@ def print_config():
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if len(sys.argv) == 2 and sys.argv[1] == 'config':
|
if len(sys.argv) == 2 and sys.argv[1] == 'config':
|
||||||
print_config()
|
devices = getDevices(debug = False)
|
||||||
|
print_config(devices)
|
||||||
|
if "MUNIN_CAP_DIRTYCONFIG" in os.environ and os.environ["MUNIN_CAP_DIRTYCONFIG"] == "1":
|
||||||
|
print("")
|
||||||
|
print_smart_home_measurements(devices, debug = False)
|
||||||
|
# end if DIRTY CONFIG
|
||||||
elif len(sys.argv) == 2 and sys.argv[1] == 'autoconf':
|
elif len(sys.argv) == 2 and sys.argv[1] == 'autoconf':
|
||||||
print('yes')
|
print('yes')
|
||||||
elif len(sys.argv) == 2 and sys.argv[1] == 'debug':
|
elif len(sys.argv) == 2 and sys.argv[1] == 'debug':
|
||||||
get_smart_home_measurements(True)
|
devices = getDevices(debug = True)
|
||||||
|
print_smart_home_measurements(devices, debug = True)
|
||||||
elif len(sys.argv) == 1 or len(sys.argv) == 2 and sys.argv[1] == 'fetch':
|
elif len(sys.argv) == 1 or len(sys.argv) == 2 and sys.argv[1] == 'fetch':
|
||||||
# Some docs say it'll be called with fetch, some say no arg at all
|
# Some docs say it'll be called with fetch, some say no arg at all
|
||||||
try:
|
try:
|
||||||
get_smart_home_measurements()
|
devices = getDevices(debug = False)
|
||||||
|
print_smart_home_measurements(devices, debug = False)
|
||||||
except:
|
except:
|
||||||
sys.exit("Couldn't retrieve fritzbox smarthome temperatures")
|
sys.exit("Couldn't retrieve fritzbox smarthome temperatures")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user