Пример #1
0
    def register(self):

        # Registriere Temperatur
        unique_id = "sensor.dht-{}.{}.c".format(
            self._config.get("DHT/dev/type", "22"),
            self._config.get("DHT/name", "DHT"))
        self._temp_topic = self._config.get_autodiscovery_topic(
            conf.autodisc.Component.SENSOR,
            "{}_C".format(self._config.get("DHT/name", "DHT")),
            conf.autodisc.SensorDeviceClasses.TEMPERATURE)

        self._sensor_celsius = Sensor(self.__logger.getChild("Celsuis"),
                                      self._plugin_manager,
                                      "{}_C".format(
                                          self._config.get("DHT/name", "DHT")),
                                      SensorDeviceClasses.TEMPERATURE,
                                      "°C",
                                      unique_id=unique_id,
                                      value_template="{{ value_json.now }}",
                                      json_attributes=True)
        self._sensor_celsius.register()
        self._sensor_celsius.addFilter(
            TooHighFilter(40.0, self.__logger.getChild("Celsius")))
        self._sensor_celsius.addFilter(
            RangedFilter(5.0, 5, self.__logger.getChild("Celsius")))

        # Registriere Luftfeuchte
        unique_id = "sensor.dht-{}.{}.rh".format(
            self._config.get("DHT/dev/type", "22"),
            self._config.get("DHT/name", "DHT"),
        )
        self._sensor_humidity = Sensor(self.__logger.getChild("Humidity"),
                                       self._plugin_manager,
                                       "{}_Rh".format(
                                           self._config.get("DHT/name",
                                                            "DHT")),
                                       SensorDeviceClasses.HUMIDITY,
                                       "%",
                                       unique_id=unique_id,
                                       value_template="{{ value_json.now }}",
                                       json_attributes=True)
        self._sensor_humidity.register()
        self._sensor_humidity.addFilter(
            TooHighFilter(100.0, self.__logger.getChild("Humidity")))
        self._sensor_humidity.addFilter(
            RangedFilter(5.0, 5, self.__logger.getChild("Humidity")))

        self._daily_job = schedule.every().day.at("00:01")
        self._daily_job.do(lambda: self._reset_daily())

        self._job = schedule.every(self._config.get("DHT/update_seconds",
                                                    60)).seconds
        self._job.do(lambda: self.send_update())
Пример #2
0
    def register(self):
        self.__logger.debug("Sensoren für {} werden erstellt...".format(
            self._paths))
        for d in self._paths:
            unique_id = "sensor.w1-{}.{}".format(d["i"], d["n"])
            sensor = Sensor(self.__logger,
                            self._plugin_manager,
                            d["n"],
                            SensorDeviceClasses.TEMPERATURE,
                            "C",
                            unique_id=unique_id,
                            value_template="{{ value_json.now }}",
                            json_attributes=True,
                            ownOfflineTopic=True)
            sensor.addFilter(TooHighFilter(500.0, self.__logger))
            sensor.addFilter(
                DeltaFilter(self._config["w1t/diff/{}".format(d["i"])],
                            self.__logger))
            sensor.register()
            d["d"] = sensor

        self._daily_job = schedule.every().day.at("00:00")
        self._daily_job.do(lambda: self._reset_daily())

        self._job = schedule.every(60).seconds
        self._job.do(lambda: self.send_update())
        self.send_update()
Пример #3
0
    def register(self):
        t = ad.Topics.get_std_devInf()
        n = self._config.get("name", "CPU Temp")
        self._shed_Job = schedule.every(self._config.get("update_secs",
                                                         15)).seconds
        self._shed_Job.do(self.send_update)

        self._sensor = Sensor(self.__logger, self._plugin_manager, n,
                              SensorDeviceClasses.TEMPERATURE, "C")
        self._sensor.register()
        self._sensor.addFilter(
            MinTimeElapsed.MinTimeElapsedFilter(5.0, self.__logger))
        self._sensor.addFilter(DeltaFilter.DeltaFilter(2.25, self.__logger))
        self._sensor.addFilter(
            TooHighFilter.TooHighFilter(150.0, self.__logger))
