{ "info": { "author": "Tomi Tuhkanen", "author_email": "tomi.tuhkanen@iki.fi", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "RuuviTag Sensor Python Package\n==============================\n\n|Codeship Status for ttu/ruuvitag-sensor| |PyPI|\n\nRuuviTag Sensor is a Python library for communicating with `RuuviTag BLE\nSensor Beacon `__ and for decoding sensord data\nfrom broadcasted eddystone-url.\n\nRequirements\n~~~~~~~~~~~~\n\n- RuuviTag with Weather Station firmware\n\n - Setup `guide `__\n - Supports `Data Format 2, 3, 4 and\n 5 `__\n\n- Linux\n\n - Package\u2019s Windows and OSX supports are only for testing and url\n decoding\n\n- Bluez\n\n - ``sudo apt-get install bluez bluez-hcidump``\n - Package uses internally hciconfig, hcitool and hcidump. These\n tools are deprecated. In case tools are missing, older version of\n Bluez is required\n (`Issue `__)\n\n- Superuser rights\n\n - BlueZ tools require superuser rights\n\n- **NOTE:** Experimental implementation with cross-platform BLE\n communication in branch:\n `bleson-ble-communication `__\n\n - Uses `Bleson `__\n module instead of Bluez\n - More info and instrutions on issue\n `#78 `__\n\nInstallation\n~~~~~~~~~~~~\n\nInstall latest released version\n\n.. code:: sh\n\n $ pip install ruuvitag_sensor\n\nInstall latest developement version\n\n.. code:: sh\n\n $ pip install git+https://github.com/ttu/ruuvitag-sensor\n # Or clone this repository and install locally\n $ pip install -e .\n\nFull installation guide for `Raspberry PI &\nRaspbian `__\n\nUsage\n~~~~~\n\nRuuviTag sensors can be identified using MAC addresses.\n\nGet sensor datas with callback\n''''''''''''''''''''''''''''''\n\n``get_datas`` calls the callback every time when a RuuviTag sensor\nbroadcasts data. This method is the preferred way to use the library.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor\n\n def handle_data(found_data):\n print('MAC ' + found_data[0])\n print(found_data[1])\n\n RuuviTagSensor.get_datas(handle_data)\n\nOptional list of macs and run flag can be passed to the get_datas\nfunction. Callback is called only for macs in the list and setting run\nflag to false will stop execution. If run flag is not passed, function\nwill execute forever.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor, RunFlag\n\n counter = 10\n # RunFlag for stopping execution at desired time\n run_flag = RunFlag()\n\n def handle_data(found_data):\n print('MAC ' + found_data[0])\n print(found_data[1])\n global counter\n counter = counter - 1\n if counter < 0:\n run_flag.running = False\n\n # List of macs of sensors which will execute callback function\n macs = ['AA:2C:6A:1E:59:3D', 'CC:2C:6A:1E:59:3D']\n\n RuuviTagSensor.get_datas(handle_data, macs, run_flag)\n\nGet data for specified sensors\n''''''''''''''''''''''''''''''\n\n``get_data_for_sensors`` will collect latest data from sensors for\nspecified duration.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor\n\n # List of macs of sensors which data will be collected\n # If list is empty, data will be collected for all found sensors\n macs = ['AA:2C:6A:1E:59:3D', 'CC:2C:6A:1E:59:3D']\n # get_data_for_sensors will look data for the duration of timeout_in_sec\n timeout_in_sec = 4\n\n datas = RuuviTagSensor.get_data_for_sensors(macs, timeout_in_sec)\n\n # Dictionary will have lates data for each sensor\n print(datas['AA:2C:6A:1E:59:3D'])\n print(datas['CC:2C:6A:1E:59:3D'])\n\n**NOTE:** This method shouldn\u2019t be used for a long duration with short\ntimeout. ``get_data_for_sensors`` will start and stop a new BLE scanning\nprocess with every method call. For a long running processes it is\nrecommended to use ``get_datas``-method with a callback.\n\nGet data from sensor\n''''''''''''''''''''\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvitag import RuuviTag\n\n sensor = RuuviTag('AA:2C:6A:1E:59:3D')\n\n # update state from the device\n state = sensor.update()\n\n # get latest state (does not get it from the device)\n state = sensor.state\n\n print(state)\n\nRuuviTagReactive\n''''''''''''''''\n\nReactive wrapper and background process for RuuviTagSensor get_datas.\nOptional MAC address list can be passed on initializer and execution can\nbe stopped with stop function.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi_rx import RuuviTagReactive\n\n ruuvi_rx = RuuviTagReactive()\n\n # Print all notifications\n ruuvi_rx.get_subject().\\\n subscribe(print)\n\n # Print only last data every 10 seconds for F4:A5:74:89:16:57\n ruuvi_rx.get_subject().\\\n filter(lambda x: x[0] == 'F4:A5:74:89:16:57').\\\n buffer_with_time(10000).\\\n subscribe(lambda datas: print(datas[len(datas) - 1]))\n\n # Execute only every time when temperature changes for F4:A5:74:89:16:57\n ruuvi_rx.get_subject().\\\n filter(lambda x: x[0] == 'F4:A5:74:89:16:57').\\\n map(lambda x: x[1]['temperature']).\\\n distinct_until_changed().\\\n subscribe(lambda x: print('Temperature changed: {}'.format(x)))\n\n # Close all connections and stop bluetooth communication\n ruuvi_rx.stop()\n\nMore\n`samples `__\nand simple `HTTP\nserver `__\nunder examples directory.\n\nCheck official documentation from RxPy\n`GitHub `__ and `RxPY Public\nAPI `__\n\nFind sensors\n''''''''''''\n\n``find_ruuvitags`` function will exeute forever and when new RuuviTag\nsensor is found it will print it\u2019s MAC address and state at that moment.\nThis function can be used with a command line applications. Logging must\nbe enabled and set to print to console.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor\n import ruuvitag_sensor.log\n\n ruuvitag_sensor.log.enable_console()\n\n RuuviTagSensor.find_ruuvitags()\n\nUsing different Bluetooth device\n''''''''''''''''''''''''''''''''\n\nIf you have multiple Bluetooth devices installed, device to be used\nmight not be the default (Linux: hci0). Device can be passed with\n``bt_device`` parameter.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor\n from ruuvitag_sensor.ruuvitag import RuuviTag\n\n sensor = RuuviTag('F4:A5:74:89:16:57', 'hci1')\n\n RuuviTagSensor.find_ruuvitags('hci1')\n\n datas = RuuviTagSensor.get_data_for_sensors(bt_device='hci1')\n\n RuuviTagSensor.get_datas(lambda x: print('%s - %s' % (x[0], x[1]), bt_device=device))\n\nParse data\n''''''''''\n\n.. code:: python\n\n from ruuvitag_sensor.data_formats import DataFormats\n from ruuvitag_sensor.decoder import get_decoder\n\n full_data = '043E2A0201030157168974A51F0201060303AAFE1716AAFE10F9037275752E76692F23416A5558314D417730C3'\n data = full_data[26:]\n\n # convert_data returns tuple which has Data Format type and encoded data\n (data_format, encoded) = DataFormats.convert_data(data)\n\n sensor_data = get_decoder(data_format).decode_data(encoded)\n\n print(sensor_data)\n # {'temperature': 25.12, 'identifier': '0', 'humidity': 26.5, 'pressure': 992.0}\n\nData Formats\n''''''''''''\n\nExample data has data from 4 sensors with different firmwares. \\* 1st is\nData Format 2 (URL) so identifier is None as sensor doesn\u2019t broadcast\nany identifier data \\* 2nd is Data Format 4 (URL) and it has an\nidentifier character \\* 3rd is Data Format 3 (RAW) \\* 4th is Data Format\n5 (RAW v2)\n\n.. code:: python\n\n {\n 'CA:F7:44:DE:EB:E1': { 'data_format': 2, 'temperature': 22.0, 'humidity': 28.0, 'pressure': 991.0, 'identifier': None }, \n 'F4:A5:74:89:16:57': { 'data_format': 4, 'temperature': 23.24, 'humidity': 29.0, 'pressure': 991.0, 'identifier': '0' },\n 'A3:GE:2D:91:A4:1F': { 'data_format': 3, 'battery': 2899, 'pressure': 1027.66, 'humidity': 20.5, 'acceleration': 63818.215675463696, 'acceleration_x': 200.34, 'acceleration_y': 0.512, 'acceleration_z': -200.42, 'temperature': 26.3},\n 'CB:B8:33:4C:88:4F': { 'data_format': 5, 'battery': 2.995, 'pressure': 1000.43, 'mac': 'cbb8334c884f', 'measurement_sequence_number': 2467, 'acceleration_z': 1028, 'acceleration': 1028.0389097694697, 'temperature': 22.14, 'acceleration_y': -8, 'acceleration_x': 4, 'humidity': 53.97, 'tx_power': 4, 'movement_counter': 70 }\n }\n\nLogging and Print to console\n''''''''''''''''''''''''''''\n\nLogging can be enabled by importing ``ruuvitag_sensor.log``. Console\nprint can be enabled by calling\n``ruuvitag_sensor.log.enable_console()``. Command line application has\nconsole logging enabled by default.\n\n.. code:: python\n\n from ruuvitag_sensor.ruuvi import RuuviTagSensor\n import ruuvitag_sensor.log\n\n ruuvitag_sensor.log.enable_console()\n\n datas = RuuviTagSensor.get_data_for_sensors()\n\n print(datas)\n\nCommand line application\n''''''''''''''''''''''''\n\n::\n\n $ python ruuvitag_sensor -h\n\n usage: ruuvitag_sensor [-h] [-g MAC_ADDRESS] [-d BT_DEVICE] [-f] [-l] [-s] [--version]\n\n optional arguments:\n -h, --help show this help message and exit\n -g MAC_ADDRESS, --get MAC_ADDRESS\n Get data\n -d BT_DEVICE, --device BT_DEVICE\n Set Bluetooth device id (default hci0)\n -f, --find Find broadcasting RuuviTags\n -l, --latest Get latest data for found RuuviTags\n -s, --stream Stream broadcasts from all RuuviTags\n --version show program's version number and exit\n\nBluez limitations\n-----------------\n\nThe ruuvitag-sensor use Bluez to listen broadcasted BL information (uses\n*hciconf*, *hcitool*, *hcidump*). Implementation does not handle well\nunexpected errors or changes, e.g.\u00a0when adapter is busy, rebooted or\npowered down.\n\nIn case of errors, application tries to exit immediately, so it can be\nautomatically restarted.\n\nExamples\n--------\n\nExamples are in\n`examples `__\ndirectory, e.g.\n\n- Keep track of each sensors current status and send updated data to\n server.\n `Sync `__\n and\n `async `__\n version.\n- Send found sensor data to InfluxDB.\n `Reactive `__\n and\n `non-reactive `__\n version. Naming convention of sent data matches `RuuviCollector\n library `__.\n- Simple HTTP Server for serving found sensor data.\n `Flask `__,\n `aiohttp `__\n and `aiohttp with\n Rx `__.\n\nChangelog\n---------\n\n`Changelog `__\n\nDeveloper notes\n---------------\n\n`Notes for\ndevelopers `__\nwho are interested in developing RuuviTag Sensor package or interested\nin it\u2019s internal functionality.\n\nContributing\n------------\n\nPull requests are welcome. For major changes, please open an issue first\nto discuss what you would like to change.\n\nLicense\n-------\n\nLicensed under the\n`MIT `__\nLicense.\n\n.. |Codeship Status for ttu/ruuvitag-sensor| image:: https://codeship.com/projects/5d8139b0-52ae-0134-2889-02adab5d782c/status?branch=master\n :target: https://codeship.com/projects/171611\n.. |PyPI| image:: https://img.shields.io/pypi/v/ruuvitag_sensor.svg\n :target: https://pypi.python.org/pypi/ruuvitag_sensor\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/ttu/ruuvitag-sensor/tarball/0.13.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ttu/ruuvitag-sensor", "keywords": "RuuviTag BLE", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ruuvitag_sensor", "package_url": "https://pypi.org/project/ruuvitag_sensor/", "platform": "any", "project_url": "https://pypi.org/project/ruuvitag_sensor/", "project_urls": { "Download": "https://github.com/ttu/ruuvitag-sensor/tarball/0.13.0", "Homepage": "https://github.com/ttu/ruuvitag-sensor" }, "release_url": "https://pypi.org/project/ruuvitag_sensor/0.13.0/", "requires_dist": null, "requires_python": "", "summary": "Find RuuviTag sensor beacons and get data from selected sensor and decode data from eddystone url", "version": "0.13.0" }, "last_serial": 5470734, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "9111e9d33705eb10d22bf1863d5e1ec1", "sha256": "bab0fb6d1583145fb8da6b16c5a4b9d4e9f8659e47f366a935af8ac5dab5ced0" }, "downloads": -1, "filename": "ruuvitag_sensor-0.10.0.tar.gz", "has_sig": false, "md5_digest": "9111e9d33705eb10d22bf1863d5e1ec1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15700, "upload_time": "2018-03-11T17:12:09", "url": "https://files.pythonhosted.org/packages/21/6a/6c5a30f0e9089bebe8bfd4e1dc019d05a64f867b4b6796ab1fb52f802603/ruuvitag_sensor-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "adca3b718f63975381d11bc8cb3b8532", "sha256": "1e5c98349eb8ecd3b88be01558759ba36abf2d8af3bd985065967494c9d129de" }, "downloads": -1, "filename": "ruuvitag_sensor-0.11.0.tar.gz", "has_sig": false, "md5_digest": "adca3b718f63975381d11bc8cb3b8532", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16857, "upload_time": "2018-04-25T14:51:57", "url": "https://files.pythonhosted.org/packages/bf/dc/f9fff32bc5be277f531bc0dbd5b2d9cb2778d128fabc485170f35e987325/ruuvitag_sensor-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "b75674a620be4206783188e02d42254e", "sha256": "d77818a9ce50f0b4e8b7ca95a19526e2c4f6616eab75db1c37b2abb576fe4d21" }, "downloads": -1, "filename": "ruuvitag_sensor-0.12.0.tar.gz", "has_sig": false, "md5_digest": "b75674a620be4206783188e02d42254e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17430, "upload_time": "2019-02-15T18:15:39", "url": "https://files.pythonhosted.org/packages/34/d9/a0a7eab9dbf3b64d310cd4b4aee22d9cedc0fe5635e4c619f11b56748ef7/ruuvitag_sensor-0.12.0.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "d2fa075044e0cbbbf2b050cc60d569bd", "sha256": "27b42d457f0722796ca10d26733b96e9ac431e446473cd4d755729c277dbf253" }, "downloads": -1, "filename": "ruuvitag_sensor-0.13.0.tar.gz", "has_sig": false, "md5_digest": "d2fa075044e0cbbbf2b050cc60d569bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17700, "upload_time": "2019-07-01T11:49:21", "url": "https://files.pythonhosted.org/packages/72/04/582136009773cccc389002a858b24e4abaecc02ed3f7fc6d4bee40a6704f/ruuvitag_sensor-0.13.0.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "aec23af1a96ce0f6b7a4e8705a231830", "sha256": "79f8d390b70f3f7e9dd91321d41bb3400d80e57459c265bb648adb0043d3cfc2" }, "downloads": -1, "filename": "ruuvitag_sensor-0.2.2.zip", "has_sig": false, "md5_digest": "aec23af1a96ce0f6b7a4e8705a231830", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11480, "upload_time": "2017-01-03T22:37:48", "url": "https://files.pythonhosted.org/packages/cf/71/230c436d0bd7b3e381fc9c2e5e86f09b1de01b767ddeb4c7c08965e77e10/ruuvitag_sensor-0.2.2.zip" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "0c04d5ed3c2b3d6c3238293ccb9f7233", "sha256": "8069036efd30d406db02a3a6813a7a32ed7a8157f45810c7dcb618254a5a11a2" }, "downloads": -1, "filename": "ruuvitag_sensor-0.3.0.zip", "has_sig": false, "md5_digest": "0c04d5ed3c2b3d6c3238293ccb9f7233", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12793, "upload_time": "2017-01-28T23:09:31", "url": "https://files.pythonhosted.org/packages/5d/6b/7d9f67af9a4acfcdb965db25178fa2269680eaad47dfe09313b44ba7ea2b/ruuvitag_sensor-0.3.0.zip" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "fed5f0e5c20828a0722b2707d81c4e5f", "sha256": "470a14897b4394b13edda0a2bea8f1999f079fcb4fafd56a1d163c9b87199a09" }, "downloads": -1, "filename": "ruuvitag_sensor-0.3.1.zip", "has_sig": false, "md5_digest": "fed5f0e5c20828a0722b2707d81c4e5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12829, "upload_time": "2017-01-29T16:45:16", "url": "https://files.pythonhosted.org/packages/e3/33/4979ed6dd79f08f31d81c758dbe2ccc299c07e7a162a9041f87ec6e7d832/ruuvitag_sensor-0.3.1.zip" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "69b577d157a5648ad9fd9e44bb418166", "sha256": "17857d77b7b47a0c7f14dd4008bfa8c0b2b679e89c4f66179af44e08e0cff4a8" }, "downloads": -1, "filename": "ruuvitag_sensor-0.3.2.zip", "has_sig": false, "md5_digest": "69b577d157a5648ad9fd9e44bb418166", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12978, "upload_time": "2017-01-30T19:21:18", "url": "https://files.pythonhosted.org/packages/00/02/492a4cc16fc22bef7f6e0f02cfad35683753767bf46f431539745874228d/ruuvitag_sensor-0.3.2.zip" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "397cba9b1e787b496cf59420b9ed6739", "sha256": "0d94ab2be5e9a8c8a94469ea4c1012188e004d27f35c145d04815fff56200590" }, "downloads": -1, "filename": "ruuvitag_sensor-0.3.3.zip", "has_sig": false, "md5_digest": "397cba9b1e787b496cf59420b9ed6739", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12958, "upload_time": "2017-01-31T08:15:19", "url": "https://files.pythonhosted.org/packages/71/0c/9745e012fa2a66be1f3fdc90826904a6df27708cd65de56e7d2fdd4f4c80/ruuvitag_sensor-0.3.3.zip" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "aef497ec2f0a97d8f3e57d5d223e79fd", "sha256": "7a7c9de95a1acf674c98a07aeb919e407bc16f0e42f57b1e99c391edb5a2c586" }, "downloads": -1, "filename": "ruuvitag_sensor-0.3.4.zip", "has_sig": false, "md5_digest": "aef497ec2f0a97d8f3e57d5d223e79fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12949, "upload_time": "2017-02-01T07:55:27", "url": "https://files.pythonhosted.org/packages/9d/f3/e7c9598c0dc3a7d613f2125f62dc6faa24a1c969a40e5516af9efaa26cef/ruuvitag_sensor-0.3.4.zip" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "c1e7ff2a715dcfd10b41da00178bbc11", "sha256": "3275670fec3de7dd22cfd94091834922c435214e50b33dc5ff9e7a56b1a9e113" }, "downloads": -1, "filename": "ruuvitag_sensor-0.4.0.zip", "has_sig": false, "md5_digest": "c1e7ff2a715dcfd10b41da00178bbc11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14939, "upload_time": "2017-02-19T09:59:23", "url": "https://files.pythonhosted.org/packages/01/d2/644432d71763ecbc654a824040d0070dcbf845f0b68d3ade5f6988808c10/ruuvitag_sensor-0.4.0.zip" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "9a9785dd65739e8b1f47be876e792b95", "sha256": "ca4a3d0de9e0c677bdd4c3d5dcb1bdeaab769714dc971749b82a49d158f2b095" }, "downloads": -1, "filename": "ruuvitag_sensor-0.5.0.zip", "has_sig": false, "md5_digest": "9a9785dd65739e8b1f47be876e792b95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17634, "upload_time": "2017-03-01T22:00:23", "url": "https://files.pythonhosted.org/packages/ee/36/8016262be8a3e523dc2ff7b134b9587e1f1b922b0302109851ca1f436938/ruuvitag_sensor-0.5.0.zip" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "7b0c15d2f20d420ddbb24527cf5a6147", "sha256": "04f45c89f2bf5f31fa6c16ff0c1eabcdebf350acc1237e5b69ac1675c173b2a7" }, "downloads": -1, "filename": "ruuvitag_sensor-0.6.0.zip", "has_sig": false, "md5_digest": "7b0c15d2f20d420ddbb24527cf5a6147", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19462, "upload_time": "2017-05-05T19:01:56", "url": "https://files.pythonhosted.org/packages/95/da/e685615a13aeeb9bb0d8e0f45c126039efa6a0e317f1b5844045fc2db473/ruuvitag_sensor-0.6.0.zip" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "a2777e09717e40c092cb2d43acc79fee", "sha256": "e3598065dbfc85a11de049677fcfae8656d697a27a14d176befb1322c250d947" }, "downloads": -1, "filename": "ruuvitag_sensor-0.7.0.zip", "has_sig": false, "md5_digest": "a2777e09717e40c092cb2d43acc79fee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20180, "upload_time": "2017-06-28T21:27:20", "url": "https://files.pythonhosted.org/packages/d9/19/4108b74b78ffd3e9a0b7150df00b018003cd5b2c02d4600aa6a1c4188848/ruuvitag_sensor-0.7.0.zip" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "a0c20a7e28f97f554da4cb0c92b64cd1", "sha256": "1876b910268e733c4253c07d360545b6e0d40b699441b6b17830799e3cae95d4" }, "downloads": -1, "filename": "ruuvitag_sensor-0.8.0.tar.gz", "has_sig": false, "md5_digest": "a0c20a7e28f97f554da4cb0c92b64cd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14409, "upload_time": "2017-07-29T07:14:15", "url": "https://files.pythonhosted.org/packages/de/e2/bfbadc45996df3110407a9c0cbf3399718886f7735f40071c31ab4c34b96/ruuvitag_sensor-0.8.0.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "bb626477e42faddb1406d00395385e88", "sha256": "6053f3011b86dc964c148041bfe0a9d73b2707e5308f631e356458426db95151" }, "downloads": -1, "filename": "ruuvitag_sensor-0.8.2.tar.gz", "has_sig": false, "md5_digest": "bb626477e42faddb1406d00395385e88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14599, "upload_time": "2017-09-09T12:17:22", "url": "https://files.pythonhosted.org/packages/49/4c/cc2afc1bddae2a194a9128c078bf55319a9e650f388bab6323e2de7ba7f4/ruuvitag_sensor-0.8.2.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "132fb34de2f31f4a0519eb0c11e59559", "sha256": "49924ae26376b9f4efff64909b4fac996e2a044923fe36275ed29a0d209d68e6" }, "downloads": -1, "filename": "ruuvitag_sensor-0.9.0.tar.gz", "has_sig": false, "md5_digest": "132fb34de2f31f4a0519eb0c11e59559", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15578, "upload_time": "2017-10-28T22:08:11", "url": "https://files.pythonhosted.org/packages/06/a3/9e7f02f8c8a995e4735f66d946c60d6250406681acd721d1c452e18d3416/ruuvitag_sensor-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d2fa075044e0cbbbf2b050cc60d569bd", "sha256": "27b42d457f0722796ca10d26733b96e9ac431e446473cd4d755729c277dbf253" }, "downloads": -1, "filename": "ruuvitag_sensor-0.13.0.tar.gz", "has_sig": false, "md5_digest": "d2fa075044e0cbbbf2b050cc60d569bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17700, "upload_time": "2019-07-01T11:49:21", "url": "https://files.pythonhosted.org/packages/72/04/582136009773cccc389002a858b24e4abaecc02ed3f7fc6d4bee40a6704f/ruuvitag_sensor-0.13.0.tar.gz" } ] }