示例#1
0
def create_ac_state_data_frame(self):
    # reset UpdateRequestMask flags
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.AC_STATE)
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.POWER_STATE)
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.TARGET_TEMP)
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.FAN_STATE)
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.ZONE)

    data = C_DaikinDataAcState

    data[7] = self._DaikinClimateSettings_Object.AcStateModeValue +\
        (self._DaikinClimateSettings_Object.PowerOnState << 3)
    data[8] = self._DaikinClimateSettings_Object.CoolSetTemp
    data[10] = self._DaikinClimateSettings_Object.HeatSetTemp
    data[12] = (self._DaikinClimateSettings_Object.CoolFanState.FanMode.value << 4) + \
               (resolve_fan_speed_for_data_frame(self._DaikinClimateSettings_Object.CoolFanState.FanSpeed) & 0x0F)
    data[13] = (self._DaikinClimateSettings_Object.HeatFanState.FanMode << 4) + \
               (resolve_fan_speed_for_data_frame(self._DaikinClimateSettings_Object.HeatFanState.FanSpeed) & 0x0F)
    data[14] = get_zone_bit_mask_from_zone_state(self)

    return data
def set_climate_fan_speed(self, fan_speed):
    # Check FanSpeed is valid
    if isinstance(fan_speed, FanSpeed) and (fan_speed != FanSpeed.NA):
        # Check for current mode (cool/heat). Default (0) is FAN, so no need to check for 'init' value.
        # Check FanMode based on FanSpeed
        if (fan_speed == FanSpeed.LOW) or (fan_speed == FanSpeed.MED) or (
                fan_speed == FanSpeed.HIGH):
            fan_mode = FanMode.FAN
        elif (fan_speed == FanSpeed.AUTO_LOW) or (
                fan_speed == FanSpeed.AUTO_MED) or (fan_speed
                                                    == FanSpeed.AUTO_HIGH):
            fan_mode = FanMode.AUTO
        else:
            fan_mode = FanMode.MULTI_ZONING

        # HEAT
        if get_climate_mode(self) == AcStateMode.MODE_HEAT:
            # Update 'heat' variables
            if self._DaikinClimateSettings_Object.HeatFanState.FanSpeed != fan_speed or \
                    self._DaikinClimateSettings_Object.HeatFanState.FanMode != fan_mode:
                self._DaikinClimateSettings_Object.HeatFanState.FanSpeed = fan_speed
                self._DaikinClimateSettings_Object.HeatFanState.FanMode = fan_mode
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.FAN_STATE)
        # COOL / FAN
        elif get_climate_mode(
                self) == AcStateMode.MODE_COOL or get_climate_mode(
                    self) == AcStateMode.MODE_FAN:
            # Update 'cool' variables
            if self._DaikinClimateSettings_Object.CoolFanState.FanSpeed != fan_speed or \
                    self._DaikinClimateSettings_Object.CoolFanState.FanMode != fan_mode:
                self._DaikinClimateSettings_Object.CoolFanState.FanSpeed = fan_speed
                self._DaikinClimateSettings_Object.CoolFanState.FanMode = fan_mode
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.FAN_STATE)
        # AUTO/FAN
        elif get_climate_mode(self) == AcStateMode.MODE_AUTO:
            # Update both (as per app)
            if self._DaikinClimateSettings_Object.CoolFanState.FanSpeed != fan_speed or \
                    self._DaikinClimateSettings_Object.CoolFanState.FanMode != fan_mode or \
                    self._DaikinClimateSettings_Object.HeatFanState.FanSpeed != fan_speed or \
                    self._DaikinClimateSettings_Object.HeatFanState.FanMode != fan_mode:
                self._DaikinClimateSettings_Object.CoolFanState.FanSpeed = fan_speed
                self._DaikinClimateSettings_Object.CoolFanState.FanMode = fan_mode
                self._DaikinClimateSettings_Object.HeatFanState.FanSpeed = fan_speed
                self._DaikinClimateSettings_Object.HeatFanState.FanMode = fan_mode
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.FAN_STATE)
        # DRY/OFF
        else:
            # Speed/Fan settings ignored.
            pass
示例#3
0
def create_sensor_set_data_frame(self):
    # Reset UpdateRequestMask flag
    self._DaikinClimateSettings_Object.UpdateRequestMask = \
        UpdateRequest.reset_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.TEMP_SENSOR)

    data = C_DaikinDataSensorSelect
    data[7] = resolve_sensor_name_to_index(
        self, self._DaikinClimateInfo_Object.TempSensorName[
            self._DaikinClimateSettings_Object.SelectedSensor])
    return data
