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]
8300-account-nuker - A simple accoutn nuker or can use it full closing dm and leaving server

8300 ACCOUNT NUKER VERISON: its just simple accoutn nuker or can use it full clo

†† 5 Jan 26, 2022
GroupMenter : New Telegram Group Manager Bot🔸Fast 🔸Python🔸Pyrogram 🔸

GroupMenter An PowerFull Group Manager Bot. Written In Pytelethon. Info • A modular Telegram Python bot running on python3. • Can be found on telegram

Group Menter 24 Jun 28, 2022
vk Bot because of which everyone will lag

VK-crash-bot open cmd and write: "pip install vk-api" To configure the bot, you need to open main.py and set the value to such variables as "token" an

NotQuki 0 Jun 05, 2022
This Is A Python Program To Showcase Two Modules (Gratient And Fade)

Hellooo, It's PndaBoi Here! This Is A Python Program To Showcase Two Modules (Gratient And Fade). I Really Like Both Of These Modules So I Decided To

PndaBoi! 6 May 31, 2022
Ivan Telegram Userbot with python

Riviani Ramadhan Ivan-Ubot Pada Dasarnya Ivan-Ubot adalah userbot Telegram modular yang berjalan di Python3 dengan database sqlalchemy. Berbasis Paper

1 Oct 29, 2021
A small bot to interact with the reddit API. Get top viewers and update the sidebar widget.

LiveStream_Reddit_Bot Get top twitch and facebook stream viewers for a game and update the sidebar widget and old reddit sidebar to show your communit

Tristan Wise 1 Nov 21, 2021
Provide fine-grained push access to GitHub from a JupyterHub

github-app-user-auth Provide fine-grained push access to GitHub from a JupyterHub. Goals Allow users on a JupyterHub to grant push access to only spec

Yuvi Panda 20 Sep 13, 2022
RedFish API Toolkit

RedFish API Toolkit RedFish API Toolkit Build Status GitHub Actions Travis CI Requirements requirements.txt requirements-dev.txt Dependencies Document

Larry Smith Jr. 1 Nov 20, 2021
Ghostbuster - Eliminate dangling elastic IPs by performing analysis on your resources within all your AWS accounts

Table of Contents Table of Contents Ghostbuster The problem Project Features Ins

Assetnote 182 Dec 24, 2022
Bulk convert image types with Python

Bulk Image Converter 🔥 Helper script to convert a folder's worth of images from one filetype to another, and optionally delete originals Use Setup /

1 Nov 13, 2021
Portal Backend for Yuta management

Portal Backend for Yuta management Prerequisites Python 3.10 or above. pip, pdm installed. Quickstart Install the required packages: pdm install Runn

Loc Mai 1 Dec 20, 2021
Discord Panel is an AIO panel for Discord that aims to have all the needed tools related to user token interactions, as in nuking and also everything you could possibly need for raids

Discord Panel Discord Panel is an AIO panel for Discord that aims to have all the needed tools related to user token interactions, as in nuking and al

11 Mar 30, 2022
Braje: a python based credit hacker tool. Hack unlimited RAJE LIKER app Credit

#ReCoded Evan Al Mahmud Irfan ✨ ථ BRAJE 1.0 AUTO LIKER, AUTO COMMENT AND AUTO FOLLOWER APP CREDIT HACKER TOOL About Braje: Braje is a python based cre

Evan Al Mahmud Irfan ථ 2 Dec 23, 2021
Telegram Music Bot for YouTube/SoundCloud/Mixcloud

Telegram Music Bot Telegram Music Bot for YouTube/SoundCloud/Mixcloud This bot downloads and sends the audio when someone send a YouTube/SoundCloud/Mi

Calls Music 76 Jan 02, 2023
A program used to create accounts in bulk, still a work in progress as of now.

Discord Account Creator This project is still a work in progress. It will be published upon its full completion. About This project is still under dev

patched 8 Sep 15, 2022
My homeserver setup. Everything managed securely using Portainer.

homeserver-traefik-portainer Features: access all services with free TLS from letsencrypt using your own domain running a side project is super simple

Tomasz Wójcik 44 Jan 03, 2023
discord token grabber scam - eductional purposes only!

Discord-QR-Scam תופס אסימון תמונה של Discord על אודות סקריפט Python שיוצר אוטומטית קוד QR הונאה של Nitro ותופס את אסימון הדיסקורד בעת סריקה. כלי זה מד

Amit Pinchasi 0 May 22, 2022
:snake: Python SDK to query Scaleway APIs.

Scaleway SDK Python SDK to query Scaleway's APIs. Stable release: Development: Installation The package is available on pip. To install it in a virtua

Scaleway 114 Dec 11, 2022
A pypi package that helps in generating discord bots.

A pypi package that helps in generating discord bots.

KlevrHQ 3 Nov 17, 2021
Mixcloud API wrapper for Python and Async IO

aiomixcloud Mixcloud API wrapper for Python and Async IO aiomixcloud is a wrapper library for the HTTP API of Mixcloud. It supports asynchronous opera

Aristotelis Mikropoulos 26 Dec 31, 2022