#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Plugin installation:
# wget "https://pasternok.org/sources/sensehat.py?raw" -O /etc/munin/plugins/sensehat
# chmod +x /etc/munin/plugins/sensehat
# echo -e "\n[sensehat]\nuser root" >> /etc/munin/plugin-conf.d/munin-node
# systemctl restart munin-node

### config
ADJUSTMENT_FACTOR = -9.5

### code - do not change anything below here
__author__ = "Damian Pasternok <my_forename at pasternok.org>"
__version__ = "0.1.1"
__date__ = "2016/10/17"
__copyright__ = "Copyright (C) 2016 Damian Pasternok"
__license__ = "GPL"

import argparse
from sense_hat import SenseHat
from time import sleep

class Sensors(object):
    def __init__(self):
        sense = SenseHat()

        self.temp_humidity = sense.get_temperature_from_humidity()

        # pressure temperature sensor spikes workaround
        temp_pressure = sense.get_temperature_from_pressure()
        self.temp_pressure = temp_pressure

        for i in range(5):
            sleep(0.5)
            temp_pressure = sense.get_temperature_from_pressure()

            if temp_pressure < self.temp_pressure:
                self.temp_pressure = temp_pressure

        self.temp_average = (self.temp_humidity + self.temp_pressure) / 2
        self.temp_adjusted = self.temp_average + ADJUSTMENT_FACTOR

        self.pressure = sense.get_pressure()
        self.humidity = sense.get_humidity()

class Munin(Sensors):
    def __init__(self):
        pass

    def config(self):
        return """multigraph sensehat_temperature
graph_category sensehat
graph_title Sense HAT Temperature
graph_vlabel temperature (C)
temp_humidity.label temperature (humidity sensor)
temp_pressure.label temperature (pressure sensor)
temp_average.label average temperature
temp_adjusted.label adjusted temperature
temp_adjusted.draw LINE2

multigraph sensehat_pressure
graph_args --units-exponent 0 --lower-limit 900 --upper-limit 1100
graph_scale no
graph_category sensehat
graph_title Sense HAT Pressure
graph_vlabel pressure (hPA)
pressure.label pressure

multigraph sensehat_humidity
graph_category sensehat
graph_title Sense HAT Humidity
graph_vlabel relative humidity (%)
humidity.label humidity"""

    def data(self):
        super(Munin, self).__init__()

        return """multigraph sensehat_temperature
temp_humidity.value %.2f
temp_pressure.value %.2f
temp_average.value %.2f
temp_adjusted.value %.2f

multigraph sensehat_pressure
pressure.value %.2f

multigraph sensehat_humidity
humidity.value %.2f""" % (
        self.temp_humidity, self.temp_pressure,
        self.temp_average, self.temp_adjusted,
        self.pressure, self.humidity)

def main():
    munin = Munin()

    parser = argparse.ArgumentParser(description="Raspberry PI Sense HAT 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()