| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -37,12 +37,16 @@ def ser_to_esb_addr(s): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    """ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Convert a Hoymiles inverter/DTU serial number into its | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    corresponding NRF24 'enhanced shockburst' address byte sequence (5 bytes). | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    The NRF library expects these in LSB to MSB order, even though the transceiver | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    itself will then output them in MSB-to-LSB order over the air. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					     | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    The inverters use a BCD representation of the last 8 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    digits of their serial number, in reverse byte order,  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    followed by \x01. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    """ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return ser_to_hm_addr(s)[::-1] + b'\x01' | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    air_order = ser_to_hm_addr(s)[::-1] + b'\x01' | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return air_order[::-1] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					def compose_0x80_msg(dst_ser_no=72220200, src_ser_no=72220200, ts=None): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    """ | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -76,12 +80,23 @@ def compose_0x80_msg(dst_ser_no=72220200, src_ser_no=72220200, ts=None): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    p = p + struct.pack('B', crc8)    | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return p | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					def print_addr(a): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print(f"ser# {a} ", end='') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print(f" -> HM  {' '.join([f'{x:02x}' for x in ser_to_hm_addr(a)])}", end='') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print(f" -> ESB {' '.join([f'{x:02x}' for x in ser_to_esb_addr(a)])}") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					def main_loop(): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    """ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Keep receiving on channel 3. Every once in a while, transmit a request | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    to one of our inverters on channel 40. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    """ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print_addr(inv_ser) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print_addr(dtu_ser) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ctr = 1 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    while True: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        radio.setChannel(3) | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |