Polar devices Python API and CLI.

Overview

loophole - Polar devices API

PyPI Join the chat at https://gitter.im/rsc-dev/loophole

About

Python API for Polar devices. Command line interface included.

Tested with:

  • A360
  • Loop
  • M400

Installation

pip install loophole

or

python setup.py install

Usage

CLI

Invoke CLI:

python __main__.py

Type '?' or 'help' to see available commands.

 _|                                _|                  _|
 _|    _|_|      _|_|    _|_|_|    _|_|_|      _|_|    _|    _|_|
 _|  _|    _|  _|    _|  _|    _|  _|    _|  _|    _|  _|  _|_|_|_|
 _|  _|    _|  _|    _|  _|    _|  _|    _|  _|    _|  _|  _|
 _|    _|_|      _|_|    _|_|_|    _|    _|    _|_|    _|    _|_|_|
                         _|
                         _|
                                                           ver. 0.3

loophole(no device)>?

Documented commands (type help <topic>):
========================================
connect  disconnect  exit  help  info  list  walk
Command Description
connect <dev_no> Connect Polar device. Run 'list' to see available devices.
disconnect Disconnect Polar device.
dump <dest> Dump device memory.
get <src> <dest> Read file from device.
exit Quit.
help List available commands with "help" or detailed help with "help cmd".
info Print connected device info.
list List available Polar devices.
walk [path] Walk file system. Default path is root path (\).

permissions

Note: You need the right permission to access the USB device. Otherwise you will get the error: The device has no langid

e.g.: run as root via sudo:

sudo python __main__.py

Or create udev role.

cat - > /etc/udev/rules.d/40-Polar_A360.rules << EOF
#Polar A360 permissions granted to users group
SUBSYSTEM=="usb", ATTRS{idProduct}=="0008", ATTRS{idVendor}=="0da4", MODE="0660", GROUP="plugdev"
SUBSYSTEMS=="usb-serial", MODE="0660", GROUP="plugdev"
EOF

udevadm control --reload-rules && udevadm trigger

Dependencies

for debian/ubuntu:

sudo apt install python-protobuf python-usb

Changelog

Here.

License

Code is released under MIT license © Radoslaw '[rsc]' Matusiak.

