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]
This repository will be a draft of a package about the latest total marine fish production in Indonesia. Data will be collected from PIPP (Pusat Informasi Pelabuhan Perikanan).

indomarinefish This package will give us information about the latest total marine fish production in Indonesia. The Name of the fish is written in In

1 Oct 13, 2021
A Python script for rendering glTF files with V-Ray App SDK

V-Ray glTF viewer Overview The V-Ray glTF viewer is a set of Python scripts for the V-Ray App SDK that allow the parsing and rendering of glTF (.gltf

Chaos 24 Dec 05, 2022
Sie_banxico - A python class for the Economic Information System (SIE) API of Banco de México

sie_banxico A python class for the Economic Information System (SIE) API of Banco de México. Args: token (str): A query token from Banco de México id_

Dillan 2 Apr 07, 2022
Python API Client for Close

Close API A convenient Python wrapper for the Close API. API docs: http://developer.close.com Support: Close 56 Nov 30, 2022

Rapid Sms Bomber For Indian Number.

Bombzilla Rapid Sms Bomber For Indian Number. Installation git clone https://github.com/sarv99/Bombzilla cd Bombzilla chmod +x setup.sh ./setup.sh Af

Saurav Jangid 1 Jan 12, 2022
Una herramienta para transmitir mensajes automáticamente a múltiples grupos de chat

chat-broadcast Una herramienta para transmitir mensajes automáticamente a múltiples grupos de chat Setup Librerías Necesitas Python 3 con la librería

Seguimos 2 Jan 09, 2022
Slack Developer Kit for Python

Python Slack SDK The Slack platform offers several APIs to build apps. Each Slack API delivers part of the capabilities from the platform, so that you

SlackAPI 3.5k Jan 02, 2023
Simple Python script that lets you upload image/video to imgur

Pymgur 🐍 Simple Python script that lets you upload image/video to imgur! Usage 🔨 Git Clone this repository install the requirements (pip install -r

3 Feb 20, 2022
A Discord Token Spammer, multi webhooks compatibility, made in python +3.7. By Ezermoz

DiscordWebhookSpammer A Discord Token Spammer, multi webhooks compatibility, made in python +3.7. By Ezermoz Put you webhook in webhooks.txt if you wa

3 Nov 24, 2021
A VCVideoPlayer Bot for Telegram made with 💞 By @TeamDeeCoDe

VC Video Player How To Host ✨ Heroku Deploy ✨ The easiest way to deploy this Bot is via Heroku. Credit 🔥 |🇮🇳 Louis |🇮🇳 Sammy |🇮🇳 Blaze |🇮🇳 S

TeamDeeCode 6 Feb 28, 2022
Python wrapper library for World Weather Online API

pywwo Python wrapper library for World Weather Online API using lxml.objectify How to use from pywwo import * setKey('your_key', 'free') w=LocalWeat

World Weather Online 20 Dec 19, 2022
Python bindings for LibreTranslate

Python bindings for LibreTranslate

Argos Open Tech 42 Jan 03, 2023
This script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin.

BOOKING IN BERLINS VACCINATION CENTERS This python script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin. T

17 Jan 13, 2022
A simple Discord Bot created for basic functionality and fun chat commands for use in a private server.

LoveAndChaos-Bot v0.1.0 LoveAndChaos-Bot is a Discord Bot specifically designed for a private server; this bot is merely a test and a method to expose

Morgan Rose 1 Dec 12, 2021
Código para trabalho com o dataset Wine em Python

Um perceptron multicamadas (MLP) é uma rede neural artificial feedforward que gera um conjunto de saídas a partir de um conjunto de entradas. Um MLP é

Hemili Beatriz 1 Jan 08, 2022
A heraldry-related bot, designed for the Heraldry Community.

Heraldtron A heraldry-related bot, designed for the Heraldry Community. Requirements Python 3.9+ discord.py aiohttp (comes installed with discord.py)

1 Mar 31, 2022
Rbx-mass-send - mass sends trades to item owners

mass sends trades to item owners proxies should be in ip:port format itemsToSend

0 Feb 20, 2022
The most expensive version of Conway's Game of Life - running on the Ethereum Blockchain

GameOfLife The most expensive implementation of Conway's Game of Life ever - over $2,000 per step! (Probably the slowest too!) Conway's Game of Life r

75 Nov 26, 2022
Experiment to find the best time to look for an appointment at the Berlin Bürgeramt

Bürgeramt appointment experiment Checks Berlin.de for free Anmeldung appointments every X minutes, then analyses the results. How to use Run get-page.

Nicolas Bouliane 42 Jan 02, 2023
Discord bot that manages expiration of roles with subscriptions!

Discord bot that manages expiration of roles with subscriptions!

Chakeaw__ 3 Apr 28, 2022