Climate.py not updating

I stucked :frowning: my climate.py not update-ing… it calls only the first time the update… how can I reach in program code it refreshing? maybe change the update interval?

"""Support for myIO thermostats."""
import logging
from datetime import timedelta

from homeassistant.util import slugify  # entity_id friendly string converter

from homeassistant.components.climate import ClimateDevice

from homeassistant.helpers.entity import Entity
from homeassistant.const import (
    CONF_NAME,
    TEMP_CELSIUS,
    ATTR_TEMPERATURE,
    TEMP_FAHRENHEIT,
)
from homeassistant.components.climate.const import (
    ATTR_TARGET_TEMP_HIGH,
    ATTR_TARGET_TEMP_LOW,
    CURRENT_HVAC_COOL,
    CURRENT_HVAC_HEAT,
    CURRENT_HVAC_IDLE,
    FAN_AUTO,
    FAN_ON,
    HVAC_MODE_AUTO,
    HVAC_MODE_COOL,
    HVAC_MODE_HEAT,
    HVAC_MODE_HEAT_COOL,
    HVAC_MODE_OFF,
    PRESET_AWAY,
    PRESET_ECO,
    PRESET_NONE,
    SUPPORT_AUX_HEAT,
    SUPPORT_FAN_MODE,
    SUPPORT_PRESET_MODE,
    SUPPORT_SWING_MODE,
    SUPPORT_TARGET_HUMIDITY,
    SUPPORT_TARGET_TEMPERATURE,
    SUPPORT_TARGET_TEMPERATURE_RANGE,
)
from . import DOMAIN

_LOGGER = logging.getLogger(__name__)
SUPPORT_FLAGS = 0
SCAN_INTERVAL = timedelta(seconds=60)


async def async_setup_platform(hass, config, async_add_entities):
    """Set up the myIO-server platform."""
    _LOGGER.warning("Loading myIO-Server via platform config is deprecated")

    # Add defaults.

    # async_add_entities([Sensor()])


async def async_setup_entry(hass, config_entry, async_add_entities):
    """Add a weather entity from a config_entry."""
    _LOGGER.debug(
        "Loading "
        + config_entry.data[CONF_NAME]
        + " climate via platform async_setup_entry"
    )
    _id = 0

    _server_name = slugify(config_entry.data[CONF_NAME])
    _server_status = hass.states.get(_server_name + ".state").state
    # _server_attr = hass.states.get(_server_name + ".state").attributes
    _server_attr = hass.data[_server_name]

    _climate_entities = []

    if _server_status == "Online" or _server_status == "Refreshing":
        for _relay in _server_attr["relays"]:
            if _server_attr["relays"][_relay]["sensor"] != 0:
                _id = _server_attr["relays"][_relay]["id"]
                _climate_entities.append(MyIOThermostate(hass, _id, _server_name))
                _LOGGER.debug("WIN")

        try:
            for _sensor in _server_attr["PWM"]:
                if _server_attr["PWM"][_sensor]["sensor"] != 0:
                    _id = _sensor["id"]
                    _climate_entities.append(MyIOThermostate(hass, _id, _server_name))
        except:
            _LOGGER.debug("version <2.4.3")

    async_add_entities(_climate_entities, True)


