{ "info": { "author": "Markus Ressel", "author_email": "mail@markusressel.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": ".. |pypi_version| image:: https://badge.fury.io/py/raspyrfm-client.svg\n :target: https://badge.fury.io/py/raspyrfm-client\n\nraspyrfm-client |pypi_version|\n==============================\n\nA python 3.4+ library that allows the generation of network codes for the RaspyRFM rc module (and other gateways too!).\n\nBuild Status\n============\n\n.. |build_master| image:: https://travis-ci.org/markusressel/raspyrfm-client.svg?branch=master\n :target: https://travis-ci.org/markusressel/raspyrfm-client/branches\n\n.. |build_beta| image:: https://travis-ci.org/markusressel/raspyrfm-client.svg?branch=beta\n :target: https://travis-ci.org/markusressel/raspyrfm-client/branches\n\n.. |build_dev| image:: https://travis-ci.org/markusressel/raspyrfm-client.svg?branch=dev\n :target: https://travis-ci.org/markusressel/raspyrfm-client/branches\n\n\n.. |codebeat_master| image:: https://codebeat.co/badges/fcac9cfe-b6a2-4c4a-938d-42214371dc3d\n :target: https://codebeat.co/projects/github-com-markusressel-raspyrfm-client-master\n\n.. |codebeat_beta| image:: https://codebeat.co/badges/c6c09759-3f34-4a16-b17e-d7989b3f7fae\n :target: https://codebeat.co/projects/github-com-markusressel-xs1-api-client-beta\n\n.. |codebeat_dev| image:: https://codebeat.co/badges/6ef4cbdd-a452-45b2-8ee8-f7a09e53689f\n :target: https://codebeat.co/projects/github-com-markusressel-raspyrfm-client-dev\n\n+--------------------+------------------+-----------------+\n| Master | Beta | Dev |\n+====================+==================+=================+\n| |build_master| | |build_beta| | |build_dev| |\n+--------------------+------------------+-----------------+\n| |codebeat_master| | |codebeat_beta| | |codebeat_dev| |\n+--------------------+------------------+-----------------+\n\n\nHow to use\n==========\n\nInstallation\n------------\n\n:code:`pip install raspyrfm-client`\n\nUsage\n-----\n\nFor a basic example have a look at the `example.py `_ file.\n\nIf you need more info have a look at the `documentation `_ which should help.\n\nBasic Example\n-------------\nImport required modules\n^^^^^^^^^^^^^^^^^^^^^^^\n.. code-block:: python\n\n from raspyrfm_client import RaspyRFMClient\n from raspyrfm_client.device_implementations.controlunit.actions import Action\n from raspyrfm_client.device_implementations.controlunit.controlunit_constants import ControlUnitModel\n from raspyrfm_client.device_implementations.gateway.manufacturer.gateway_constants import GatewayModel\n from raspyrfm_client.device_implementations.manufacturer_constants import Manufacturer\n\n\nCreate the :code:`RaspyRFMClient` object\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nGet a client instance by calling:\n\n\n.. code-block:: python\n\n rfm_client = RaspyRFMClient()\n\nCreate a :code:`Gateway` instance\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nYou can let the library search automatically for gateways available in LAN using:\n\n.. code-block:: python\n\n gateways = rfm_client.search()\n\nThis will return a list of Gateways that can later be used to send signals to.\n\nTo get a quick overview of what gateway **manufacturers** and **models** are supported call:\n\n.. code-block:: python\n\n rfm_client.list_supported_gateways()\n\nCreate a gateway instance with the specified :code:`IP` and :code:`Port` of your Gateway by using:\n\n.. code-block:: python\n\n gateway = rfm_client.get_gateway(Manufacturer.SEEGEL_SYSTEME, GatewayModel.RASPYRFM, \"192.168.2.10\", 9876)\n\nor\n\n.. code-block:: python\n\n gateway = rfm_client.get_gateway(Manufacturer.SEEGEL_SYSTEME, GatewayModel.RASPYRFM, \"192.168.2.10\") # defaults to 49880 or the gateway implementations default\n\nGet a :code:`ControlUnit`\n^^^^^^^^^^^^^^^^^^^^^^^^^\nControlUnits are the devices that receive the RC signals sent using the gateway, f.ex. a power outlet.\n\nTo get a quick overview of what ControlUnits **manufacturers** and **models** are supported call:\n\n.. code-block:: python\n\n rfm_client.list_supported_controlunits()\n\nwhich will give you an indented list of supported manufacturers and their supported models similar to this:\n\n.. code-block:: text\n\n Elro\n RC3500-A IP44 DE\n AB440S\n AB440D 200W\n AB440D 300W\n AB440ID\n AB440IS\n AB440L\n AB440SC\n AB440WD\n BAT\n RC AAA1000-A IP44 Outdoor\n Brennenstuhl\n RCS 1000 N Comfort\n RCS 1044 N Comfort\n Intertek\n Model 1919361\n [...]\n\nTo generate codes for a device **you first have to get an instance of its implementation** like this:\n\n.. code-block:: python\n\n brennenstuhl_rcs1000 = rfm_client.get_controlunit(manufacturer_constants.BRENNENSTUHL,\n manufacturer_constants.RCS_1000_N_COMFORT)\n\nThe parameters of the :code:`get_controlunit()` method always need to be an enum value of the specified type.\nYou can get an enum constant by its name though using:\n\n.. code-block:: python\n\n manufacturer = Manufacturer(\"Intertechno\")\n model = ControlUnitModel(\"IT-1500\")\n\n:code:`ControlUnit` channel configuration\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nBefore you can generate codes with your shiny new gateway and :code:`ControlUnit` implementations you have to specify a channel configuration for your :code:`ControlUnit`. These **configurations can be very different for every device**. The best way to know the correct way of specifying the channel configuration for a specific device is to look at the source code (yes I know...) or by trial and error (even worse). A good :code:`ControlUnit` implementation should tell you how the configuration should look like when specifying it in a wrong way.\n\nHowever all configurations are a **keyed dictionary**.\nSo in general there are two ways of passing the channel configuration argument.\nOne (inline):\n\n.. code-block:: python\n\n device.set_channel_config(value1=1, value2=2)\n\nTwo (as a dictionary):\n\n.. code-block:: python\n\n device.set_channel_config(**{\n 'value1': 1,\n 'value2': 2\n })\n\n**Note** that the **keys always need to be a** :code:`string`.\nThe second one is the recommended one as it will often result in a much more readable source code.\n\nFor our Brennenstuhl device it would look like this:\n\n.. code-block:: python\n\n brennenstuhl_rcs1000.set_channel_config(**{\n '1': True,\n '2': True,\n '3': True,\n '4': True,\n '5': True,\n 'CH': 'A'\n })\n\nGenerate action codes\n^^^^^^^^^^^^^^^^^^^^^\nNow that you have a properly set up :code:`ControlUnit` you can generate codes for it's supported actions by using an :code:`Action` enum constant that you imported previously.\n\nTo get a list of supported actions for a :code:`ControlUnit` call:\n\n.. code-block:: python\n\n brennenstuhl_rcs1000.get_supported_actions()\n\nand generate a code for one of them using your :code:`Gateway` instance:\n\n.. code-block:: python\n\n code = gateway.generate_code(brennenstuhl_rcs1000, Action.ON)\n\nSend the code to the :code:`RaspyRFM` module\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTo send a code for your device of choice you can combine the objects in this call:\n\n.. code-block:: python\n\n rfm_client.send(gateway, brennenstuhl_rcs1000, Action.ON)\n\nThis will generate a code specific to the passed in gateway implementation and send it to it's host address immediately after.\n\nCustom implementations\n======================\n\nThe :code:`raspyrfm-client` library is designed so you can implement custom devices in a (hopefully) very easy way.\n\nFile Structure\n--------------\nAll :code:`ControlUnit` implementations are located in the :code:`/device_implementations/controlunit/manufacturer/` module and implement the base class :code:`Device` that can be found in :code:`/device_implementations/controlunit/base.py`.\n\nCreate a new :code:`ControlUnit`\n--------------------------------\nTo create a new :code:`ControlUnit` implementation for a new manufacturer and model create a new subdirectory for your manufacturer and a python file for your model:\n\n.. code-block::\n\n \u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acraspyrfm_client\n \u00e2\u201d\u201a \u00e2\u201d\u201a client.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u201d\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acdevice\n \u00e2\u201d\u201a \u00e2\u201d\u201a actions.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a base.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u201d\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acmanufacturer\n \u00e2\u201d\u201a \u00e2\u201d\u201a manufacturer_constants.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u0153\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acintertek\n \u00e2\u201d\u201a \u00e2\u201d\u201a Model1919361.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u0153\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acrev\n \u00e2\u201d\u201a \u00e2\u201d\u201a Ritter.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a Telecontrol.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u0153\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acuniversal\n \u00e2\u201d\u201a \u00e2\u201d\u201a HX2262Compatible.py\n \u00e2\u201d\u201a \u00e2\u201d\u201a\n \u00e2\u201d\u201a \u00e2\u201d\u201d\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20acyourmanufacturer\n \u00e2\u201d\u201a yourmodel.py\n \u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\u00e2\u201d\u20ac\n\nImplement a :code:`ControlUnit`\n-------------------------------\n\nNow the basic implementation of your :code:`ControlUnit` should looks like this:\n\n.. code-block:: python\n\n from raspyrfm_client.device_implementations.controlunit.actions import Action\n from raspyrfm_client.device_implementations.controlunit.base import ControlUnit\n\n\n class YourModel(ControlUnit):\n def __init__(self):\n from raspyrfm_client.device_implementations.manufacturer_constants import Manufacturer\n from raspyrfm_client.device_implementations.controlunit.controlunit_constants import ControlUnitModel\n super().__init__(Manufacturer.YourManufacturer, ControlUnitModel.YourModel)\n\n def get_channel_config_args(self):\n return {}\n\n def get_pulse_data(self, action: Action):\n return [[0, 0], [0, 0]], 0, 0\n\n def get_supported_actions(self) -> [str]:\n return [Action.ON]\n\n\nMost importantly you have to call the :code:`super().__init__` method like shown. This will ensure that your implementation is found by the :code:`RaspyRFMClient` and you can get an instance of your device using :code:`rfm_client.get_controlunit()` as shown before.\n\nIf your manufacturer does not exist yet **create a new enum constant** in the :code:`manufacturer_constants.py` file and use its value in your :code:`__init__`.\n**Do the same thing for your model name** in the :code:`controlunit_constants.py` file.\n\nYou also have to implement all abstract methods from the :code:`Device` class. Have a look at it's documentation to get a sense of what those methods are all about.\n\nAfter you have implemented all methods you are good to go!\nJust call :code:`rfm_client.reload_implementation_classes()` and :code:`rfm_client.list_supported_controlunits()` to check if your implementation is listed.\nIf everything looks good you can use your implementation like any other one.\n\n\n\nExclude a WIP implementation\n----------------------------\nTo prevent the RaspyRFM client from importing your half baked or base class implementation just include a class field like this:\n\n.. code-block:: python\n\n class YourModel(ControlUnit):\n DISABLED = True\n\n [...]\n\nContributing\n============\n\nGitHub is for social coding: if you want to write code, I encourage contributions through pull requests from forks\nof this repository. Create GitHub tickets for bugs and new features and comment on the ones that you are interested in.\n\nLicense\n=======\n\n::\n\n raspyrfm-client by Markus Ressel\n Copyright (C) 2017 Markus Ressel\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see .\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/markusressel/raspyrfm-client", "keywords": "", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "raspyrfm-client", "package_url": "https://pypi.org/project/raspyrfm-client/", "platform": "", "project_url": "https://pypi.org/project/raspyrfm-client/", "project_urls": { "Homepage": "https://github.com/markusressel/raspyrfm-client" }, "release_url": "https://pypi.org/project/raspyrfm-client/1.2.8/", "requires_dist": null, "requires_python": "", "summary": "A library to send rc signals with the RaspyRFM module", "version": "1.2.8" }, "last_serial": 4286635, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "af6c3a65d9f3f2d40919b2fefbe7f941", "sha256": "d35f9f2b9af371159bd8d95a0613f5619528ddedb2fc6ae2c2dff5e89d5d3826" }, "downloads": -1, "filename": "raspyrfm_client-1.0.0-py2.7.egg", "has_sig": false, "md5_digest": "af6c3a65d9f3f2d40919b2fefbe7f941", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43163, "upload_time": "2017-03-16T23:18:16", "url": "https://files.pythonhosted.org/packages/5f/2b/181ddd90d222dc935049051bfedb36cc0b939fbd76870c5ce0bb3240c5c8/raspyrfm_client-1.0.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "c0613f58f113f10f09ad2129acd6bbec", "sha256": "0c930cf6eb1ffcbf775d43fdcae7abc49cdf9b29ccabf53d83050c7b8bb14425" }, "downloads": -1, "filename": "raspyrfm_client-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "c0613f58f113f10f09ad2129acd6bbec", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 27512, "upload_time": "2017-03-16T23:18:15", "url": "https://files.pythonhosted.org/packages/59/f7/4f54550b238078479d3fde391c4342ddfebb40e67e532b5a24b3e0c5deed/raspyrfm_client-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99ca2e977dfda56a6f9577b1b4facfb4", "sha256": "0280f1a2a53a998ee2173d502cbc1ff1c60cba03ba0dc5f0db6e99226938f0cc" }, "downloads": -1, "filename": "raspyrfm_client-1.0.0.zip", "has_sig": false, "md5_digest": "99ca2e977dfda56a6f9577b1b4facfb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31631, "upload_time": "2017-03-16T23:18:18", "url": "https://files.pythonhosted.org/packages/82/bb/bc8fac4925672f1dc56d74927d46c6ba244705edb32cdab3f14a96907d09/raspyrfm_client-1.0.0.zip" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "a958caf251de873b111e7a889d6ed19c", "sha256": "1d7e411ce75e63d0fde2366b0d7fb98520b5489ce2145746941ab991afe05df6" }, "downloads": -1, "filename": "raspyrfm_client-1.1.0.zip", "has_sig": false, "md5_digest": "a958caf251de873b111e7a889d6ed19c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37732, "upload_time": "2017-04-04T17:12:36", "url": "https://files.pythonhosted.org/packages/ad/36/c17ec962d0f94b3d63f7db790a3c48f76d4c28266842e19f857d4fce2be2/raspyrfm_client-1.1.0.zip" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "89dbaaefb415c8e5c0ae90b182e6eda3", "sha256": "8399bb4f719f456ba19472d70114e6bd6030e7ebacde6b96ed0aeaaa0c8ad1d1" }, "downloads": -1, "filename": "raspyrfm_client-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "89dbaaefb415c8e5c0ae90b182e6eda3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 72666, "upload_time": "2017-05-20T04:30:32", "url": "https://files.pythonhosted.org/packages/5f/f8/5b8c8a1f22c8c61fb861c974f14c5fa72825731a78d5b504e223526a68e4/raspyrfm_client-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a811bb4bedcb35e8ea881cdb82735bbe", "sha256": "331470215b3f06b14b5725282729463d82db74ca463d821bbeddb151da3a14ad" }, "downloads": -1, "filename": "raspyrfm_client-1.2.0.zip", "has_sig": false, "md5_digest": "a811bb4bedcb35e8ea881cdb82735bbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50081, "upload_time": "2017-05-20T04:30:34", "url": "https://files.pythonhosted.org/packages/55/37/2bdb1ff306ab2318c0d4a2952f1e8403c124250e1c48d1f3b5327eb5d882/raspyrfm_client-1.2.0.zip" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "f4ae52e1601e00aca2caaa10d4ccd35b", "sha256": "9c5766f99666f7d9382dd7a1b3db9f04dd2e7d699486d38fac64862ad8823f63" }, "downloads": -1, "filename": "raspyrfm_client-1.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "f4ae52e1601e00aca2caaa10d4ccd35b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 44686, "upload_time": "2017-06-09T17:17:55", "url": "https://files.pythonhosted.org/packages/8b/fd/4fa9085730238cad8740ec530101fa4f450a48d9d94d6e5151d56463f633/raspyrfm_client-1.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ebaf5c1dab9fc14e5289428b91fc9f7d", "sha256": "e40aacfaeca27ca4ad2341aaa99717495598de52d3433d933a02f859a786e51a" }, "downloads": -1, "filename": "raspyrfm_client-1.2.1.tar.gz", "has_sig": false, "md5_digest": "ebaf5c1dab9fc14e5289428b91fc9f7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17060, "upload_time": "2017-06-09T17:17:56", "url": "https://files.pythonhosted.org/packages/7f/af/a60eedf2528407043491a18b9260b5a7234625d5822cc2c162a31fa2b662/raspyrfm_client-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "7ba5b08057a329275bf13fb8a62904c0", "sha256": "707b434cb3f6356d1170e2fa1e0dbf96ca720d5baa98cc992e621358a6dc7bcc" }, "downloads": -1, "filename": "raspyrfm_client-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7ba5b08057a329275bf13fb8a62904c0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72705, "upload_time": "2017-11-27T21:05:24", "url": "https://files.pythonhosted.org/packages/39/6e/7b8fb6caf93268434722fdb0215fbca517c6f493aadd86ff065a5baa93d3/raspyrfm_client-1.2.2-py3-none-any.whl" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "2ea5d74b5d692da8382cee054b4ebad6", "sha256": "6027abb0d53b1a42792005771e4af9baa3082c35eacbbc7eadd8ad1d659fba5f" }, "downloads": -1, "filename": "raspyrfm_client-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2ea5d74b5d692da8382cee054b4ebad6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74282, "upload_time": "2018-02-12T19:13:11", "url": "https://files.pythonhosted.org/packages/2b/b2/27979cd7f7905c1d81cb8d82ad954dcfc110c63a8fc35749ded920b185d5/raspyrfm_client-1.2.3-py3-none-any.whl" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "0436fbaf0a5703f1cd58797c7c55fe7f", "sha256": "06bef7842578ec2bc7e540fa3176019888c04d5aed1aa9091ffb95940c620ce4" }, "downloads": -1, "filename": "raspyrfm_client-1.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0436fbaf0a5703f1cd58797c7c55fe7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 81817, "upload_time": "2018-07-13T17:04:48", "url": "https://files.pythonhosted.org/packages/7d/73/b37a576088e937eadb1126567ff884afc9e5f9cc9cf55aaa446919a72144/raspyrfm_client-1.2.4-py3-none-any.whl" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "96da9e19fde346f02856816120ac580a", "sha256": "6badd7f9c30f83a436f60f62e2f3318542b25a0ea3bc797f2d3505fc967ab5de" }, "downloads": -1, "filename": "raspyrfm_client-1.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "96da9e19fde346f02856816120ac580a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 81821, "upload_time": "2018-07-13T17:11:36", "url": "https://files.pythonhosted.org/packages/9c/3a/1a9f81e9d6aa4efbe10f94621437a6739c57767cc2495bdd602bf4be57c4/raspyrfm_client-1.2.5-py3-none-any.whl" } ], "1.2.6": [ { "comment_text": "", "digests": { "md5": "f4f6bfc07198522170f032db6b4d9c1e", "sha256": "6b9ec82286582c3d3281ea51cced78e21e3555cf42b08bc737d4572bf43feccd" }, "downloads": -1, "filename": "raspyrfm_client-1.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "f4f6bfc07198522170f032db6b4d9c1e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 81562, "upload_time": "2018-07-13T17:15:34", "url": "https://files.pythonhosted.org/packages/54/58/78630e67b24ebdfd6818bc8a241b8f5ee893b2b27b9d0934eead8fef4774/raspyrfm_client-1.2.6-py3-none-any.whl" } ], "1.2.7": [ { "comment_text": "", "digests": { "md5": "d5aaf6c93f4d4f7c0cb23a0b3ea10f15", "sha256": "c38130ac68f6aa3e021a673ccc8dc8c2964ce6a66eb287d9000fcd7bc46d4c6c" }, "downloads": -1, "filename": "raspyrfm_client-1.2.7-py3-none-any.whl", "has_sig": false, "md5_digest": "d5aaf6c93f4d4f7c0cb23a0b3ea10f15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 76846, "upload_time": "2018-07-13T17:28:19", "url": "https://files.pythonhosted.org/packages/48/28/d7e3b526d7e6ac46289441a502e7e10e27acef350f1ee2e3e3af0cdd6931/raspyrfm_client-1.2.7-py3-none-any.whl" } ], "1.2.8": [ { "comment_text": "", "digests": { "md5": "0daefa7be61bd853f778aa939b80cf76", "sha256": "6ffd91dd238302d99e8f81996d0cdf31c8fd9c04e679de6d8687928420185328" }, "downloads": -1, "filename": "raspyrfm_client-1.2.8-py3-none-any.whl", "has_sig": false, "md5_digest": "0daefa7be61bd853f778aa939b80cf76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 49081, "upload_time": "2018-09-19T00:46:52", "url": "https://files.pythonhosted.org/packages/f3/8f/ddb10242f87909af240e9f5c1d634366816928572a59d386a7bef42ce683/raspyrfm_client-1.2.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ef6b78c1135b02cf6468b87f26dfa56", "sha256": "0e8bec23543d8413abc55b0823a0999113bf1ad20d6535f247de6539e5987c0d" }, "downloads": -1, "filename": "raspyrfm_client-1.2.8.win-amd64.zip", "has_sig": false, "md5_digest": "8ef6b78c1135b02cf6468b87f26dfa56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130978, "upload_time": "2018-09-19T00:46:54", "url": "https://files.pythonhosted.org/packages/7c/e8/b895a21da6a3f2a036a9f4e2b864d7b29c6ea988d8c77bd3f4725af9238c/raspyrfm_client-1.2.8.win-amd64.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0daefa7be61bd853f778aa939b80cf76", "sha256": "6ffd91dd238302d99e8f81996d0cdf31c8fd9c04e679de6d8687928420185328" }, "downloads": -1, "filename": "raspyrfm_client-1.2.8-py3-none-any.whl", "has_sig": false, "md5_digest": "0daefa7be61bd853f778aa939b80cf76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 49081, "upload_time": "2018-09-19T00:46:52", "url": "https://files.pythonhosted.org/packages/f3/8f/ddb10242f87909af240e9f5c1d634366816928572a59d386a7bef42ce683/raspyrfm_client-1.2.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ef6b78c1135b02cf6468b87f26dfa56", "sha256": "0e8bec23543d8413abc55b0823a0999113bf1ad20d6535f247de6539e5987c0d" }, "downloads": -1, "filename": "raspyrfm_client-1.2.8.win-amd64.zip", "has_sig": false, "md5_digest": "8ef6b78c1135b02cf6468b87f26dfa56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130978, "upload_time": "2018-09-19T00:46:54", "url": "https://files.pythonhosted.org/packages/7c/e8/b895a21da6a3f2a036a9f4e2b864d7b29c6ea988d8c77bd3f4725af9238c/raspyrfm_client-1.2.8.win-amd64.zip" } ] }