Пример #4
0
    def __init__(self, logger: Logger, pman: PluginManager,
                 serial: Connection) -> None:
        super().__init__()
        self._log = logger.getChild("MPPT")
        self._pman = pman
        self._vcserial = serial

        self.battery_voltage = Sensor(
            self._log,
            self._pman,
            "Batterie V",
            Autodiscovery.SensorDeviceClasses.VOLTAGE,
            measurement_unit="V",
            device=self._vcserial._device,
            value_template="{{value_json.v}}",
            json_attributes=True)
        self.battery_voltage.addFilter(
            DeltaFilter(0.05, self._log.getChild("BAT_V")))

        self.battery_current = Sensor(
            self._log,
            self._pman,
            "Batterie (A)",
            Autodiscovery.SensorDeviceClasses.CURRENT,
            measurement_unit="A",
            device=self._vcserial._device,
            value_template="{{value_json.a}}",
            json_attributes=True)

        self.panel_voltage = Sensor(self._log,
                                    self._pman,
                                    "Panel (V)",
                                    Autodiscovery.SensorDeviceClasses.VOLTAGE,
                                    measurement_unit="V",
                                    device=self._vcserial._device,
                                    value_template="{{value_json.v}}",
                                    json_attributes=True)
        self.panel_voltage.addFilter(DeltaFilter(1, self._log.getChild("VPV")))

        self.panel_power = Sensor(self._log,
                                  self._pman,
                                  "Panel (W)",
                                  Autodiscovery.SensorDeviceClasses.POWER,
                                  measurement_unit="W",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.w}}",
                                  json_attributes=True)
        self.panel_power.addFilter(DeltaFilter(1, self._log.getChild("PPV")))

        self.load = Sensor(self._log,
                           self._pman,
                           "Last",
                           Autodiscovery.SensorDeviceClasses.CURRENT,
                           measurement_unit="A",
                           device=self._vcserial._device,
                           value_template="{{value_json.a}}",
                           json_attributes=True)
        self.load_enabled = BinarySensor(
            self._log,
            self._pman,
            "Last",
            Autodiscovery.BinarySensorDeviceClasses.POWER,
            device=self._vcserial._device)

        self.yield_total = Sensor(self._log,
                                  self._pman,
                                  "Gesammelt (total)",
                                  Autodiscovery.SensorDeviceClasses.ENERGY,
                                  measurement_unit="kWh",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.kWh}}",
                                  json_attributes=True)
        self.yield_today = Sensor(self._log,
                                  self._pman,
                                  "Gesammelt (Heute)",
                                  Autodiscovery.SensorDeviceClasses.ENERGY,
                                  measurement_unit="kWh",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.kWh}}",
                                  json_attributes=True)
        self.yield_yesterday = Sensor(self._log,
                                      self._pman,
                                      "Gesammelt (Gestern)",
                                      Autodiscovery.SensorDeviceClasses.ENERGY,
                                      measurement_unit="kWh",
                                      device=self._vcserial._device,
                                      value_template="{{value_json.kWh}}",
                                      json_attributes=True)

        self.max_power_today = Sensor(self._log,
                                      self._pman,
                                      "Maximal Strom (Heute)",
                                      Autodiscovery.SensorDeviceClasses.POWER,
                                      measurement_unit="W",
                                      device=self._vcserial._device,
                                      value_template="{{value_json.w}}",
                                      json_attributes=True)
        self.max_power_yesterday = Sensor(
            self._log,
            self._pman,
            "Maximal Strom (Gestern)",
            Autodiscovery.SensorDeviceClasses.POWER,
            measurement_unit="W",
            device=self._vcserial._device,
            value_template="{{value_json.w}}",
            json_attributes=True)

        self.error = BinarySensor(
            self._log,
            self._pman,
            "Fehler",
            Autodiscovery.BinarySensorDeviceClasses.PROBLEM,
            "",
            device=self._vcserial._device,
            value_template="{{value_json.is_error}}",
            json_attributes=True)
        self.state_of_operation = Sensor(
            self._log,
            self._pman,
            "Status",
            Autodiscovery.SensorDeviceClasses.GENERIC_SENSOR,
            "",
            device=self._vcserial._device)
        self.mppt = Sensor(self._log,
                           self._pman,
                           "MPPT",
                           Autodiscovery.SensorDeviceClasses.GENERIC_SENSOR,
                           "",
                           device=self._vcserial._device)
