@@ -545,6 +545,38 @@ def enter_learning(self):
545545 packet [0 ] = 3
546546 self .send_packet (0x6a , packet )
547547
548+ def sweep_frequency (self ):
549+ packet = bytearray (16 )
550+ packet [0 ] = 0x19
551+ self .send_packet (0x6a , packet )
552+
553+ def cancel_sweep_frequency (self ):
554+ packet = bytearray (16 )
555+ packet [0 ] = 0x1e
556+ self .send_packet (0x6a , packet )
557+
558+ def check_frequency (self ):
559+ packet = bytearray (16 )
560+ packet [0 ] = 0x1a
561+ response = self .send_packet (0x6a , packet )
562+ err = response [0x22 ] | (response [0x23 ] << 8 )
563+ if err == 0 :
564+ payload = self .decrypt (bytes (response [0x38 :]))
565+ if payload [0x04 ] == 1 :
566+ return True
567+ return False
568+
569+ def find_rf_packet (self ):
570+ packet = bytearray (16 )
571+ packet [0 ] = 0x1b
572+ response = self .send_packet (0x6a , packet )
573+ err = response [0x22 ] | (response [0x23 ] << 8 )
574+ if err == 0 :
575+ payload = self .decrypt (bytes (response [0x38 :]))
576+ if payload [0x04 ] == 1 :
577+ return True
578+ return False
579+
548580 def check_temperature (self ):
549581 packet = bytearray (16 )
550582 packet [0 ] = 1
@@ -576,19 +608,19 @@ def __init__ (self, host, mac, devtype):
576608 self .type = "Hysen heating controller"
577609
578610 # Send a request
579- # input_payload should be a bytearray, usually 6 bytes, e.g. bytearray([0x01,0x06,0x00,0x02,0x10,0x00])
611+ # input_payload should be a bytearray, usually 6 bytes, e.g. bytearray([0x01,0x06,0x00,0x02,0x10,0x00])
580612 # Returns decrypted payload
581613 # New behaviour: raises a ValueError if the device response indicates an error or CRC check fails
582614 # The function prepends length (2 bytes) and appends CRC
583615 def send_request (self ,input_payload ):
584-
616+
585617 from PyCRC .CRC16 import CRC16
586618 crc = CRC16 (modbus_flag = True ).calculate (bytes (input_payload ))
587619
588620 # first byte is length, +2 for CRC16
589621 request_payload = bytearray ([len (input_payload ) + 2 ,0x00 ])
590622 request_payload .extend (input_payload )
591-
623+
592624 # append CRC
593625 request_payload .append (crc & 0xFF )
594626 request_payload .append ((crc >> 8 ) & 0xFF )
@@ -598,9 +630,9 @@ def send_request(self,input_payload):
598630
599631 # check for error
600632 err = response [0x22 ] | (response [0x23 ] << 8 )
601- if err :
633+ if err :
602634 raise ValueError ('broadlink_response_error' ,err )
603-
635+
604636 response_payload = bytearray (self .decrypt (bytes (response [0x38 :])))
605637
606638 # experimental check on CRC in response (first 2 bytes are len, and trailing bytes are crc)
@@ -610,9 +642,9 @@ def send_request(self,input_payload):
610642 crc = CRC16 (modbus_flag = True ).calculate (bytes (response_payload [2 :response_payload_len ]))
611643 if (response_payload [response_payload_len ] == crc & 0xFF ) and (response_payload [response_payload_len + 1 ] == (crc >> 8 ) & 0xFF ):
612644 return response_payload [2 :response_payload_len ]
613- else :
645+ else :
614646 raise ValueError ('hysen_response_error' ,'CRC check on response failed' )
615-
647+
616648
617649 # Get current room temperature in degrees celsius
618650 def get_temp (self ):
@@ -626,7 +658,7 @@ def get_external_temp(self):
626658
627659 # Get full status (including timer schedule)
628660 def get_full_status (self ):
629- payload = self .send_request (bytearray ([0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x16 ]))
661+ payload = self .send_request (bytearray ([0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x16 ]))
630662 data = {}
631663 data ['remote_lock' ] = payload [3 ] & 1
632664 data ['power' ] = payload [4 ] & 1
@@ -652,11 +684,11 @@ def get_full_status(self):
652684 data ['min' ] = payload [20 ]
653685 data ['sec' ] = payload [21 ]
654686 data ['dayofweek' ] = payload [22 ]
655-
687+
656688 weekday = []
657689 for i in range (0 , 6 ):
658690 weekday .append ({'start_hour' :payload [2 * i + 23 ], 'start_minute' :payload [2 * i + 24 ],'temp' :payload [i + 39 ]/ 2.0 })
659-
691+
660692 data ['weekday' ] = weekday
661693 weekend = []
662694 for i in range (6 , 8 ):
@@ -693,7 +725,7 @@ def set_advanced(self, loop_mode, sensor, osv, dif, svh, svl, adj, fre, poweron)
693725 # For backwards compatibility only. Prefer calling set_mode directly. Note this function invokes loop_mode=0 and sensor=0.
694726 def switch_to_auto (self ):
695727 self .set_mode (auto_mode = 1 , loop_mode = 0 )
696-
728+
697729 def switch_to_manual (self ):
698730 self .set_mode (auto_mode = 0 , loop_mode = 0 )
699731
0 commit comments