Comments
  • Device 'reset'

    Device 'reset'

    What files do I have to delete from the device to get it working again? I deleted every file with date on it but it still says "please sync".

    I would like to use only this software to get it working because I only have linux and I don't want it to connect to Internet. My computer should be enough.

    opened by haivala 6
  • ValueError: The device has no langid

    ValueError: The device has no langid

    I have a Polar A360, Firmware v1.2.60, HW-Model 00756861.01

    Traceback (most recent call last):
      File "__main__.py", line 285, in <module>
        main()
      File "__main__.py", line 278, in main
        cli.cmdloop(__INTRO.format(__version__))
      File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
        stop = self.onecmd(line)
      File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
        return func(arg)
      File "__main__.py", line 75, in do_list
        info = Device.get_info(dev)
      File "/media/servershare/repos/polar_venv/src/loophole/loophole/polar/__init__.py", line 660, in get_info
        return usb.get_info(usb_device)
      File "/media/servershare/repos/polar_venv/src/loophole/loophole/polar/__init__.py", line 578, in get_info
        return self.usb.get_info(usb_device)
      File "/media/servershare/repos/polar_venv/src/loophole/loophole/polar/__init__.py", line 476, in get_info
        info['manufacturer'] = self.usb.util.get_string(usb_device, usb_device.iManufacturer)
      File "/media/servershare/repos/polar_venv/src/pyusb/usb/util.py", line 314, in get_string
        raise ValueError("The device has no langid")
    ValueError: The device has no langid
    
    $ lsusb 
    ...
    Bus 001 Device 004: ID 0da4:0008 Polar Electro Oy Loop
    ...
    

    the print output of Device.list() entry is:

    0 DEVICE ID 0da4:0008 on Bus 001 Address 004 =================
     bLength                :   0x12 (18 bytes)
     bDescriptorType        :    0x1 Device
     bcdUSB                 :  0x200 USB 2.0
     bDeviceClass           :    0x0 Specified at interface
     bDeviceSubClass        :    0x0
     bDeviceProtocol        :    0x0
     bMaxPacketSize0        :   0x40 (64 bytes)
     idVendor               : 0x0da4
     idProduct              : 0x0008
     bcdDevice              :  0x100 Device 1.0
     iManufacturer          :    0x1 Error Accessing String
     iProduct               :    0x2 Error Accessing String
     iSerialNumber          :    0x3 Error Accessing String
     bNumConfigurations     :    0x1
      CONFIGURATION 1: 350 mA ==================================
       bLength              :    0x9 (9 bytes)
       bDescriptorType      :    0x2 Configuration
       wTotalLength         :   0x29 (41 bytes)
       bNumInterfaces       :    0x1
       bConfigurationValue  :    0x1
       iConfiguration       :    0x4 Error Accessing String
       bmAttributes         :   0x80 Bus Powered
       bMaxPower            :   0xaf (350 mA)
        INTERFACE 0: Human Interface Device ====================
         bLength            :    0x9 (9 bytes)
         bDescriptorType    :    0x4 Interface
         bInterfaceNumber   :    0x0
         bAlternateSetting  :    0x0
         bNumEndpoints      :    0x2
         bInterfaceClass    :    0x3 Human Interface Device
         bInterfaceSubClass :    0x0
         bInterfaceProtocol :    0x0
         iInterface         :    0x5 Error Accessing String
          ENDPOINT 0x81: Interrupt IN ==========================
           bLength          :    0x7 (7 bytes)
           bDescriptorType  :    0x5 Endpoint
           bEndpointAddress :   0x81 IN
           bmAttributes     :    0x3 Interrupt
           wMaxPacketSize   :   0x40 (64 bytes)
           bInterval        :    0x1
          ENDPOINT 0x1: Interrupt OUT ==========================
           bLength          :    0x7 (7 bytes)
           bDescriptorType  :    0x5 Endpoint
           bEndpointAddress :    0x1 OUT
           bmAttributes     :    0x3 Interrupt
           wMaxPacketSize   :   0x40 (64 bytes)
           bInterval        :    0x1
    
    

    virtualenv info:

    $ pip freeze
    appdirs==1.4.3
    packaging==16.8
    pkg-resources==0.0.0
    protobuf==3.2.0
    pyparsing==2.2.0
    -e git+https://github.com/walac/pyusb.git@1f66ccd5d252e969b1de9bf91bf24e5c64294b8d#egg=pyusb
    six==1.10.0
    
    opened by jedie 5
  • convert  polar byte array into txt files

    convert polar byte array into txt files

    We want to use a polar A360 in our hospital. And as you can imaging we are not happy (and allowed to) to send de data of our patients into the Polar cloud. So I was very happy to find your software. I installed the software onto a windows system en was able to connect en read/dump the files from the connected device. I nerver used python before so as far I can understand you use the protocol buffers to decode the files when they are read from the device but how can I convert the files into a readable format ( e.g text ) so we can use then in excel ? Regards Bart Nienhuis

    opened by smkresearch 3
  • Display example udev rule...

    Display example udev rule...

    ...and how can it looks like?!?

    Maybe display a example udev rule, if the current user can't access, as here #8

    Maybe something like this:

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="0da4", ATTRS{idProduct}=="0008", OWNER="<username>"

    Fill ids and username automaticlly. (I don't test this rule and don't know if it`s a good idea and a common rule...)

    opened by jedie 2
  • loophole exits exceptionaly with:

    loophole exits exceptionaly with: "The device has no langid"

    I have m400 connected to usb and when trying to list devices using loophole I get this:

    loophole(no device)>list
    Traceback (most recent call last):
      File "__main__.py", line 241, in <module>
        main()
      File "__main__.py", line 234, in main
        cli.cmdloop(__INTRO.format(__version__))
      File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
        stop = self.onecmd(line)
      File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
        return func(arg)
      File "__main__.py", line 74, in do_list
        info = Device.get_info(dev)
      File "/home/lklich/Projects/loophole/loophole/polar/__init__.py", line 549, in get_info
        return usb.get_info(usb_device)
      File "/home/lklich/Projects/loophole/loophole/polar/__init__.py", line 472, in get_info
        return self.usb.get_info(usb_device)
      File "/home/lklich/Projects/loophole/loophole/polar/__init__.py", line 370, in get_info
        info['manufacturer'] = self.usb.util.get_string(usb_device, usb_device.iManufacturer)
      File "/usr/local/lib/python2.7/dist-packages/usb/util.py", line 314, in get_string
        raise ValueError("The device has no langid")
    ValueError: The device has no langid
    

    My lsusb (if needed):

    ➜  loophole git:(master) lsusb                                                                                                                                                                git:(master|) 
    Bus 001 Device 004: ID 0a5c:5800 Broadcom Corp. BCM5880 Secure Applications Processor
    Bus 001 Device 003: ID 8087:07dc Intel Corp. 
    Bus 001 Device 002: ID 8087:8000 Intel Corp. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 002 Device 002: ID 1bcf:2985 Sunplus Innovation Technology Inc. Laptop Integrated Webcam HD
    Bus 002 Device 003: ID 0da4:0008 Polar Electro Oy Loop
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    

    I'm using ubuntu 16.04 with kernel 4.4

    opened by kleewho 2
  • What types of data can be downloaded?

    What types of data can be downloaded?

    I am really interested in accessing detailed sleep and heart rate data. What types of data can be downloaded with this library? Is there any sample data available for a demo?

    opened by brylie 1
  • dump will not end

    dump will not end

    The "dump" will save many files, but it will not end and "hang"...

    Strg-C will raise this:

      File "src/loophole/loophole/__main__.py", line 185, in do_dump
        data = self.device.read_file('{}{}'.format(directory, file.name))
      File "/home/jens/workspace/polar_venv/src/loophole/loophole/polar/__init__.py", line 728, in read_file
        resp = self.usb.send(request=req)
      File "/home/jens/workspace/polar_venv/src/loophole/loophole/polar/__init__.py", line 606, in send
        resp = self.usb.send(request, timeout)
      File "/home/jens/workspace/polar_venv/src/loophole/loophole/polar/__init__.py", line 542, in send
        data = self.__send_wait(ack, timeout)
      File "/home/jens/workspace/polar_venv/src/loophole/loophole/polar/__init__.py", line 436, in __send_wait
        response = self.ep_in_0.read(64, timeout)
      File "/home/jens/workspace/polar_venv/src/pyusb/usb/core.py", line 402, in read
        return self.device.read(self, size_or_buffer, timeout)
      File "/home/jens/workspace/polar_venv/src/pyusb/usb/core.py", line 988, in read
        self.__get_timeout(timeout))
      File "/home/jens/workspace/polar_venv/src/pyusb/usb/backend/libusb1.py", line 851, in intr_read
        timeout)
      File "/home/jens/workspace/polar_venv/src/pyusb/usb/backend/libusb1.py", line 933, in __read
        timeout)
    KeyboardInterrupt
    

    Maybe the default timeout=2000 is a little bit to long?!?

    EDIT: I not see that the last file is: /SYS/FONT/JA.SIF (3135521 bytes) maybe it needs more time, because it`s a big file?!? Is it possible to display some status information?!?

    opened by jedie 1
  • Windows 10 - permission problem finding and configuring USB device

    Windows 10 - permission problem finding and configuring USB device

    I am trying to diagnose a Windows permission problem using pyusb.

    It shows up with the typical errors "The device has no langid (permission issue, no string descriptors supported or device error)" and "The device has no langid (permission issue, no string descriptors supported or device error)"

    Test code is simple, just find and print the dev to see if strings have been fetched and try to do a set configuration.

    This works correctly on Linux and several of my Windows test systems (both Windows 10 and 11.)

    But it is failing consistently on one Windows 10 system.

    The device in question is a Garmin Ant+ (aka Dynastream) dongle. It can be accessed by other software correctly on that system. I have tried several different ones, as well as a Cycplus Ant+ dongle. None can be accessed.

    I have also tried running the test program from a command prompt started as system administrator. No differences.

    I am testing this with a pyinstaller created exe that bundles in the libusb-1.0.dll, and verified that works correctly on my other Windows systems.

    Also tried libusb0.dll. Again works correctly elsewhere, but fails on the one Windows 10 system in an identical fashion

    Suggestions would be welcome!

    Thanks!

    `is_ant_device: dev: 0x1009 testpyusb: dev: DEVICE ID 0fcf:1009 on Bus 003 Address 017 ================= bLength : 0x12 (18 bytes) bDescriptorType : 0x1 Device bcdUSB : 0x200 USB 2.0 bDeviceClass : 0x0 Specified at interface bDeviceSubClass : 0x0 bDeviceProtocol : 0x0 bMaxPacketSize0 : 0x20 (32 bytes) idVendor : 0x0fcf idProduct : 0x1009 bcdDevice : 0x100 Device 1.0 iManufacturer : 0x1 Error Accessing String iProduct : 0x2 Error Accessing String iSerialNumber : 0x3 Error Accessing String bNumConfigurations : 0x1

    testpyusb: fetching string descriptors testpyusb: dev.manufacturer e: The device has no langid (permission issue, no string descriptors supported or device error) testpyusb: dev.product e: The device has no langid (permission issue, no string descriptors supported or device error) testpyusb: dev.idVendor 0x0fcf testpyusb: dev.idProduct 0x1009 testpyusb: set_configuration testpyusb: set configuration failed e: [Errno 13] Access denied (insufficient permissions)

    '

    GARM.txt testpyusb.py.txt

    opened by stuartlynne 0
  • Add a Gitter chat badge to README.md

    Add a Gitter chat badge to README.md

    rsc-dev/loophole now has a Chat Room on Gitter

    @rsc-dev has just created a chat room. You can visit it here: https://gitter.im/rsc-dev/loophole.

    This pull-request adds this badge to your README.md:

    Gitter

    If my aim is a little off, please let me know.

    Happy chatting.

    PS: Click here if you would prefer not to receive automatic pull-requests from Gitter in future.

    opened by gitter-badger 0
  • Update README.md - add Tested with: A360

    Update README.md - add Tested with: A360

    Polar A360 Activity Tracker works fine - connect, list, dump, get, walk. 'list' issues a "[!] Failed to get extended info.", but that does not seem to be a problem, Manufacturer, Product name, Vendor ID, Product ID and Serial number are shown properly.

    opened by k3ho 0
  • Issue connecting Polar Vantage V

    Issue connecting Polar Vantage V

    Dear @rsc-dev, I get the following error message when I try to connect loophole to my Polar Vantage V:

    .../__init__.py", line 502, in open assert self.ep_out_0 is not None

    I realize the Vantage series was not out when you wrote the code, but would you be so kind as to look into this matter, or perhaps give me some pointers so that I can try myself?

    Many thanks in advance.

    opened by flblanc 0
  • Polar v650

    Polar v650

    Hi!

    I'm trying to use your software with Polar v650. The list command does see the device, but when I try to connect it I get an error

    loophole(no device)>list 0 - Polar V650 (BUEY4HDMAIMVW8OJ)

    loophole(no device)>connect 0 Traceback (most recent call last): File "~/anaconda2/lib/python2.7/site-packages/loophole/main.py", line 300, in main() File "~/anaconda2/lib/python2.7/site-packages/loophole/main.py", line 293, in main cli.cmdloop(__INTRO.format(version)) File "~/anaconda2/lib/python2.7/cmd.py", line 142, in cmdloop stop = self.onecmd(line) File "~/anaconda2/lib/python2.7/cmd.py", line 221, in onecmd return func(arg) File "~/anaconda2/lib/python2.7/site-packages/loophole/main.py", line 116, in do_connect self.device.open() File "~/anaconda2/lib/python2.7/site-packages/loophole/polar/init.py", line 667, in open self.usb.open(self.usb_device) File "~/anaconda2/lib/python2.7/site-packages/loophole/polar/init.py", line 587, in open self.usb.open(usb_device) File "~/anaconda2/lib/python2.7/site-packages/loophole/polar/init.py", line 502, in open assert self.ep_out_0 is not None AssertionError

    Is it possible to solve?

    Thanks!

    opened by ArsenyMironov 2
  • Polar Ignite

    Polar Ignite

    Hi Roscoe, I'm wondering if you're still doing any work on this. I bought a polar ignite model, and unfortunately loophole doesn't seem to want to connect. If you have any thoughts on what I might try, I'd appreciate it very, very much.

    opened by JeffCdev 7
Releases(0.5.2)
Owner
[roscoe]
Coder. Security oriented. Inquisitive.
[roscoe]
Create custom Vanity URLs for Discord without 30 boosts

CustomVanity - Made by udp#6666 aka Apolo - OpenSource Custom Discord Vanity Creator How To Use Open CustomVanity.py Write your server invite code Wri

apolo 17 Aug 23, 2022
Telegram vc userbot

Telegram Vc Userbot Available Commands /ping :- To check whether userbot is up or not /joinvc :- To join vc /leavevc :- To leave vc /join_group :- To

NandyDark 7 Nov 18, 2022
PunkScape Discord bot to lookup rarities, create diptychs and more.

PunkScape Discord Bot A Discord bot created for the Discord server of PunkScapes, a banner NFT project. It was intially created to lookup rarities of

Akuti 4 Jun 24, 2022
An open-source Discord bot that alerts your server when it's Funky Monkey Friday!

Funky-Monkey-Friday-Bot An open-source Discord bot that alerts your server when it's Funky Monkey Friday! Add it to your server here! https://discord.

Cole Swinford 0 Nov 10, 2022
Twitter FakeNFT With Python

This project is a server that fetches your Twitter profile picture and applies the hexagonal transparency mask displayed on the profiles of users who have an NFT profile picture.

Mathis HAMMEL 29 Apr 23, 2022
⚡ Yuriko Robot ⚡ - A Powerful, Smart And Simple Group Manager Written with AioGram , Pyrogram and Telethon

⚡ Yuriko Robot ⚡ - A Powerful, Smart And Simple Group Manager Written with AioGram , Pyrogram and Telethon

Øғғɪᴄɪᴀʟ Ⱡᴏɢ [₳ғᴋ] 1 Apr 01, 2022
A decentralized messaging daemon built on top of the Kademlia routing protocol.

parakeet-message A decentralized messaging daemon built on top of the Kademlia routing protocol. Now that you are done laughing... pictures what is it

Jonathan Abbott 3 Apr 23, 2022
Simple Discord bot which logs several events in your server

logging-bot Simple Discord bot which logs several events in your server, including: Message Edits Message Deletes Role Adds Role Removes Member joins

1 Feb 14, 2022
use python script to fix vmp dump api in ida

FixVmpDump use python script to fix vmp dump api in ida. support x86 and x64. details in my blog: https://blog.csdn.net/yan_star/article/details/11279

97 Nov 02, 2022
The Official Dropbox API V2 SDK for Python

The offical Dropbox SDK for Python. Documentation can be found on Read The Docs. Installation Create an app via the Developer Console. Install via pip

Dropbox 828 Jan 05, 2023
Solcast rooftop api for HA

Solcast Solar Home Assistant(https://www.home-assistant.io/) Component This custom component integrates the Solcast API into Home Assistant. Modified

Greg 1 Oct 11, 2021
KTUN Öğrenci Bilgi Sistemine bağlanıp her 15 dakikada notları kontrol eden ve değişiklik olduğu zaman size Discord Webhook ile mesaj atan uygulama.

KTUN_Obis KTUN Öğrenci Bilgi Sistemi KTUN Öğrenci Bilgi Sistemine selenium kullanarak girip setttings.py dosyasında verdiğiniz bilgeri doldurup ardınd

İbrahim Uysal 5 Oct 27, 2022
A python based all-in-one tool for Google Drive

gdrive-tools A python based all-in-one tool for Google Drive Uses For Gdrive-Tools ✓ generate SA ✓ Add the SA and Add them to TD automatically ✓ Gener

XcodersHub 32 Feb 09, 2022
A CLI tool to transfer, sync, and backup playlists on music streaming services

unitunes A command-line interface tool to manage playlists across music streaming services. Introduction unitunes manages playlists across streaming s

Victor Tao 50 Jan 07, 2023
API Wrapper for seedr.cc

Seedr Python Client Seedr API built with 💛 by Souvik Pratiher Hit that Star button if you like this kind of SDKs and wants more of similar SDKs for o

Souvik Pratiher 2 Oct 24, 2021
Sadew Jayasekara 23 Oct 21, 2022
Python script for download course from platzi.com

Platzi Downloader Tool Esta es una pequeña herramienta que hace mucho y que te ahorra una gran cantidad de trabajo a la hora de descargar cursos de Pl

Devil64-Dev 21 Sep 22, 2022
A Telegram bot to index Chinese and Japanese group contents, works with @lilydjwg/luoxu.

luoxu-bot luoxu-bot 是类似于 luoxu-web 的 CJK 友好的 Telegram Bot,依赖于 luoxu 所创建的后端。 测试环境 Python 3.7.9 pip 21.1.2 开发中使用到的 Telethon 需要 Python 3+ 配置 前往 luoxu 根据相

TigerBeanst 10 Nov 18, 2022
A code that can make an account bump your discord server 24/7!

BumpCord A code that can make an account bump your discord server 24/7! The main.py is the main file. keep_alive.py prevents your repl from going to s

Phantom 28 Aug 20, 2022
This is a Telegram Bot that tracks packages from the Brazilian Mail Service.

RastreioBot About Setup Run Contribute Contact About This is a Telegram Bot that tracks packages from the Brazilian Mail Service. It runs on Python 3

Gabriel R F 320 Dec 22, 2022