Пример #5
0
class MPPT(CONST.VEDirectDevice):
    _callbacks = {}

    def __init__(self, logger: Logger, pman: PluginManager,
                 serial: Connection) -> None:
        super().__init__()
        self._log = logger.getChild("MPPT")
        self._pman = pman
        self._vcserial = serial

        self.battery_voltage = Sensor(
            self._log,
            self._pman,
            "Batterie V",
            Autodiscovery.SensorDeviceClasses.VOLTAGE,
            measurement_unit="V",
            device=self._vcserial._device,
            value_template="{{value_json.v}}",
            json_attributes=True)
        self.battery_voltage.addFilter(
            DeltaFilter(0.05, self._log.getChild("BAT_V")))

        self.battery_current = Sensor(
            self._log,
            self._pman,
            "Batterie (A)",
            Autodiscovery.SensorDeviceClasses.CURRENT,
            measurement_unit="A",
            device=self._vcserial._device,
            value_template="{{value_json.a}}",
            json_attributes=True)

        self.panel_voltage = Sensor(self._log,
                                    self._pman,
                                    "Panel (V)",
                                    Autodiscovery.SensorDeviceClasses.VOLTAGE,
                                    measurement_unit="V",
                                    device=self._vcserial._device,
                                    value_template="{{value_json.v}}",
                                    json_attributes=True)
        self.panel_voltage.addFilter(DeltaFilter(1, self._log.getChild("VPV")))

        self.panel_power = Sensor(self._log,
                                  self._pman,
                                  "Panel (W)",
                                  Autodiscovery.SensorDeviceClasses.POWER,
                                  measurement_unit="W",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.w}}",
                                  json_attributes=True)
        self.panel_power.addFilter(DeltaFilter(1, self._log.getChild("PPV")))

        self.load = Sensor(self._log,
                           self._pman,
                           "Last",
                           Autodiscovery.SensorDeviceClasses.CURRENT,
                           measurement_unit="A",
                           device=self._vcserial._device,
                           value_template="{{value_json.a}}",
                           json_attributes=True)
        self.load_enabled = BinarySensor(
            self._log,
            self._pman,
            "Last",
            Autodiscovery.BinarySensorDeviceClasses.POWER,
            device=self._vcserial._device)

        self.yield_total = Sensor(self._log,
                                  self._pman,
                                  "Gesammelt (total)",
                                  Autodiscovery.SensorDeviceClasses.ENERGY,
                                  measurement_unit="kWh",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.kWh}}",
                                  json_attributes=True)
        self.yield_today = Sensor(self._log,
                                  self._pman,
                                  "Gesammelt (Heute)",
                                  Autodiscovery.SensorDeviceClasses.ENERGY,
                                  measurement_unit="kWh",
                                  device=self._vcserial._device,
                                  value_template="{{value_json.kWh}}",
                                  json_attributes=True)
        self.yield_yesterday = Sensor(self._log,
                                      self._pman,
                                      "Gesammelt (Gestern)",
                                      Autodiscovery.SensorDeviceClasses.ENERGY,
                                      measurement_unit="kWh",
                                      device=self._vcserial._device,
                                      value_template="{{value_json.kWh}}",
                                      json_attributes=True)

        self.max_power_today = Sensor(self._log,
                                      self._pman,
                                      "Maximal Strom (Heute)",
                                      Autodiscovery.SensorDeviceClasses.POWER,
                                      measurement_unit="W",
                                      device=self._vcserial._device,
                                      value_template="{{value_json.w}}",
                                      json_attributes=True)
        self.max_power_yesterday = Sensor(
            self._log,
            self._pman,
            "Maximal Strom (Gestern)",
            Autodiscovery.SensorDeviceClasses.POWER,
            measurement_unit="W",
            device=self._vcserial._device,
            value_template="{{value_json.w}}",
            json_attributes=True)

        self.error = BinarySensor(
            self._log,
            self._pman,
            "Fehler",
            Autodiscovery.BinarySensorDeviceClasses.PROBLEM,
            "",
            device=self._vcserial._device,
            value_template="{{value_json.is_error}}",
            json_attributes=True)
        self.state_of_operation = Sensor(
            self._log,
            self._pman,
            "Status",
            Autodiscovery.SensorDeviceClasses.GENERIC_SENSOR,
            "",
            device=self._vcserial._device)
        self.mppt = Sensor(self._log,
                           self._pman,
                           "MPPT",
                           Autodiscovery.SensorDeviceClasses.GENERIC_SENSOR,
                           "",
                           device=self._vcserial._device)

    def register_entities(self):
        self.battery_current.register()
        self.battery_voltage.register()
        self.error.register()
        self.load.register()
        self.load_enabled.register()
        self.max_power_today.register()
        self.max_power_yesterday.register()
        self.panel_power.register()
        self.panel_voltage.register()
        self.state_of_operation.register()
        self.yield_today.register()
        self.yield_total.register()
        self.yield_yesterday.register()
        self.mppt.register()

        self._callbacks["V"] = self.update_battery_voltage
        self._callbacks["VPV"] = self.update_panel_voltage
        self._callbacks["PPV"] = self.update_panel_power
        self._callbacks["I"] = self.update_battery_current
        self._callbacks["IL"] = self.update_load_current
        self._callbacks["LOAD"] = self.update_load_state
        self._callbacks["H19"] = self.update_yield_total
        self._callbacks["H20"] = self.update_yield_today
        self._callbacks["H21"] = self.update_max_power_today
        self._callbacks["H22"] = self.update_yield_yesterday
        self._callbacks["H23"] = self.update_max_power_yesterday
        self._callbacks["ERR"] = self.update_ERROR
        self._callbacks["CS"] = self.update_state_operation
        self._callbacks["MPPT"] = self.update_mppt

        self._vcserial.set_callbacks(self._callbacks)

    def update_battery_voltage(self, mV: str):
        mV = int(mV)
        js = {"v": mV / 1000}
        self.battery_voltage(js, keypath="v")

    def update_panel_voltage(self, mV: str):
        mV = int(mV)
        js = {"v": mV / 1000}
        self.panel_voltage(js, keypath="v")

    def update_panel_power(self, w: str):
        w = int(w)
        js = {"w": w}
        self.panel_power(js, keypath="w")

    def update_battery_current(self, mA: str):
        mA = int(mA)
        js = {"a": mA / 1000}
        self.battery_current(json.dumps(js))

    def update_load_current(self, mA: str):
        mA = int(mA)
        js = {"a": mA / 1000}
        self.load(json.dumps(js))

    def update_load_state(self, on: str):
        self.load_enabled.turnOnOff(on == "ON")

    def update_yield_total(self, kWh: str):
        kWh = float(kWh)
        js = {"kWh": kWh * 0.01}
        self.yield_total(json.dumps(js))

    def update_yield_today(self, kWh: str):
        kWh = float(kWh)
        js = {"kWh": kWh * 0.01}
        self.yield_today(json.dumps(js))

    def update_max_power_today(self, w: str):
        w = int(w)
        js = {"w": w}
        self.max_power_today(json.dumps(js))

    def update_yield_yesterday(self, kWh: str):
        kWh = float(kWh)
        js = {"kWh": kWh * 0.01}
        self.yield_yesterday(json.dumps(js))

    def update_max_power_yesterday(self, w: str):
        w = int(w)
        js = {"w": w}
        self.max_power_yesterday(json.dumps(js))

    def update_ERROR(self, err: str):
        err = int(err)
        err_str = CONST.ERR[err]

        js = {
            "is_error": 0 if err_str == CONST.ERR[0] else 1,
            "Errno": err,
            "Fehler": err_str
        }
        self.error.turn(js)

    def update_state_operation(self, state: str):
        state = int(state)
        self.state_of_operation(CONST.CS.get(state, "Unbekannt"))

    def update_mppt(self, state: str):
        if state == "0":
            self.mppt("AUS")
        elif state == "1":
            self.mppt("Voltage or Current limited")
        elif state == "2":
            self.mppt("MPPT Tracker active")

    def resend_entities(self):
        self.battery_current.resend()
        self.battery_voltage.reset()
        self.error.reset()
        self.load.reset()
        self.load_enabled.reset()
        self.max_power_today.reset()
        self.max_power_yesterday.reset()
        self.panel_power.reset()
        self.panel_voltage.reset()
        self.state_of_operation.reset()
        self.yield_today.reset()
        self.yield_total.reset()
        self.yield_yesterday.reset()
        self.mppt.reset()
