@@ -317,15 +317,10 @@ def reset(self):
317
317
318
318
self ._click_counter = 0
319
319
self ._callback = None
320
- self ._button = None
321
320
322
- def press (self , callback , button ):
321
+ def press (self , callback ):
323
322
"""Process a button press."""
324
- if button != self ._button :
325
- self ._click_counter = 1
326
- else :
327
- self ._click_counter += 1
328
- self ._button = button
323
+ self ._click_counter += 1
329
324
self ._callback = callback
330
325
331
326
@@ -374,11 +369,14 @@ def test_PhilipsRemoteCluster_short_press(
374
369
cluster = device .endpoints [ep ].philips_remote_cluster
375
370
listener = mock .MagicMock ()
376
371
cluster .add_listener (listener )
377
- cluster .button_press_queue = ManuallyFiredButtonPressQueue ()
372
+ cluster .button_press_queue = {
373
+ k : ManuallyFiredButtonPressQueue () for k in cluster .BUTTONS
374
+ }
378
375
379
376
cluster .handle_cluster_request (ZCLHeader (), [1 , 0 , 0 , 0 , 0 ])
380
377
cluster .handle_cluster_request (ZCLHeader (), [1 , 0 , 2 , 0 , 0 ])
381
- cluster .button_press_queue .fire ()
378
+ for q in cluster .button_press_queue .values ():
379
+ q .fire ()
382
380
383
381
assert listener .zha_send_event .call_count == 2
384
382
@@ -462,14 +460,17 @@ def test_PhilipsRemoteCluster_multi_press(
462
460
cluster = device .endpoints [ep ].philips_remote_cluster
463
461
listener = mock .MagicMock ()
464
462
cluster .add_listener (listener )
465
- cluster .button_press_queue = ManuallyFiredButtonPressQueue ()
463
+ cluster .button_press_queue = {
464
+ k : ManuallyFiredButtonPressQueue () for k in cluster .BUTTONS
465
+ }
466
466
467
467
for _ in range (0 , count ):
468
468
# btn1 short press
469
469
cluster .handle_cluster_request (ZCLHeader (), [1 , 0 , 0 , 0 , 0 ])
470
470
# btn1 short release
471
471
cluster .handle_cluster_request (ZCLHeader (), [1 , 0 , 2 , 0 , 0 ])
472
- cluster .button_press_queue .fire ()
472
+ for q in cluster .button_press_queue .values ():
473
+ q .fire ()
473
474
474
475
assert listener .zha_send_event .call_count == 1
475
476
args_button_id = count + 2
@@ -620,30 +621,21 @@ def test_PhilipsRemoteCluster_long_press(
620
621
621
622
622
623
@pytest .mark .parametrize (
623
- "button_presses, result_count " ,
624
+ "button_presses" ,
624
625
(
625
- (
626
- [1 ],
627
- 1 ,
628
- ),
629
- (
630
- [1 , 1 ],
631
- 2 ,
632
- ),
633
- (
634
- [1 , 1 , 3 , 3 , 3 , 2 , 2 , 2 , 2 ],
635
- 4 ,
636
- ),
626
+ (1 ),
627
+ (2 ),
628
+ (4 ),
637
629
),
638
630
)
639
- def test_ButtonPressQueue_presses_without_pause (button_presses , result_count ):
631
+ def test_ButtonPressQueue_presses_without_pause (button_presses ):
640
632
"""Test ButtonPressQueue presses without pause in between presses."""
641
633
642
634
q = ButtonPressQueue ()
643
635
q ._ms_threshold = 50
644
636
cb = mock .MagicMock ()
645
- for btn in button_presses :
646
- q .press (cb , btn )
637
+ for _ in range ( button_presses ) :
638
+ q .press (cb )
647
639
648
640
# await cluster.button_press_queue._task
649
641
# Instead of awaiting the job, significantly extending the time
@@ -653,48 +645,32 @@ def test_ButtonPressQueue_presses_without_pause(button_presses, result_count):
653
645
q ._task .cancel ()
654
646
q ._ms_last_click = 0
655
647
q ._callback (q ._click_counter )
656
- cb .assert_called_once_with (result_count )
648
+ cb .assert_called_once_with (button_presses )
657
649
658
650
659
651
@pytest .mark .parametrize (
660
- "press_sequence, results " ,
652
+ "press_sequence" ,
661
653
(
662
- (
663
- # switch buttons within a sequence,
664
- # new sequence start with different button
665
- (
666
- [1 , 1 , 3 , 3 ],
667
- [2 , 2 , 2 ],
668
- ),
669
- (2 , 3 ),
670
- ),
671
- (
672
- # no button switch within a sequence,
673
- # new sequence with same button
674
- (
675
- [1 , 1 , 1 ],
676
- [1 ],
677
- ),
678
- (3 , 1 ),
679
- ),
654
+ ((2 , 3 )),
655
+ ((3 , 1 )),
680
656
),
681
657
)
682
- async def test_ButtonPressQueue_presses_with_pause (press_sequence , results ):
658
+ async def test_ButtonPressQueue_presses_with_pause (press_sequence ):
683
659
"""Test ButtonPressQueue with pauses in between button press sequences."""
684
660
685
661
q = ButtonPressQueue ()
686
662
q ._ms_threshold = 50
687
663
cb = mock .MagicMock ()
688
664
689
665
for seq in press_sequence :
690
- for btn in seq :
691
- q .press (cb , btn )
666
+ for _ in range ( seq ) :
667
+ q .press (cb )
692
668
await q ._task
693
669
694
- assert cb .call_count == len (results )
670
+ assert cb .call_count == len (press_sequence )
695
671
696
672
calls = []
697
- for res in results :
673
+ for res in press_sequence :
698
674
calls .append (mock .call (res ))
699
675
700
676
cb .assert_has_calls (calls )
@@ -768,3 +744,53 @@ def test_contact_sensor(zigpy_device_from_v2_quirk):
768
744
# update again with the same value and except no new update
769
745
hue_cluster .update_attribute (hue_cluster .AttributeDefs .contact .id , 1 )
770
746
assert len (on_off_listener .attribute_updates ) == 2
747
+
748
+
749
+ @pytest .mark .parametrize (
750
+ "dev, ep, button_events, expected_actions" ,
751
+ (
752
+ (
753
+ PhilipsWallSwitch ,
754
+ 1 ,
755
+ (
756
+ [
757
+ b"\x1d \x0b \x10 6\x00 \x01 \x00 \x00 0\x00 !\x00 \x00 " ,
758
+ b"\x1d \x0b \x10 7\x00 \x01 \x00 \x00 0\x02 !\x01 \x00 " ,
759
+ ],
760
+ [
761
+ b"\x1d \x0b \x10 8\x00 \x02 \x00 \x00 0\x00 !\x00 \x00 " ,
762
+ b"\x1d \x0b \x10 9\x00 \x02 \x00 \x00 0\x02 !\x01 \x00 " ,
763
+ ],
764
+ ),
765
+ ["left_press" , "left_short_release" , "right_press" , "right_short_release" ],
766
+ ),
767
+ ),
768
+ )
769
+ def test_PhilipsRemoteCluster_multi_button_press (
770
+ zigpy_device_from_quirk , dev , ep , button_events , expected_actions
771
+ ):
772
+ """Test PhilipsRemoteCluster short button press logic."""
773
+
774
+ device = zigpy_device_from_quirk (dev )
775
+
776
+ remote_cluster = device .endpoints [ep ].philips_remote_cluster
777
+ remote_cluster .button_press_queue = {
778
+ k : ManuallyFiredButtonPressQueue () for k in remote_cluster .BUTTONS
779
+ }
780
+ remote_listener = mock .MagicMock ()
781
+ remote_cluster .add_listener (remote_listener )
782
+
783
+ expected_event_count = 0
784
+ for button in button_events :
785
+ for eventData in button :
786
+ hdr , args = remote_cluster .deserialize (eventData )
787
+ remote_cluster .handle_message (hdr , args )
788
+ expected_event_count += 1
789
+
790
+ for q in remote_cluster .button_press_queue .values ():
791
+ q .fire ()
792
+
793
+ assert remote_listener .zha_send_event .call_count == expected_event_count
794
+
795
+ for i , expected_action in enumerate (expected_actions ):
796
+ assert remote_listener .zha_send_event .call_args_list [i ][0 ][0 ] == expected_action
0 commit comments