class MyIOThermostate(ClimateDevice):
    """Implementation of a myIO-Server."""

    SCAN_INTERVAL = timedelta(seconds=5)

    def __init__(self, hass, _id, _server_name):
        """Initialize the sensor."""

        def id_converter(_eepromID):
            """Defining Sensor ID by EEPROMID"""
            for _id in self._server_attr["sensors"]:
                if self._server_attr["sensors"][_id]["id"] == _eepromID:
                    return _id

        self._server_name = _server_name
        self._server_attr = hass.data[_server_name]
        self._id = _id
        self.entity_id = f"climate.{_server_name}_{self._id}"
        self._state = 0
        self._name = ""
        self._sensor = 0
        self._sensorON = 0
        self._sensorOFF = 0

        if _id <= 64:
            self._state = self._server_attr["relays"][str(self._id - 1)]["state"]
            self._name = self._server_attr["relays"][str(self._id - 1)]["description"]
            self._sensor = id_converter(
                _eepromID=self._server_attr["relays"][str(self._id - 1)]["sensor"]
            )
            self._sensorON = (
                self._server_attr["relays"][str(self._id - 1)]["sensorON"] / 10
            )
            self._sensorOFF = (
                self._server_attr["relays"][str(self._id - 1)]["sensorOFF"] / 10
            )

        target_temperature = None
        target_temperature_step = 0.1
        precision = 0.1
        current_temperature = self._server_attr["sensors"][self._sensor]["temp"] / 100
        target_temp_high = self._sensorOFF
        target_temp_low = self._sensorON
        hvac_modes = [HVAC_MODE_COOL, HVAC_MODE_HEAT]
        if self._sensorOFF > self._sensorON:
            hvac_mode = HVAC_MODE_HEAT
        else:
            hvac_mode = HVAC_MODE_COOL

        preset = "comfort"
        fan_mode = None
        target_humidity = None
        swing_mode = None
        hvac_action = None
        aux = None
        unit_of_measurement = TEMP_CELSIUS
        preset_modes = ["comfort"]
        current_humidity = None

        """Initialize the climate device."""
        self._unique_id = _id
        self._name = self._server_attr["relays"][str(self._id - 1)]["description"]
        self._support_flags = SUPPORT_FLAGS
        if target_temperature is not None:
            self._support_flags = self._support_flags | SUPPORT_TARGET_TEMPERATURE
        if preset is not None:
            self._support_flags = self._support_flags | SUPPORT_PRESET_MODE
        if fan_mode is not None:
            self._support_flags = self._support_flags | SUPPORT_FAN_MODE
        if target_humidity is not None:
            self._support_flags = self._support_flags | SUPPORT_TARGET_HUMIDITY
        if swing_mode is not None:
            self._support_flags = self._support_flags | SUPPORT_SWING_MODE
        if hvac_action is not None:
            self._support_flags = self._support_flags
        if aux is not None:
            self._support_flags = self._support_flags | SUPPORT_AUX_HEAT

        self._support_flags = self._support_flags | SUPPORT_TARGET_TEMPERATURE_RANGE
        self._target_temperature = target_temperature
        self._target_humidity = target_humidity
        self._unit_of_measurement = unit_of_measurement
        self._preset = preset
        self._preset_modes = preset_modes
        self._current_temperature = current_temperature
        self._current_humidity = current_humidity
        self._current_fan_mode = fan_mode
        self._hvac_action = hvac_action
        self._hvac_mode = hvac_mode
        self._aux = aux
        self._current_swing_mode = swing_mode
        self._fan_modes = ["On Low", "On High", "Auto Low", "Auto High", "Off"]
        self._hvac_modes = hvac_modes
        self._swing_modes = ["Auto", "1", "2", "3", "Off"]
        self._target_temperature_high = target_temp_high
        self._target_temperature_low = target_temp_low
        self._precision = precision
        self._target_temperature_step = target_temperature_step

    @property
    def device_info(self):
        """Return device info."""
        return {
            "identifiers": {
                # Serial numbers are unique identifiers within a specific domain
                (DOMAIN, self.unique_id)
            },
            "name": self.name,
        }

    @property
    def scan_interval(self):
        """Return the unique id."""
        return SCAN_INTERVAL

    @property
    def unique_id(self):
        """Return the unique id."""
        return self._unique_id

    @property
    def supported_features(self):
        """Return the list of supported features."""
        return self._support_flags

    @property
    def should_poll(self):
        """Return the polling state."""
        return False

    @property
    def name(self):
        """Return the name of the climate device."""
        return self._name

    @property
    def temperature_unit(self):
        """Return the unit of measurement."""
        return self._unit_of_measurement

    @property
    def current_temperature(self):
        """Return the current temperature."""
        return self._current_temperature

    @property
    def target_temperature(self):
        """Return the temperature we try to reach."""
        return self._target_temperature

    @property
    def target_temperature_high(self):
        """Return the highbound target temperature we try to reach."""
        return self._target_temperature_high

    @property
    def target_temperature_low(self):
        """Return the lowbound target temperature we try to reach."""
        return self._target_temperature_low

    @property
    def current_humidity(self):
        """Return the current humidity."""
        return self._current_humidity

    @property
    def target_humidity(self):
        """Return the humidity we try to reach."""
        return self._target_humidity

    @property
    def hvac_action(self):
        """Return current operation ie. heat, cool, idle."""
        return self._hvac_action

    @property
    def hvac_mode(self):
        """Return hvac target hvac state."""
        return self._hvac_mode

    @property
    def hvac_modes(self):
        """Return the list of available operation modes."""
        return self._hvac_modes

    @property
    def preset_mode(self):
        """Return preset mode."""
        return self._preset

    @property
    def preset_modes(self):
        """Return preset modes."""
        return self._preset_modes

    @property
    def is_aux_heat(self):
        """Return true if aux heat is on."""
        return self._aux

    @property
    def fan_mode(self):
        """Return the fan setting."""
        return self._current_fan_mode

    @property
    def fan_modes(self):
        """Return the list of available fan modes."""
        return self._fan_modes

    @property
    def swing_mode(self):
        """Return the swing setting."""
        return self._current_swing_mode

    @property
    def swing_modes(self):
        """List of available swing modes."""
        return self._swing_modes

    @property
    def precision(self):
        """return the precision."""
        return self._precision

    @property
    def target_temperature_step(self):
        """return the precision."""
        return self._target_temperature_step

    async def async_set_temperature(self, **kwargs):
        """Set new target temperatures."""
        if kwargs.get(ATTR_TEMPERATURE) is not None:
            self._target_temperature = kwargs.get(ATTR_TEMPERATURE)
        if (
            kwargs.get(ATTR_TARGET_TEMP_HIGH) is not None
            and kwargs.get(ATTR_TARGET_TEMP_LOW) is not None
        ):
            self._target_temperature_high = kwargs.get(ATTR_TARGET_TEMP_HIGH)
            self._target_temperature_low = kwargs.get(ATTR_TARGET_TEMP_LOW)
        self.async_write_ha_state()

    async def async_set_humidity(self, humidity):
        """Set new humidity level."""
        self._target_humidity = humidity
        self.async_write_ha_state()

    async def async_set_swing_mode(self, swing_mode):
        """Set new swing mode."""
        self._current_swing_mode = swing_mode
        self.async_write_ha_state()

    async def async_set_fan_mode(self, fan_mode):
        """Set new fan mode."""
        self._current_fan_mode = fan_mode
        self.async_write_ha_state()

    async def async_set_hvac_mode(self, hvac_mode):
        """Set new operation mode."""
        self._hvac_mode = hvac_mode
        self.async_write_ha_state()

    async def async_set_preset_mode(self, preset_mode):
        """Update preset_mode on."""
        self._preset = preset_mode
        self.async_write_ha_state()

    def turn_aux_heat_on(self):
        """Turn auxiliary heater on."""
        self._aux = True
        self.async_write_ha_state()

    def turn_aux_heat_off(self):
        """Turn auxiliary heater off."""
        self._aux = False
        self.async_write_ha_state()

    async def async_update(self):
        """Fetch new state data for the sensor.
        This is the only method that should fetch new data for Home Assistant.
        """
        _LOGGER.debug("UPDATE")
        self._server_attr = self.hass.data[self._server_name]
        self._target_temperature_low = (
            self._server_attr["relays"][str(self._id - 1)]["sensorON"] / 10
        )
        self._target_temperature_high = (
            self._server_attr["relays"][str(self._id - 1)]["sensorOFF"] / 10
        )
        self._current_temperature = (
            self._server_attr["sensors"][self._sensor]["temp"] / 100
        )


I think the problem was the missing should_poll - True … :blush:

    @property
    def should_poll(self) -> bool:        
        return True

yeah, it’s either HA polls your integration every SCAN_INTERVAL seconds or you send updates when they’re ready.