Пример #6
0
class DHT22(PluginInterface):
    _temp_topic = None
    _rh_topic = None
    _sensor_celsius: Sensor = None
    _sensor_humidity: Sensor = None

    def _reset_daily(self):
        for i in ["°c", "rH%"]:

            path_min = "DHT/stat/{}/min".format(i)
            path_max = "DHT/stat/{}/max".format(i)
            path_lmin = "DHT/stat/{}/lmin".format(i)
            path_lmax = "DHT/stat/{}/lmax".format(i)

            if self._config[path_min] == "RESET":
                continue
            elif self._config[path_max] == "RESET":
                continue

            current_min = self._config.get(path_min, "n/A")
            current_max = self._config.get(path_max, "n/A")

            self.__logger.debug("{} = {}".format(path_lmin, current_min))
            self._config.sett(path_lmin, current_min)
            self.__logger.debug("{} = {}".format(path_lmax, current_max))
            self._config.sett(path_lmax, current_max)

            self.__logger.debug("reset daily stats")
            self._config[path_min] = "RESET"
            self._config[path_max] = "RESET"

    def __init__(self, client: mclient.Client, opts: conf.BasicConfig,
                 logger: logging.Logger, device_id: str):
        self._config = opts
        self.__client = client
        self.__logger = logger.getChild("w1Temp")
        self._prev_deg = [None, None]
        self.dht = None
        self._plugin_manager = None

        if isinstance(self._config.get("DHT", None), list):
            devices = self._config["DHT"]
            self._config["DHT"] = {}
            self._config["DHT/dev"] = devices

        sensor_map = {
            '11': Adafruit_DHT.DHT11,
            '22': Adafruit_DHT.DHT22,
            '2302': Adafruit_DHT.AM2302
        }

        self.dht = sensor_map.get(self._config.get("DHT/dev/type", "22"),
                                  Adafruit_DHT.DHT22)

        self.__lastTemp = 0.0
        self.__ava_topic = device_id

    def register(self):

        # Registriere Temperatur
        unique_id = "sensor.dht-{}.{}.c".format(
            self._config.get("DHT/dev/type", "22"),
            self._config.get("DHT/name", "DHT"))
        self._temp_topic = self._config.get_autodiscovery_topic(
            conf.autodisc.Component.SENSOR,
            "{}_C".format(self._config.get("DHT/name", "DHT")),
            conf.autodisc.SensorDeviceClasses.TEMPERATURE)

        self._sensor_celsius = Sensor(self.__logger.getChild("Celsuis"),
                                      self._plugin_manager,
                                      "{}_C".format(
                                          self._config.get("DHT/name", "DHT")),
                                      SensorDeviceClasses.TEMPERATURE,
                                      "°C",
                                      unique_id=unique_id,
                                      value_template="{{ value_json.now }}",
                                      json_attributes=True)
        self._sensor_celsius.register()
        self._sensor_celsius.addFilter(
            TooHighFilter(40.0, self.__logger.getChild("Celsius")))
        self._sensor_celsius.addFilter(
            RangedFilter(5.0, 5, self.__logger.getChild("Celsius")))

        # Registriere Luftfeuchte
        unique_id = "sensor.dht-{}.{}.rh".format(
            self._config.get("DHT/dev/type", "22"),
            self._config.get("DHT/name", "DHT"),
        )
        self._sensor_humidity = Sensor(self.__logger.getChild("Humidity"),
                                       self._plugin_manager,
                                       "{}_Rh".format(
                                           self._config.get("DHT/name",
                                                            "DHT")),
                                       SensorDeviceClasses.HUMIDITY,
                                       "%",
                                       unique_id=unique_id,
                                       value_template="{{ value_json.now }}",
                                       json_attributes=True)
        self._sensor_humidity.register()
        self._sensor_humidity.addFilter(
            TooHighFilter(100.0, self.__logger.getChild("Humidity")))
        self._sensor_humidity.addFilter(
            RangedFilter(5.0, 5, self.__logger.getChild("Humidity")))

        self._daily_job = schedule.every().day.at("00:01")
        self._daily_job.do(lambda: self._reset_daily())

        self._job = schedule.every(self._config.get("DHT/update_seconds",
                                                    60)).seconds
        self._job.do(lambda: self.send_update())

    def stop(self):
        schedule.cancel_job(self._daily_job)
        schedule.cancel_job(self._job)

    def sendStates(self):
        self.send_update(True)

    def sendTemperature(self, degree, force):
        new_temp = degree

        if new_temp != self._prev_deg[0] or force:
            ii = "°c"

            path_min = "DHT/stat/{}/min".format(ii)
            path_max = "DHT/stat/{}/max".format(ii)
            path_lmin = "DHT/stat/{}/lmin".format(ii)
            path_lmax = "DHT/stat/{}/lmax".format(ii)

            cmin = self._config.get(path_min, "RESET")
            cmax = self._config.get(path_max, "RESET")

            if cmin == "RESET" or cmin == "n/A":
                cmin = new_temp
            elif cmin > new_temp:
                cmin = new_temp
            if cmax == "RESET" or cmax == "n/A":
                cmax = new_temp
            elif cmax < new_temp:
                cmax = new_temp

            self._config[path_min] = cmin
            self._config[path_max] = cmax

            js = {
                "now": new_temp,
                "Heute höchster Wert": cmax,
                "Heute tiefster Wert": cmin,
                "Gestern höchster Wert": self._config.get(path_lmax, "n/A"),
                "Gestern tiefster Wert": self._config.get(path_lmin, "n/A")
            }
            if new_temp != -1000 and self._prev_deg == -1000:
                self.__client.publish(self._temp_topic.ava_topic,
                                      "online",
                                      retain=True)
                self._sensor_celsius(js, keypath="now")
            elif new_temp != -1000:
                self._sensor_celsius(js, keypath="now")
            else:
                self.__client.publish(self._temp_topic.ava_topic,
                                      "offline",
                                      retain=True)
            self._prev_deg[0] = new_temp

    def sendHumidity(self, rel_hum, force):
        new_temp = rel_hum

        if new_temp != self._prev_deg[1] or force:
            ii = "rH%"

            path_min = "DHT/stat/{}/min".format(ii)
            path_max = "DHT/stat/{}/max".format(ii)
            path_lmin = "DHT/stat/{}/lmin".format(ii)
            path_lmax = "DHT/stat/{}/lmax".format(ii)

            cmin = self._config.get(path_min, "RESET")
            cmax = self._config.get(path_max, "RESET")

            if cmin == "RESET" or cmin == "n/A":
                cmin = new_temp
            elif cmin > new_temp:
                cmin = new_temp
            if cmax == "RESET" or cmax == "n/A":
                cmax = new_temp
            elif cmax < new_temp:
                cmax = new_temp

            self._config[path_min] = cmin
            self._config[path_max] = cmax

            js = {
                "now": new_temp,
                "Heute höchster Wert": cmax,
                "Heute tiefster Wert": cmin,
                "Gestern höchster Wert": self._config.get(path_lmax, "n/A"),
                "Gestern tiefster Wert": self._config.get(path_lmin, "n/A")
            }
            if new_temp != -1000 and self._prev_deg == -1000:
                self.__client.publish(self._rh_topic.ava_topic,
                                      "online",
                                      retain=True)
                self._sensor_humidity(js, keypath="now")
            elif new_temp != -1000:
                self._sensor_humidity(js, keypath="now")
            else:
                self.__client.publish(self._rh_topic.ava_topic,
                                      "offline",
                                      retain=True)
            self._prev_deg[1] = new_temp

    def send_update(self, force=False, insane=0):
        humidity, temperature = Adafruit_DHT.read_retry(
            self.dht, self._config.get("DHT/dev/pin", 22))
        humidity = round(humidity, ndigits=1)
        temperature = round(temperature, ndigits=1)

        self.sendTemperature(temperature, force)
        self.sendHumidity(humidity, force)

    def set_pluginManager(self, pm):
        self._plugin_manager = pm
Пример #7
0
class RaspberryPiCpuTemp:
    _shed_Job = None
    _sensor: Sensor
    _plugin_manager: PluginManager

    def __init__(self, client: mclient.Client, opts: conf.BasicConfig,
                 logger: logging.Logger, device_id: str):
        self._config = conf.PluginConfig(opts, "rpiCPUtemp")
        self.__client = client
        self.__logger = logger.getChild("PiCpuTemp")
        self._prev_deg = 0
        if self._config.get("diff", None) is None:
            self._config["diff"] = 1.5
        self._callables = []
        self._open_file()

    def _open_file(self):
        self._file = open("/sys/class/thermal/thermal_zone0/temp")

    def add_temperature_call(self, call):
        if callable(call):
            self._callables.append(call)

    def register(self):
        t = ad.Topics.get_std_devInf()
        n = self._config.get("name", "CPU Temp")
        self._shed_Job = schedule.every(self._config.get("update_secs",
                                                         15)).seconds
        self._shed_Job.do(self.send_update)

        self._sensor = Sensor(self.__logger, self._plugin_manager, n,
                              SensorDeviceClasses.TEMPERATURE, "C")
        self._sensor.register()
        self._sensor.addFilter(
            MinTimeElapsed.MinTimeElapsedFilter(5.0, self.__logger))
        self._sensor.addFilter(DeltaFilter.DeltaFilter(2.25, self.__logger))
        self._sensor.addFilter(
            TooHighFilter.TooHighFilter(150.0, self.__logger))

    def set_pluginManager(self, pm):
        self._plugin_manager = pm

    def stop(self):
        schedule.cancel_job(self._shed_Job)
        self._file.close()

    def sendStates(self):
        self.send_update(True)

    @staticmethod
    def get_temperatur_file(f):
        data = f.read()
        f.seek(0)
        return round(int(data) / 1000, 1)

    @staticmethod
    def get_temperatur(p) -> float:
        if os.path.isfile(p):
            data = None
            with open(p) as f:
                data = f.read()
                f.close()
            if data is not None:
                return round(int(data) / 1000, 2)
        return -1000

    def send_update(self, force=False):
        try:
            new_temp = self.get_temperatur_file(self._file)
        except ValueError:
            self._open_file()
            return

        for call in self._callables:
            try:
                call(new_temp)
            except:
                self.__logger.exception("Temperature callback error")

        self._sensor(new_temp)