Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,27 @@ Enter learning mode:
devices[0].enter_learning()
```

Sweep RF frequencies:
```
devices[0].sweep_frequency()
```

Cancel sweep RF frequencies:
```
devices[0].cancel_sweep_frequency()
```
Check whether a frequency has been found:
```
found = devices[0].check_frequency()
```
(This will return True if the RM has locked onto a frequency, False otherwise)

Attempt to learn an RF packet:
```
found = devices[0].find_rf_packet()
```
(This will return True if a packet has been found, False otherwise)

Obtain an IR or RF packet while in learning mode:
```
ir_packet = devices[0].check_data()
Expand Down
32 changes: 32 additions & 0 deletions broadlink/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,38 @@ def enter_learning(self):
packet[0] = 3
self.send_packet(0x6a, packet)

def sweep_frequency(self):
packet = bytearray(16)
packet[0] = 0x19
self.send_packet(0x6a, packet)

def cancel_sweep_frequency(self):
packet = bytearray(16)
packet[0] = 0x1e
self.send_packet(0x6a, packet)

def check_frequency(self):
packet = bytearray(16)
packet[0] = 0x1a
response = self.send_packet(0x6a, packet)
err = response[0x22] | (response[0x23] << 8)
if err == 0:
payload = self.decrypt(bytes(response[0x38:]))
if payload[0x04] == 1:
return True
return False

def find_rf_packet(self):
packet = bytearray(16)
packet[0] = 0x1b
response = self.send_packet(0x6a, packet)
err = response[0x22] | (response[0x23] << 8)
if err == 0:
payload = self.decrypt(bytes(response[0x38:]))
if payload[0x04] == 1:
return True
return False

def check_temperature(self):
packet = bytearray(16)
packet[0] = 1
Expand Down
52 changes: 49 additions & 3 deletions cli/broadlink_cli
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3

import broadlink
import sys
Expand Down Expand Up @@ -79,7 +79,8 @@ parser.add_argument("--switch", action="store_true", help="switch state from on
parser.add_argument("--send", action="store_true", help="send command")
parser.add_argument("--sensors", action="store_true", help="check all sensors")
parser.add_argument("--learn", action="store_true", help="learn command")
parser.add_argument("--learnfile", help="learn command and save to specified file")
parser.add_argument("--rfscanlearn", action="store_true", help="rf scan learning")
parser.add_argument("--learnfile", help="save learned command to a specified file")
parser.add_argument("--durations", action="store_true", help="use durations in micro seconds instead of the Broadlink format")
parser.add_argument("--convert", action="store_true", help="convert input data to durations")
parser.add_argument("data", nargs='*', help="Data to send or convert")
Expand Down Expand Up @@ -119,7 +120,7 @@ if args.send:
data = durations_to_broadlink(parse_durations(' '.join(args.data))) \
if args.durations else bytearray.fromhex(''.join(args.data))
dev.send_data(data)
if args.learn or args.learnfile:
if args.learn:
dev.enter_learning()
data = None
print("Learning...")
Expand Down Expand Up @@ -182,3 +183,48 @@ if args.switch:
else:
dev.set_power(True)
print('* Switch to ON *')
if args.rfscanlearn:
dev.sweep_frequency()
print("Learning RF Frequency, press and hold the button to learn...")

timeout = 20

while (not dev.check_frequency()) and (timeout > 0):
time.sleep(1)
timeout -= 1

if timeout <= 0:
print("RF Frequency not found")
dev.cancel_sweep_frequency()
exit(1)

print("Found RF Frequency - 1 of 2!")
print("You can now let go of the button")

input("Press enter to continue...")

print("To complete learning, single press the button you want to learn")

dev.find_rf_packet()

data = None
timeout = 20

while (data is None) and (timeout > 0):
time.sleep(1)
timeout -= 1
data = dev.check_data()

if data:
print("Found RF Frequency - 2 of 2!")
learned = format_durations(to_microseconds(bytearray(data))) \
if args.durations \
else ''.join(format(x, '02x') for x in bytearray(data))
if args.learnfile is None:
print(learned)
if args.learnfile is not None:
print("Saving to {}".format(args.learnfile))
with open(args.learnfile, "w") as text_file:
text_file.write(learned)
else:
print("No data received...")