{"id":13499489,"url":"https://github.com/wh00hw/pyFlipper","last_synced_at":"2025-03-29T05:31:30.741Z","repository":{"id":49168727,"uuid":"517145721","full_name":"wh00hw/pyFlipper","owner":"wh00hw","description":"Flipper Zero Python CLI Wrapper","archived":false,"fork":false,"pushed_at":"2024-01-31T22:52:08.000Z","size":73,"stargazers_count":322,"open_issues_count":1,"forks_count":30,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-03-20T09:26:20.301Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wh00hw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-07-23T19:21:47.000Z","updated_at":"2024-04-15T11:25:59.014Z","dependencies_parsed_at":"2024-01-31T23:35:53.324Z","dependency_job_id":null,"html_url":"https://github.com/wh00hw/pyFlipper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wh00hw%2FpyFlipper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wh00hw%2FpyFlipper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wh00hw%2FpyFlipper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wh00hw%2FpyFlipper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wh00hw","download_url":"https://codeload.github.com/wh00hw/pyFlipper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":213424247,"owners_count":15585272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T22:00:33.610Z","updated_at":"2024-10-31T18:30:36.092Z","avatar_url":"https://github.com/wh00hw.png","language":"Python","funding_links":[],"categories":["Off-device \u0026 Debugging","Python"],"sub_categories":["*Utility*","Utility"],"readme":"# PyFlipper\n\nFlipper Zero Python CLI Wrapper\n\n![](https://thumb.tildacdn.com/tild3332-3839-4061-b663-363464303432/-/resize/214x/-/format/webp/noroot.png)\n\n## Articles\n- [How to hack a restaurant](https://medium.com/@nic_whr/how-to-hack-a-restaurant-5d394be105a9)\n\n## Functions and characteristics:\n - [x] Flipper serial CLI wrapper\n - [x] Websocket client interface\n\n## Setup instructions:\n\n```bash\n$ pip install pyflipper\n```\n\n### Tested on:\n - [x] Python 3.8.10 on Linux 5.4.0 x86_64\n - [x] Python 3.9.10 on Windows 10\n - [x] Python 3.10.5 on Android 12 (Termux + [OTGSerial2WebSocket](https://play.google.com/store/apps/details?id=com.wh00hw.serial2websocket) NO ROOT REQUIRED)\n\n## Usage/Examples\n\n### Connection\n\n```python\nfrom pyflipper import PyFlipper\n\n# Local serial port\nflipper = PyFlipper(com=\"/dev/ttyACM0\")\n\n# OR\n\n# Remote serial2websocket server\nflipper = PyFlipper(ws=\"ws://192.168.1.5:1337\")\n\n# TCP\nflipper = PyFlipper(tcp='192.168.89.222:22170')\n```\n\n### Power\n\n```python\n# Info\ninfo = flipper.power.info()\n\n# Poweroff\nflipper.power.off()\n\n# Reboot\nflipper.power.reboot()\n\n# Reboot in DFU mode\nflipper.power.reboot2dfu()\n```\n\n### Update/Backup\n\n```python\n# Install update from .fuf file\nflipper.update.install(fuf_file=\"/ext/update.fuf\")\n\n# Backup Flipper to .tar file\nflipper.update.backup(dest_tar_file=\"/ext/backup.tar\")\n\n# Restore Flipper from backup .tar file\nflipper.update.restore(bak_tar_file=\"/ext/backup.tar\")\n```\n\n### Loader\n\n```python\n# List installed apps\napps = flipper.loader.list()\n\n# Open app\nflipper.loader.open(app_name=\"Clock\")\n```\n\n### Flipper Info\n\n```python\n# Get flipper date\ndate = flipper.date.date()\n\n# Get flipper timestamp\ntimestamp = flipper.date.timestamp()\n\n# Get the processes dict list\nps = flipper.ps.list()\n\n# Get device info dict\ndevice_info = flipper.device_info.info()\n\n# Get heap info dict\nheap = flipper.free.info()\n\n# Get free_blocks string\nfree_blocks = flipper.free.blocks()\n\n# Get bluetooth info\nbt_info = flipper.bt.info()\n```\n\n### Storage\n\n#### Filesystem Info\n\n```python\n# Get the storage filesystem info\next_info = flipper.storage.info(fs=\"/ext\")\n```\n\n#### Explorer\n\n```python\n# Get the storage /ext dict\next_list = flipper.storage.list(path=\"/ext\")\n\n# Get the storage /ext tree dict\next_tree = flipper.storage.tree(path=\"/ext\")\n\n# Get file info\nfile_info = flipper.storage.stat(file=\"/ext/foo/bar.txt\")\n\n# Make directory\nflipper.storage.mkdir(new_dir=\"/ext/foo\")\n```\n\n#### Files\n\n```python\n# Read file\nplain_text = flipper.storage.read(file=\"/ext/foo/bar.txt\")\n\n# Remove file\nflipper.storage.remove(file=\"/ext/foo/bar.txt\")\n\n# Copy file\nflipper.storage.copy(src=\"/ext/foo/source.txt\", dest=\"/ext/bar/destination.txt\")\n\n# Rename file\nflipper.storage.rename(file=\"/ext/foo/bar.txt\", new_file=\"/ext/foo/rab.txt\")\n\n# MD5 Hash file\nmd5_hash = flipper.storage.md5(file=\"/ext/foo/bar.txt\")\n\n# Write file in one chunk\nfile = \"/ext/bar.txt\"\n\ntext = \"\"\"There are many variations of passages of Lorem Ipsum available, \nbut the majority have suffered alteration in some form, by injected humour, \nor randomised words which don't look even slightly believable. \nIf you are going to use a passage of Lorem Ipsum, \nyou need to be sure there isn't anything embarrassing hidden in the middle of text. \n\"\"\"\n\nflipper.storage.write.file(file, text)\n\n# Write file using a listener\nfile = \"/ext/foo.txt\"\n\ntext_one = \"\"\"There are many variations of passages of Lorem Ipsum available, \nbut the majority have suffered alteration in some form, by injected humour, \nor randomised words which don't look even slightly believable. \nIf you are going to use a passage of Lorem Ipsum, \nyou need to be sure there isn't anything embarrassing hidden in the middle of text. \n\"\"\"\n\nflipper.storage.write.start(file)\n\ntime.sleep(2)\n\nflipper.storage.write.send(text_one)\n\ntext_two = \"\"\"All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as \nnecessary, making this the first true generator on the Internet.\n It uses a dictionary of over 200 Latin words, combined with a handful of \n model sentence structures, to generate Lorem Ipsum which looks reasonable. \nThe generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.\n\"\"\"\nflipper.storage.write.send(text_two)\n\ntime.sleep(3)\n\n# Don't forget to stop\nflipper.storage.write.stop()\n```\n\n### LED/Backlight\n\n```python\n# Set generic led on (r,b,g,bl)\nflipper.led.set(led='r', value=255)\n\n# Set blue led off\nflipper.led.blue(value=0)\n\n# Set green led value\nflipper.led.green(value=175)\n\n# Set backlight on\nflipper.led.backlight_on()\n\n# Set backlight off\nflipper.led.backlight_off()\n\n# Turn off led\nflipper.led.off()\n```\n\n### Vibro\n\n```python\n# Set vibro True or False\nflipper.vibro.set(True)\n\n# Set vibro on\nflipper.vibro.on()\n\n# Set vibro off\nflipper.vibro.off()\n```\n\n### GPIO\n\n```python\n# Set gpio mode: 0 - input, 1 - output\nflipper.gpio.mode(pin_name=PIN_NAME, value=1)\n\n# Set gpio pin value: 0 - off, 1 - on\nflipper.gpio.set(pin_name=PIN_NAME, value=1)\n\n# Read gpio pin value\nflipper.gpio.read(pin_name=PIN_NAME)\n```\n\n### MusicPlayer\n\n```python\n# Play song in RTTTL format\nrttl_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\"\n\n# Play in loop\nflipper.music_player.play(rtttl_code=rttl_song)\n\n# Stop loop\nflipper.music_player.stop()\n\n# Play for 20 seconds\nflipper.music_player.play(rtttl_code=rttl_song, duration=20)\n\n# Beep\nflipper.music_player.beep()\n\n# Beep for 5 seconds\nflipper.music_player.beep(duration=5)\n```\n\n### NFC\n\n```python\n# Synchronous default timeout 5 seconds\n\n# Detect NFC\nnfc_detected = flipper.nfc.detect()\n\n# Emulate NFC\nflipper.nfc.emulate()\n\n# Activate field\nflipper.nfc.field()\n```\n\n### RFID\n\n```python\n# Synchronous default timeout 5 seconds\n\n# Read RFID\nrfid = flipper.rfid.read()\n\n# Emulate RFID\nemulated = flipper.rfid.emulate(key_type=\"EM4100\", key_data=\"5500824806\")\n\n# Write RFID\nwritten = flipper.rfid.write(key_type=\"EM4100\", key_data=\"5500824806\")\n```\n\n### SubGhz\n\n```python\n# Transmit hex_key N times(default count = 10)\nflipper.subghz.tx(hex_key=\"DEADBEEF\", frequency=433920000, count=5)\n\n# Receive (default frequency=433920000 raw=False timeout=5 seconds)\nreceived = flipper.subghz.rx(frequency=\"433920000\", raw=True, timeout=10)\n\n# Replay recorded transmission\nflipper.subghz.tx_from_file(\"/ext/subghz/foo.sub\")\n\n# Decode raw .sub file\ndecoded = flipper.subghz.decode_raw(sub_file=\"/ext/subghz/foo.sub\")\n```\n\n### Infrared\n\n```python\n# Transmit hex_address and hex_command selecting a protocol\nflipper.ir.tx(protocol=\"Samsung32\", hex_address=\"C000FFEE\", hex_command=\"DEADBEEF\")\n\n# Raw Transmit samples\nflipper.ir.tx_raw(frequency=38000, duty_cycle=0.33, samples=[1337, 8888, 3000, 5555])\n\n# Synchronous default timeout 5 seconds\n# Receive tx\nr = flipper.ir.rx(timeout=10)\n```\n\n### IKEY\n\n```python\n# Read (default timeout 5 seconds)\nikey = flipper.ikey.read()\n\n# Write (default timeout 5 seconds)\nflipper.ikey.write(key_type=\"Dallas\", key_data=\"DEADBEEFCOOOFFEE\")\n\n# Emulate (default timeout 5 seconds)\nflipper.ikey.emulate(key_type=\"Dallas\", key_data=\"DEADBEEFCOOOFFEE\")\n```\n\n### Log\n\n```python\n# Attach event logger (default timeout 10 seconds)\nlogs = flipper.log.attach()\n```\n\n### Debug\n\n```python\n# Activate debug mode\nflipper.debug.on()\n\n# Deactivate debug mode\nflipper.debug.off()\n```\n\n### Onewire\n\n```python\n# Search\nresponse = flipper.onewire.search()\n```\n\n### I2C\n\n```python\n# Get\nresponse = flipper.i2c.get()\n```\n\n### Input\n\n```python\n# Input dump\ndump = flipper.input.dump()\n\n# Send input\nflipper.input.send(\"up\", \"press\")\n```\n\n## Optimizations\n\nFeel free to contribute in any way\n\n- [ ] Queue Thread orchestrator\n- [ ] Implement all the cli functions\n- [ ] Async SubGhz Chat\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n\n\n## Buy me a pint\n\n**ZEC:** zs13zdde4mu5rj5yjm2kt6al5yxz2qjjjgxau9zaxs6np9ldxj65cepfyw55qvfp9v8cvd725f7tz7\n\n**ETH:** 0xef3cF1Eb85382EdEEE10A2df2b348866a35C6A54\n\n**BTC:** 15umRZXBzgUacwLVgpLPoa2gv7MyoTrKat\n\n## Contacts\n\n - **Discord**: white_rabbit#4124\n - **Twitter**: @nic_whr\n - **GPG**: 0x94EDEADC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwh00hw%2FpyFlipper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwh00hw%2FpyFlipper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwh00hw%2FpyFlipper/lists"}