{ "info": { "author": "Paul G\u00f6rgen", "author_email": "pypi@pgoergen.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Programming Language :: Python :: 3.4" ], "description": "pyduofern\n=========\n.. image:: https://travis-ci.org/gluap/pyduofern.svg?branch=master\n :target: https://travis-ci.org/gluap/pyduofern\n.. image:: https://coveralls.io/repos/github/gluap/pyduofern/badge.svg?branch=master\n :target: https://coveralls.io/github/gluap/pyduofern?branch=master\n\n**Disclaimer:** this library is **not** endorsed by the company Rademacher, the manufacturer of home automation products\nunder the label duofern. The name pyduofern was chosen to indicate the function of the library: communicating with\nduofern devices via python.\n\nThese are my efforts in porting the `FHEM `_\n`Duofern USB-Stick `_ based module to\n`Homeassistant `_. As of now the port is rather ugly, but it is usable enough to control\nmy Duofern blinds. I did not port the Weather-Station related features of the original module -- Mainly because I\ndo not own the corresponding hardware and have no means to test if it works. I only tested it with the model\n*RolloTron Standard DuoFern 14233011 Funk-Gurtwickler Aufputz*.\n\nThis requires the Duofern USB Stick Art.-Nr.: 70000093 by Rademacher.\n\nI do not provide any guarantees for the usability of this software. Use at your own risk.\n\nLicense::\n\n python interface for dufoern usb stick\n Copyright (C) 2017 Paul G\u00f6rgen\n Rough python python translation of the FHEM duofern modules by telekatz\n (also licensed under GPLv2)\n This re-write does not literally contain contain any verbatim lines\n of the original code (given it was translated to another language)\n apart from some comments to facilitate translation of the not-yet\n translated parts of the original software. Modification dates are\n documented as submits to the git repository of this code, currently\n maintained at `https://github.com/gluap/pyduofern.git `_\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 2 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, write to the Free Software Foundation,\n Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\nGetting Started\n===============\n\nInstall via::\n\n pip3 install pyduofern\n\nor if you want the development version from github::\n\n pip3 install git+https://github.com/gluap/pyduofern.git@dev\n\nudev configuration\n==================\nto make your usb stick easy to identify deploy an `udev rules `_ file in\n``/etc/udev/rules.d/98-duofern.rules`` or the equivalent of your distribution. The following worked for my\nstick::\n\n SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", SYMLINK+=\"duofernstick\"\n\nOr, if you use several USB-Serial adapters with vendor ``0403`` and product ``6001`` find out the serial number of your\nstick (assuming it is currently registered as ``/dev/ttyUSB0```)::\n\n user@host:~ > udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1\n ATTRS{serial}==\"WR04ZFP4\"\n\nAs you can se for me the serial is ``WR04ZFP4``. Use the following udev line (use the serial you found above)::\n\n SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", ATTRS{serial}==\"WR04ZFP4\", SYMLINK+=\"duofernstick\"\n\nOnce the rule is deployed your stick should show up as ``/dev/duofernstick`` as soon as you plug it in. This\nhelps avoid confusion if you use other usb-serial devices. Also be warned: The line also makes the stick\naccessible to non-root users. But likely on your system you will be the only user anyhow.\n\nGetting Started\n===============\nTo start using your stick you can use the ``duofern_cli.py`` script which should have been installed together\nwith the pyduofern module. Begin by choosing a 4 hex-digit system code. Ideally write it down, if you forget\nit, you will likely have to chose a new system code and reset your devices in order to be able to pair them again.\nIt is also a security feature which is why no default is provided.\n\nDecide for a system configuration file. By default it will reside as a hidden config file in your home directory in\n``~/.duofern.json``. Pass the config file to ``duofern_cli.py`` via the command line option ``--configfile``.\nThe default has the advantage that you do not always have to pass the config file when using the script. Initialize\nthe config file with your system code with the following command::\n\n duofern_cli.py --code \n # or if you prefer your own configfile location\n doufern_cli.py --code --configfile \n\nNow RTFM of the shutter to find out how to start pairing. Set the maximum and minimum positions according to the manual.\nIf you want to experiment with the shutter first, chose the two positions very near each other. The motors shut down\nafter a certain maximum runtime and you could exceed that while experimenting if you move the shutters up and down\nseveral times unless the min and max positions are close to each other.\n\nStart out by pairing your first rollershutter::\n\n duofern_cli.py --pair --pairtime 60\n\nnow initiate pairing via the buttons on your shutter. Once a shutter is paired it should show up in your\nconfig file and you can name it. Say the blind that popped up has the ID ``408ea2``, run the following to give it\nthe name ``kitchen``::\n\n duofern_cli.py --set_name 408ea2 kitchen\n # you can now try to also have it move up or down:\n duofern_cli.py --up kitchen\n # or try to set the position of a blind (0=down, 100=up)\n duofern_cli.py --position 42 kitchen\n\nHopefully you now have working command line interface that knows how to move up or down your shutters. But the python\ninterface can do more, (which I was so far too lazy to expose via the command line):\n\nIndexing paired blinds\n----------------------\nIf you have the system code of your system but lost the list of configured blinds you can use the CLI to refresh\nthe config file with all paired blinds.::\n\n # assuming you lost the config file\n duofern_cli.py --code --refresh --refreshtime 60\n\nwill start up the stick and listen for connecting blinds for 60 seconds. It will store all the blinds that were found\nin the default config file.a\n\nUsage with Homeassistant\n========================\nFind an example code for using these blinds with homeassistant in the examples folder\n\n\nUsage from python\n=================\n.. code-block:: python\n\n from pyduofern.duofern_stick import DuofernStick\n import time\n stick = DuofernStick(device=\"/dev/duofernstick\") # by default looks for /dev/duofernstick\n stick_initialize() # do some initialization sequence with the stick\n stick.start() # start the stick in a thread so it keeps communicating with your blinds\n time.sleep(10) # let it settle to be able to talk to your blinds.\n # your code here\n # this uses internal variables of the duofern parser module and likely I will wrap it in\n # the future.\n\n print(stick.duofern_parser.modules['by_code']['1ff1d3']['position'])\n\n command(\"1ff1d3\", \"up\") # open the blind with code 1ff1d3\n\n stick.command(\"1ff1d3\", \"down\") # down the blind with code 1ff1d3\n\n stick.command(\"1ff1d3\", \"stop\") # stop the blind with code 1ff1d3\n\n stick.command(\"1ff1d3\", \"position\", 30) # set position of the blind with code 1ff1d3 to 30%\n\nLook for an indication of possible commands in ``pyduofern/definitions.py``\nI just translated them into python and did not explore what might be possible.\nIt looks like a lot of functionality requires a weather station, but you can just as\neasily automate the stuff using your home automation and having it send the up and down\ncommands instead of buying a weather station.\n\nChangelog\n=========\n**0.25.2**\n- try to fix https://github.com/gluap/pyduofern/issues/2\n\n**0.25.1**\n- changed custom component to fix bug in switch implementation accidentally introduced\n recently.\n\n**0.25**\n- restarted from 0.23 to get somewhat working auto detection\n\n**0.24**\n- somewhat broken changes for auto detection\n\n**0.23.5**\n- python 3.7 support should enable current hassio version\n\n**0.23.3**\n- added ``--position`` to CLI\n\n**0.23.2**\n- renamed README.rst and moved version number from `setup.py` to `__init__.py`\n\n**0.23.1**\n- fixed references to repository url\n- upped version for pypi release\n\n**0.23**\n- added recordings and increased coverage of unit tests (no result-based tests yet though -- just checking if every replay runs until the end without hanging)\n\n**0.22**\n- Added recording of actions for replay in integration tests\n- Improved unit tests\n- Enable travis\n- Enable coveralls\n\n**0.21.1**\n- fixed bug where device IDs containing `cc` would be be messed up when inserting channel number.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/gluap/pyduofern", "keywords": "", "license": "GPL-2.0", "maintainer": "", "maintainer_email": "", "name": "pyduofern", "package_url": "https://pypi.org/project/pyduofern/", "platform": "", "project_url": "https://pypi.org/project/pyduofern/", "project_urls": { "Homepage": "https://github.com/gluap/pyduofern" }, "release_url": "https://pypi.org/project/pyduofern/0.25.2/", "requires_dist": [ "pyserial", "pyserial-asyncio" ], "requires_python": "", "summary": "Library for controlling Rademacher DuoFern actors using python. Requires the RademacherDuofern USB Stick Art.-Nr.: 70000093", "version": "0.25.2" }, "last_serial": 5229667, "releases": { "0.23.2": [ { "comment_text": "", "digests": { "md5": "bd238a39acaaffadd1d83e05da615092", "sha256": "a58dbd72284b2e3ba279b424ae0d7663ec17045f3d2834deac61dd25c73c4080" }, "downloads": -1, "filename": "pyduofern-0.23.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bd238a39acaaffadd1d83e05da615092", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28543, "upload_time": "2018-06-08T21:57:42", "url": "https://files.pythonhosted.org/packages/91/ee/6beec94161ba844fb023b1ca9f8e234d173bb8a77397d356b5a5b64be9a6/pyduofern-0.23.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5cb12a32389ec110e62154fb15df4804", "sha256": "bc84c8a33c08b8959c9039dd1029dd8539942408e846cb64791f956b643edd09" }, "downloads": -1, "filename": "pyduofern-0.23.2.tar.gz", "has_sig": false, "md5_digest": "5cb12a32389ec110e62154fb15df4804", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34196, "upload_time": "2018-06-08T21:57:43", "url": "https://files.pythonhosted.org/packages/2c/4c/2eda3a64965074efb0826b9b330c9bbf050adff5bfc30a86335b35e2c331/pyduofern-0.23.2.tar.gz" } ], "0.23.4": [ { "comment_text": "", "digests": { "md5": "dcdfae3aa9160d37c96e4dc884c24e25", "sha256": "a720cea457603131883086a7bca312c0f161d7a1826b7b0b5f08c6695d6fb2fa" }, "downloads": -1, "filename": "pyduofern-0.23.4-py3-none-any.whl", "has_sig": false, "md5_digest": "dcdfae3aa9160d37c96e4dc884c24e25", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28821, "upload_time": "2018-09-28T20:22:17", "url": "https://files.pythonhosted.org/packages/eb/4d/a55327b85bc6e56b1521b3a1f02bdff9d5690e357da238d8732dd06ab5d6/pyduofern-0.23.4-py3-none-any.whl" } ], "0.23.5": [ { "comment_text": "", "digests": { "md5": "459ada20d4b9e1b5c26ac08a9ab6fea7", "sha256": "56a6b83cfc2ed04d6f1d9906487e35865c7d838fe7efcbd751e4b69f3b1ff21e" }, "downloads": -1, "filename": "pyduofern-0.23.5-py3-none-any.whl", "has_sig": false, "md5_digest": "459ada20d4b9e1b5c26ac08a9ab6fea7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28848, "upload_time": "2019-02-25T20:53:11", "url": "https://files.pythonhosted.org/packages/5a/c4/f9ec5215ae0c20bdda2d3234e9b5fadae9a4e26a9d82817fd3a259d77d3f/pyduofern-0.23.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef69ad9a55d6cda225f92e741f658b05", "sha256": "395e34ee3ba286d4a5ccc402cdce1690431de2e81219b36925faa8c3773e1a80" }, "downloads": -1, "filename": "pyduofern-0.23.5.tar.gz", "has_sig": false, "md5_digest": "ef69ad9a55d6cda225f92e741f658b05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40060, "upload_time": "2019-02-25T20:53:13", "url": "https://files.pythonhosted.org/packages/b5/c1/fffc01e523344305b575f6a790ece1194594770172e18eb28dd9858293b1/pyduofern-0.23.5.tar.gz" } ], "0.24": [ { "comment_text": "", "digests": { "md5": "6a8a38eccab7c58583b39710a74c72ca", "sha256": "a5f8292e713df841bd7ef3e68c54bef3822e1c43f146b6e6697ea38739416050" }, "downloads": -1, "filename": "pyduofern-0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "6a8a38eccab7c58583b39710a74c72ca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28917, "upload_time": "2019-02-28T22:51:19", "url": "https://files.pythonhosted.org/packages/6f/8b/9e175a435916b769d7de7277becb6af87950daa331e0720ea2cad37058be/pyduofern-0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "291abb2cd2a5e9cab728f0cf3b978e14", "sha256": "0c4d79487651a53248a3cc64840968d2ce1f3a90e88c421505c062e804e48ff6" }, "downloads": -1, "filename": "pyduofern-0.24.tar.gz", "has_sig": false, "md5_digest": "291abb2cd2a5e9cab728f0cf3b978e14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41895, "upload_time": "2019-02-28T22:51:21", "url": "https://files.pythonhosted.org/packages/76/e1/2c02691043ec5b0e7e2cba5f4245ce065e9f2458b8dd0c7849ff6f5798c9/pyduofern-0.24.tar.gz" } ], "0.25": [ { "comment_text": "", "digests": { "md5": "2e252d8e1bf23561e0a2ff72581acfb6", "sha256": "a14e5decafda6b61aff8b758e4be187f8305ff37257bfe786d23c0a93154f3d9" }, "downloads": -1, "filename": "pyduofern-0.25-py3-none-any.whl", "has_sig": false, "md5_digest": "2e252d8e1bf23561e0a2ff72581acfb6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28949, "upload_time": "2019-03-09T20:53:13", "url": "https://files.pythonhosted.org/packages/1e/83/5e9911cfe78d65a5e32cc3c20e72f4469daf0ca997da7ceb0a7f03aa7bae/pyduofern-0.25-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4fcd69303ceb64582298ca2f753e146", "sha256": "53658b20ec35f0c8ee4e3b35644f33e68508d950a11957ef7c3e54a0c1eb2098" }, "downloads": -1, "filename": "pyduofern-0.25.tar.gz", "has_sig": false, "md5_digest": "d4fcd69303ceb64582298ca2f753e146", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41554, "upload_time": "2019-03-09T20:53:15", "url": "https://files.pythonhosted.org/packages/d1/08/c9e86ffe6c4779f71a07d18346f6fac273845e363788306c91f536e4cf52/pyduofern-0.25.tar.gz" } ], "0.25.2": [ { "comment_text": "", "digests": { "md5": "bd4adb08db1275008b9eb385760a3042", "sha256": "c79887af39ba7f06d533532e8a592dec6a57102fb9e4fb31b3991bc802c04104" }, "downloads": -1, "filename": "pyduofern-0.25.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bd4adb08db1275008b9eb385760a3042", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29060, "upload_time": "2019-05-05T21:08:53", "url": "https://files.pythonhosted.org/packages/1c/9b/fb084e4136e72e9397226e963d447356859d9c3e10d734bab72ae0a4b86d/pyduofern-0.25.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2c757a119d8bb643a7fff391a46cd41", "sha256": "4d76df2b885234ac4ed38fa1070dd3ac9f42ef722a018ff889a937a927e2c07e" }, "downloads": -1, "filename": "pyduofern-0.25.2.tar.gz", "has_sig": false, "md5_digest": "b2c757a119d8bb643a7fff391a46cd41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41987, "upload_time": "2019-05-05T21:08:54", "url": "https://files.pythonhosted.org/packages/2a/39/87ba31ac2598723ea6ff7edbcc88996886584a44db96a18ae2cbd156f972/pyduofern-0.25.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bd4adb08db1275008b9eb385760a3042", "sha256": "c79887af39ba7f06d533532e8a592dec6a57102fb9e4fb31b3991bc802c04104" }, "downloads": -1, "filename": "pyduofern-0.25.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bd4adb08db1275008b9eb385760a3042", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29060, "upload_time": "2019-05-05T21:08:53", "url": "https://files.pythonhosted.org/packages/1c/9b/fb084e4136e72e9397226e963d447356859d9c3e10d734bab72ae0a4b86d/pyduofern-0.25.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2c757a119d8bb643a7fff391a46cd41", "sha256": "4d76df2b885234ac4ed38fa1070dd3ac9f42ef722a018ff889a937a927e2c07e" }, "downloads": -1, "filename": "pyduofern-0.25.2.tar.gz", "has_sig": false, "md5_digest": "b2c757a119d8bb643a7fff391a46cd41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41987, "upload_time": "2019-05-05T21:08:54", "url": "https://files.pythonhosted.org/packages/2a/39/87ba31ac2598723ea6ff7edbcc88996886584a44db96a18ae2cbd156f972/pyduofern-0.25.2.tar.gz" } ] }