PyFlipper | Unoffical Flipper Zero Cli Wrapper Written In Python

image

PyFlipper

Unoffical Flipper Zero cli wrapper written in Python

Articles

Functions and characteristics:

  • Flipper serial CLI wrapper
  • Websocket client interface

Setup instructions:

$ git clone https://github.com/wh00hw/pyFlipper.git $ cd pyFlipper $ python3 -m venv venv $ source venv/bin/activate $ pip install -r requirements.txt

Tested on:

  • Python 3.8.10 on Linux 5.4.0 x86_64
  • Python 3.9.10 on Windows 10
  • Python 3.10.5 on Android 12 (Termux + OTGSerial2WebSocket NO ROOT REQUIRED)

Usage/Examples

Connection

from pyflipper import PyFlipper #Local serial port flipper = PyFlipper(com=“/dev/ttyACM0”) #OR remote serial2websocket server flipper = PyFlipper(ws=“ws://192.168.1.5:1337”)

Power

#Info info = flipper.power.info() #Poweroff flipper.power.off() #Reboot flipper.power.reboot() #Reboot in DFU mode flipper.power.reboot2dfu()

Update/Backup

#Install update from .fuf file flipper.update.install(fuf_file=“/ext/update.fuf”) backup Flipper to .tar file flipper.update.backup(dest_tar_file=“/ext/backup.tar”) restore Flipper from backup .tar file flipper.update.restore(bak_tar_file=“/ext/backup.tar”)

Loader

list installed apps apps = flipper.loader.list() #Open app flipper.loader.open(app_name=“Clock”)

Flipper Info

#Get flipper date date = flipper.date.date() #Get flipper timestamp timestamp = flipper.date.timestamp() #Get the processes dict list ps = flipper.ps.list() #Get device info dict device_info = flipper.device_info.info() #Get heap info dict heap = flipper.free.info() #Get free_blocks string free_blocks = flipper.free.blocks() #Get bluetooth info bt_info = flipper.bt.info()

Storage

Filesystem Info

#Get the storage filesystem info ext_info = flipper.storage.info(fs=“/ext”)

Explorer

#Get the storage /ext dict ext_list = flipper.storage.list(path=“/ext”) #Get the storage /ext tree dict ext_tree = flipper.storage.tree(path=“/ext”) #Get file info file_info = flipper.storage.stat(file=“/ext/foo/bar.txt”) #Make directory flipper.storage.mkdir(new_dir=“/ext/foo”)

Files

read file plain_text = flipper.storage.read(file=“/ext/foo/bar.txt”) remove file flipper.storage.remove(file=“/ext/foo/bar.txt”) #Copy file flipper.storage.copy(src=“/ext/foo/source.txt”, dest=“/ext/bar/destination.txt”) rename file flipper.storage.rename(file=“/ext/foo/bar.txt”, new_file=“/ext/foo/rab.txt”) #MD5 Hash file md5_hash = flipper.storage.md5(file=“/ext/foo/bar.txt”) #Write file in one chunk file = “/ext/bar.txt” text = “”“There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don’t look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn’t anything embarrassing hidden in the middle of text. “”” flipper.storage.write.file(file, text) #Write file using a listener file = “/ext/foo.txt” text_one = “”“There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don’t look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn’t anything embarrassing hidden in the middle of text. “”” flipper.storage.write.start(file) time.sleep(2) flipper.storage.write.send(text_one) text_two = “”“All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc. “”” flipper.storage.write.send(text_two) time.sleep(3) #Don’t forget to stop flipper.storage.write.stop()

LED/Backlight

#Set generic led on (r,b,g,bl) flipper.led.set(led=‘r’, value=255) #Set blue led off flipper.led.blue(value=0) #Set green led value flipper.led.green(value=175) #Set backlight on flipper.led.backlight_on() #Set backlight off flipper.led.backlight_off() #Turn off led flipper.led.off()

Vibro

#Set vibro True or False flipper.vibro.set(True) #Set vibro on flipper.vibro.on() #Set vibro off flipper.vibro.off()

GPIO

#Set gpio mode: 0 - input, 1 - output flipper.gpio.mode(pin_name=PIN_NAME, value=1) #Set gpio pin value: 0 - off, 1 - on flipper.gpio.set(pin_name=PIN_NAME, value=1) read gpio pin value flipper.gpio.read(pin_name=PIN_NAME)

MusicPlayer

#Play song in RTTTL format rttl_song = “Littleroot Town - Pokemon:d=4,o=5,b=100:8c5,8f5,8g5,4a5,8p,8g5,8a5,8g5,8a5,8a#5,8p,4c6,8d6,8a5,8g5,8a5,8c#6,4d6,4e6,4d6,8a5,8g5,8f5,8e5,8f5,8a5,4d6,8d5,8e5,2f5,8c6,8a#5,8a#5,8a5,2f5,8d6,8a5,8a5,8g5,2f5,8p,8f5,8d5,8f5,8e5,4e5,8f5,8g5” #Play in loop flipper.music_player.play(rtttl_code=rttl_song) #Stop loop flipper.music_player.stop() #Play for 20 seconds flipper.music_player.play(rtttl_code=rttl_song, duration=20) #Beep flipper.music_player.beep() #Beep for 5 seconds flipper.music_player.beep(duration=5)

NFC

#Synchronous default timeout 5 seconds #Detect NFC nfc_detected = flipper.nfc.detect() emulate NFC flipper.nfc.emulate() #Activate field flipper.nfc.field()

RFID

#Synchronous default timeout 5 seconds read RFID rfid = flipper.rfid.read()

SubGhz

#Transmit hex_key N times(default count = 10) flipper.subghz.tx(hex_key=“DEADBEEF”, frequency=433920000, count=5) decode raw .sub file decoded = flipper.subghz.decode_raw(sub_file=“/ext/subghz/foo.sub”)

Infrared

#Transmit hex_address and hex_command selecting a protocol flipper.ir.tx(protocol=“Samsung32”, hex_address=“C000FFEE”, hex_command=“DEADBEEF”) #Raw Transmit samples flipper.ir.tx_raw(frequency=38000, duty_cycle=0.33, samples=[1337, 8888, 3000, 5555]) #Synchronous default timeout 5 seconds #Receive tx r = flipper.ir.rx(timeout=10)

IKEY

read (default timeout 5 seconds) ikey = flipper.ikey.read() #Write (default timeout 5 seconds) flipper.ikey.write(key_type=“Dallas”, key_data=“DEADBEEFCOOOFFEE”) emulate (default timeout 5 seconds) flipper.ikey.emulate(key_type=“Dallas”, key_data=“DEADBEEFCOOOFFEE”)

Log

#Attach event logger (default timeout 10 seconds) logs = flipper.log.attach()

Debug

#Activate debug mode flipper.debug.on() #Deactivate debug mode flipper.debug.off()

Onewire

search response = flipper.onewire.search()

I2C

#Get response = flipper.i2c.get()

Input

#Input dump dump = flipper.input.dump() #Send input flipper.input.send(“up”, “press”)

Optimizations

Feel free to contribute in any way

  • Queue Thread orchestrator
  • Implement all the cli functions
  • Async SubGhz Chat

License

MIT

Buy me a pint

ZEC: zs13zdde4mu5rj5yjm2kt6al5yxz2qjjjgxau9zaxs6np9ldxj65cepfyw55qvfp9v8cvd725f7tz7

ETH: 0xef3cF1Eb85382EdEEE10A2df2b348866a35C6A54

BTC: 15umRZXBzgUacwLVgpLPoa2gv7MyoTrKat

Contacts

  • Discord: white_rabbit#4124
  • Twitter: @nic_whr
  • GPG: 0x94EDEADC

GitHub:

1 Like