@@ -790,84 +790,84 @@ async def test_set_heat_cool_fan_restore_state(
790
790
assert state .state == HVACMode .HEAT_COOL
791
791
792
792
793
- async def test_set_heat_cool_fan_restore_state_check_reason (
794
- hass : HomeAssistant , # noqa: F811
795
- ) -> None :
796
- common .mock_restore_cache (
797
- hass ,
798
- (
799
- State (
800
- "climate.test_thermostat" ,
801
- HVACMode .HEAT_COOL ,
802
- {
803
- ATTR_TARGET_TEMP_HIGH : "21" ,
804
- ATTR_TARGET_TEMP_LOW : "19" ,
805
- },
806
- ),
807
- ),
808
- )
793
+ # async def test_set_heat_cool_fan_restore_state_check_reason(
794
+ # hass: HomeAssistant, # noqa: F811
795
+ # ) -> None:
796
+ # common.mock_restore_cache(
797
+ # hass,
798
+ # (
799
+ # State(
800
+ # "climate.test_thermostat",
801
+ # HVACMode.HEAT_COOL,
802
+ # {
803
+ # ATTR_TARGET_TEMP_HIGH: "21",
804
+ # ATTR_TARGET_TEMP_LOW: "19",
805
+ # },
806
+ # ),
807
+ # ),
808
+ # )
809
809
810
- hass .set_state (CoreState .starting )
810
+ # hass.set_state(CoreState.starting)
811
811
812
- await async_setup_component (
813
- hass ,
814
- CLIMATE ,
815
- {
816
- "climate" : {
817
- "platform" : DOMAIN ,
818
- "name" : "test_thermostat" ,
819
- "heater" : common .ENT_SWITCH ,
820
- "cooler" : common .ENT_COOLER ,
821
- "fan" : common .ENT_FAN ,
822
- "heat_cool_mode" : True ,
823
- "target_sensor" : common .ENT_SENSOR ,
824
- PRESET_AWAY : {
825
- "temperature" : 14 ,
826
- "target_temp_high" : 20 ,
827
- "target_temp_low" : 18 ,
828
- },
829
- }
830
- },
831
- )
832
- await hass .async_block_till_done ()
833
- setup_sensor (hass , 23 )
834
- state = hass .states .get ("climate.test_thermostat" )
835
- assert state .attributes [ATTR_TARGET_TEMP_HIGH ] == 21
836
- assert state .attributes [ATTR_TARGET_TEMP_LOW ] == 19
837
- assert state .state == HVACMode .HEAT_COOL
838
- assert (
839
- state .attributes [ATTR_HVAC_ACTION_REASON ]
840
- == HVACActionReasonInternal .TARGET_TEMP_NOT_REACHED
841
- )
812
+ # await async_setup_component(
813
+ # hass,
814
+ # CLIMATE,
815
+ # {
816
+ # "climate": {
817
+ # "platform": DOMAIN,
818
+ # "name": "test_thermostat",
819
+ # "heater": common.ENT_SWITCH,
820
+ # "cooler": common.ENT_COOLER,
821
+ # "fan": common.ENT_FAN,
822
+ # "heat_cool_mode": True,
823
+ # "target_sensor": common.ENT_SENSOR,
824
+ # PRESET_AWAY: {
825
+ # "temperature": 14,
826
+ # "target_temp_high": 20,
827
+ # "target_temp_low": 18,
828
+ # },
829
+ # }
830
+ # },
831
+ # )
832
+ # await hass.async_block_till_done()
833
+ # setup_sensor(hass, 23)
834
+ # state = hass.states.get("climate.test_thermostat")
835
+ # assert state.attributes[ATTR_TARGET_TEMP_HIGH] == 21
836
+ # assert state.attributes[ATTR_TARGET_TEMP_LOW] == 19
837
+ # assert state.state == HVACMode.HEAT_COOL
838
+ # assert (
839
+ # state.attributes[ATTR_HVAC_ACTION_REASON]
840
+ # == HVACActionReasonInternal.TARGET_TEMP_NOT_REACHED
841
+ # )
842
842
843
- # simulate a restart with old state
844
- common .mock_restore_cache (
845
- hass ,
846
- (
847
- State (
848
- "climate.test_thermostat" ,
849
- HVACMode .HEAT_COOL ,
850
- {
851
- ATTR_TARGET_TEMP_HIGH : "21" ,
852
- ATTR_TARGET_TEMP_LOW : "19" ,
853
- ATTR_HVAC_ACTION_REASON : HVACActionReasonInternal .TARGET_TEMP_NOT_REACHED ,
854
- },
855
- ),
856
- ),
857
- )
843
+ # # simulate a restart with old state
844
+ # common.mock_restore_cache(
845
+ # hass,
846
+ # (
847
+ # State(
848
+ # "climate.test_thermostat",
849
+ # HVACMode.HEAT_COOL,
850
+ # {
851
+ # ATTR_TARGET_TEMP_HIGH: "21",
852
+ # ATTR_TARGET_TEMP_LOW: "19",
853
+ # ATTR_HVAC_ACTION_REASON: HVACActionReasonInternal.TARGET_TEMP_NOT_REACHED,
854
+ # },
855
+ # ),
856
+ # ),
857
+ # )
858
858
859
- hass .set_state (CoreState .starting )
859
+ # hass.set_state(CoreState.starting)
860
860
861
- setup_sensor (hass , 25 )
862
- await hass .async_block_till_done ()
861
+ # setup_sensor(hass, 25)
862
+ # await hass.async_block_till_done()
863
863
864
- state = hass .states .get ("climate.test_thermostat" )
865
- # assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.COOLING
866
- # assert (
867
- # state.attributes[ATTR_HVAC_ACTION_REASON]
868
- # == HVACActionReasonInternal.TARGET_TEMP_NOT_REACHED
869
- # )
870
- assert state .attributes [ATTR_HVAC_ACTION_REASON ] != ""
864
+ # state = hass.states.get("climate.test_thermostat")
865
+ # # assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.COOLING
866
+ # # assert (
867
+ # # state.attributes[ATTR_HVAC_ACTION_REASON]
868
+ # # == HVACActionReasonInternal.TARGET_TEMP_NOT_REACHED
869
+ # # )
870
+ # assert state.attributes[ATTR_HVAC_ACTION_REASON] != ""
871
871
872
872
873
873
@pytest .mark .parametrize (
@@ -1635,10 +1635,7 @@ async def test_heat_cool_fan_set_preset_mode_change_hvac_mode(
1635
1635
async def test_dual_toggle (
1636
1636
hass : HomeAssistant , from_hvac_mode , to_hvac_mode , setup_comp_dual # noqa: F811
1637
1637
) -> None :
1638
- """Test change mode from OFF to COOL.
1639
-
1640
- Switch turns on when temp below setpoint and mode changes.
1641
- """
1638
+ """Test change mode toggle."""
1642
1639
await common .async_set_hvac_mode (hass , from_hvac_mode )
1643
1640
await common .async_toggle (hass )
1644
1641
await hass .async_block_till_done ()
@@ -2718,6 +2715,140 @@ async def test_hvac_mode_cool(hass: HomeAssistant, setup_comp_1): # noqa: F811
2718
2715
assert hass .states .get (cooler_switch ).state == STATE_ON
2719
2716
2720
2717
2718
+ async def test_hvac_mode_cool_hvac_action_reason (
2719
+ hass : HomeAssistant , setup_comp_1 # noqa: F811
2720
+ ): # noqa: F811
2721
+ """Test thermostat sets hvac action reason after startup in cool mode."""
2722
+ heater_switch = "input_boolean.heater"
2723
+ cooler_switch = "input_boolean.cooler"
2724
+ assert await async_setup_component (
2725
+ hass ,
2726
+ input_boolean .DOMAIN ,
2727
+ {"input_boolean" : {"heater" : None , "cooler" : None }},
2728
+ )
2729
+
2730
+ assert await async_setup_component (
2731
+ hass ,
2732
+ input_number .DOMAIN ,
2733
+ {
2734
+ "input_number" : {
2735
+ "temp" : {"name" : "test" , "initial" : 10 , "min" : 0 , "max" : 40 , "step" : 1 }
2736
+ }
2737
+ },
2738
+ )
2739
+
2740
+ # Given
2741
+ common .mock_restore_cache (
2742
+ hass ,
2743
+ (
2744
+ State (
2745
+ "climate.test" ,
2746
+ HVACMode .COOL ,
2747
+ {ATTR_TEMPERATURE : "20" },
2748
+ ),
2749
+ ),
2750
+ )
2751
+
2752
+ hass .set_state (CoreState .starting )
2753
+
2754
+ # When
2755
+ assert await async_setup_component (
2756
+ hass ,
2757
+ CLIMATE ,
2758
+ {
2759
+ "climate" : {
2760
+ "platform" : DOMAIN ,
2761
+ "name" : "test" ,
2762
+ "heater" : heater_switch ,
2763
+ "cooler" : cooler_switch ,
2764
+ "target_sensor" : "input_number.temp" ,
2765
+ "initial_hvac_mode" : HVACMode .COOL ,
2766
+ "heat_cool_mode" : True ,
2767
+ }
2768
+ },
2769
+ )
2770
+ await hass .async_block_till_done ()
2771
+
2772
+ # Then
2773
+ assert hass .states .get (heater_switch ).state == STATE_OFF
2774
+ assert hass .states .get (cooler_switch ).state == STATE_OFF
2775
+ assert hass .states .get (common .ENTITY ).state == HVACMode .COOL
2776
+ assert (
2777
+ hass .states .get (common .ENTITY ).attributes .get ("hvac_action" ) == HVACAction .IDLE
2778
+ )
2779
+ assert (
2780
+ hass .states .get (common .ENTITY ).attributes .get (ATTR_HVAC_ACTION_REASON )
2781
+ == HVACActionReasonInternal .TARGET_TEMP_REACHED
2782
+ )
2783
+
2784
+
2785
+ async def test_hvac_mode_heat_hvac_action_reason (
2786
+ hass : HomeAssistant , setup_comp_1 # noqa: F811
2787
+ ):
2788
+ """Test thermostat sets hvac action reason after startup in heat mode."""
2789
+ heater_switch = "input_boolean.heater"
2790
+ cooler_switch = "input_boolean.cooler"
2791
+ assert await async_setup_component (
2792
+ hass ,
2793
+ input_boolean .DOMAIN ,
2794
+ {"input_boolean" : {"heater" : None , "cooler" : None }},
2795
+ )
2796
+
2797
+ assert await async_setup_component (
2798
+ hass ,
2799
+ input_number .DOMAIN ,
2800
+ {
2801
+ "input_number" : {
2802
+ "temp" : {"name" : "test" , "initial" : 22 , "min" : 0 , "max" : 40 , "step" : 1 }
2803
+ }
2804
+ },
2805
+ )
2806
+
2807
+ # Given
2808
+ common .mock_restore_cache (
2809
+ hass ,
2810
+ (
2811
+ State (
2812
+ "climate.test" ,
2813
+ HVACMode .COOL ,
2814
+ {ATTR_TEMPERATURE : "20" },
2815
+ ),
2816
+ ),
2817
+ )
2818
+
2819
+ hass .set_state (CoreState .starting )
2820
+
2821
+ # When
2822
+ assert await async_setup_component (
2823
+ hass ,
2824
+ CLIMATE ,
2825
+ {
2826
+ "climate" : {
2827
+ "platform" : DOMAIN ,
2828
+ "name" : "test" ,
2829
+ "heater" : heater_switch ,
2830
+ "cooler" : cooler_switch ,
2831
+ "target_sensor" : "input_number.temp" ,
2832
+ "initial_hvac_mode" : HVACMode .HEAT ,
2833
+ "heat_cool_mode" : True ,
2834
+ }
2835
+ },
2836
+ )
2837
+ await hass .async_block_till_done ()
2838
+
2839
+ # Then
2840
+ assert hass .states .get (heater_switch ).state == STATE_OFF
2841
+ assert hass .states .get (cooler_switch ).state == STATE_OFF
2842
+ assert hass .states .get (common .ENTITY ).state == HVACMode .HEAT
2843
+ assert (
2844
+ hass .states .get (common .ENTITY ).attributes .get ("hvac_action" ) == HVACAction .IDLE
2845
+ )
2846
+ assert (
2847
+ hass .states .get (common .ENTITY ).attributes .get (ATTR_HVAC_ACTION_REASON )
2848
+ == HVACActionReasonInternal .TARGET_TEMP_REACHED
2849
+ )
2850
+
2851
+
2721
2852
@pytest .mark .parametrize (
2722
2853
["duration" , "result_state" ],
2723
2854
[
0 commit comments