def set_climate_temp_sensor(self, sensor_index):
    if isinstance(sensor_index, SensorIndex):
        if self._DaikinClimateSettings_Object.SelectedSensor != sensor_index:
            # limit value to Sensor2, as Outdoor/Refrigerant are not part of frame
            # and only used for internal indexing of temperatures.
            if sensor_index <= SensorIndex.Sensor2:
                self._DaikinClimateSettings_Object.SelectedSensor = sensor_index
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.TEMP_SENSOR)
def set_target_climate_temp(self, temp):
    # HEAT
    if get_climate_mode(self) == AcStateMode.MODE_HEAT:
        # check temp is with heating range.
        if is_temp_within_heat_range(self, temp):
            # update 'heat' variables
            if self._DaikinClimateSettings_Object.HeatSetTemp != temp:
                self._DaikinClimateSettings_Object.HeatSetTemp = temp
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.TARGET_TEMP)
    # COOL
    elif get_climate_mode(self) == AcStateMode.MODE_COOL:
        # check temp is within cooling range
        if is_temp_within_cool_range(self, temp):
            # update 'cool' variables
            if self._DaikinClimateSettings_Object.CoolSetTemp != temp:
                self._DaikinClimateSettings_Object.CoolSetTemp = temp
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.TARGET_TEMP)
    # AUTO
    elif get_climate_mode(self) == AcStateMode.MODE_AUTO:
        # check temp is within heat/cool range.
        if is_temp_within_cool_range(self, temp) and is_temp_within_heat_range(
                self, temp):
            # update both
            if self._DaikinClimateSettings_Object.HeatSetTemp != temp or \
                    self._DaikinClimateSettings_Object.CoolSetTemp != temp:
                self._DaikinClimateSettings_Object.HeatSetTemp = temp
                self._DaikinClimateSettings_Object.CoolSetTemp = temp
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask,
                                           UpdateRequest.TARGET_TEMP)
    # DRY/FAN/OFF
    else:
        # Temp setting ignored.
        pass
def set_climate_mode(self, ac_mode):

    if ac_mode == AcStateMode.MODE_OFF:
        # Turn off unit
        if self._DebugModeLevel >= 1:
            _LOGGER.debug('TurnOff AC')
        update_power_state(self, AcPowerState.OFF)
        # leave AcStateModeValue as previous
    else:
        # turn on unit and set mode
        if self._DaikinClimateSettings_Object.AcStateModeValue != ac_mode or \
                self._DaikinClimateSettings_Object.PowerOnState != AcPowerState.ON:
            self._DaikinClimateSettings_Object.AcStateModeValue = ac_mode
            # Set mask that update has occurred and to ignore current update if in progress
            self._DaikinClimateSettings_Object.UpdateRequestMask = \
                UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.AC_STATE)
            update_power_state(self, AcPowerState.ON)
def update_zone_state(self, zone_index, zone_state):
    # Check each bit and set corresponding zone. Check for 'max' zones supported
    if isinstance(zone_state, ZoneState):
        if zone_index < self._DaikinClimateInfo_Object.NumberOfZones:
            if self._DaikinClimateSettings_Object.Zone[
                    zone_index] != zone_state:
                self._DaikinClimateSettings_Object.Zone[
                    zone_index] = zone_state
                # Set mask that update has occurred and to ignore current update if in progress
                self._DaikinClimateSettings_Object.UpdateRequestMask = \
                    UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.ZONE)

    # Check to make sure all zones are not switched off
    any_zone_active = False
    for x in range(0, self._DaikinClimateInfo_Object.NumberOfZones):
        if self._DaikinClimateSettings_Object.Zone[x] == ZoneState.ACTIVE:
            any_zone_active = True

    if not any_zone_active:
        _LOGGER.error(
            'No Zone selected. This may cause permanent damage to your AC system!'
        )
def update_power_state(self, ac_power_state):
    if self._DaikinClimateSettings_Object.PowerOnState != ac_power_state:
        self._DaikinClimateSettings_Object.PowerOnState = ac_power_state
        # Set mask that update has occurred and to ignore current update if in progress
        self._DaikinClimateSettings_Object.UpdateRequestMask = \
            UpdateRequest.set_flag(self._DaikinClimateSettings_Object.UpdateRequestMask, UpdateRequest.POWER_STATE)