{ "info": { "author": "Michael Hrivnak", "author_email": "mhrivnak@hrivnak.org", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Home Automation", "Topic :: Software Development :: Libraries" ], "description": "Introduction\n============\n\nThis is a library for communicating with a wifi-enabled home thermostat made by\n`Radio Thermostat Company of America `_. At the\ntime of writing, this includes the CT30, CT80, and the `Filtrete 3M50\n`_, which is made by\nRadio Thermostat but rebranded and sold at Home Depot in the US.\n\nRadio Thermostat Company of America was not involved in the creation of this\nsoftware and has not sanctioned or endorsed it in any way.\n\nLicense\n=======\n\nThis software is available under a BSD-style license. Please see LICENSE.txt.\n\nAuthor\n======\nMichael Hrivnak is a professional software engineer who\nis passionate about open source software and reducing energy consumption.\n\nFeatures\n========\n\n- *Auto-Discovery* Your thermostat can be automatically detected, so there is\n no need to enter an IP address or domain name.\n- *Comprehensive* Nearly every documented feature that works is implemented in\n this library.\n- *Python 3 Support* This works in all Python versions from 2.6 up.\n- *Tested* There is good test coverage using true unit tests.\n\nUsage\n=====\n\nGetting Started\n---------------\n\nImport the library, and away we go.\n\n >>> import radiotherm\n >>> tstat = radiotherm.get_thermostat('192.168.0.2')\n >>> tstat.temp\n {'raw': 72.5}\n\nIf you have only one thermostat on your network, you can do auto-discovery by\nomitting the address.\n\n >>> tstat = radiotherm.get_thermostat()\n\nHuman-Readable Values\n---------------------\n\nThe value from the thermostat is always returned under the key 'raw'. For\nfields that support human-readable values, there will be a key 'human'.\n\n >>> tstat.tmode\n {'raw': 2, 'human': 'Cool'}\n\nAPI\n===\n\nThe library centers around the Thermostat class, whose attributes are closely\nrelated to the attributes defined in Radio Thermostat's API doccumentation. For\nexample, /tstat/temp in this case maps to the \"temp\" attribute on your\nThermostat instance.\n\nDevice Versions\n---------------\n\nSupported models:\n\n- CT30 v1.75\n- CT30 v1.92\n- CT30 v1.94\n- CT30 v1.99\n- CT50 V1.09\n- CT50 V1.88\n- CT50 V1.92\n- CT50 V1.94\n- CT80 Rev B1 V1.00\n- CT80 Rev B2 V1.00\n- CT80 Rev B2 V1.03\n- CT80 Rev B2 V1.09\n\nSince I only have access to the 3M50 (which reports its model as \"CT50 V1.94\"),\nthat is the model that most development has occured with. Do you have another\nmodel? Let me know, and let's collaborate to get it supported!\n\nNew models that are derivatives of the CT30 or CT80 should be detected\nautomatically and basic functionality should work. If you find this is not the\ncase, it can be supported easily by subclassing either the CT30 or CT80\nclasses, depending on the thermostat model. Most of the API should work on all\ndevices, but there are apparently some differences that will need to be\naccounted for. Long-term, I expect for those common features to be implemented\non CommonThermostat, while device-specific deviations will be implemented on\nsubclasses, such as the CT50v194 class.\n\nSupported Features\n------------------\n\nMany of the features documented in the manufacturer's API reference do not seem\nto work. For example, /tstat/save_energy seems to be broken. This library\nshould not implement those broken features.\n\nAlso, there are some features, like humidity control, that are only available\non specific devices.\n\nIsn't there already a python library?\n=====================================\n\nYes! Many thanks to Paul Jenning for creating `Python-TStat\n`_. The existance of his library was\na substantial motivation for me to buy this device.\n\nWhy create a new library?\n-------------------------\n\nI quickly identified some areas of Python-TStat that I wanted to improve. That\nled me to realize that there were conceptual differences between that library\nand my idea of what I wanted to use in my own projects.\n\n- *Thin wrapper*. I want API libraries to be thin. Python-TStat does automatic\n result caching by default, which I personally don't want.\n- *PEP-8*. I think it's important, and it would have taken a lot of work to\n make Python-TStat compliant.\n- *Testing*. It's important to me that code be tested, and Python-TStat had no\n tests. Proper unit-testing is much easier to do when the code was written\n from the beginning with it in mind, so that made it more convenient to start\n over.\n- *Simplicity*. My approach to defining the API in python is inspired by\n Django's model API, and I think it's resulted in easy-to-use and easy-to-read\n code.\n- *Less Code*. I've implemented a feature set very similar to that of\n Python-TStat (minus caching). Not counting comments, doc blocks or blank\n lines, this library (at the time of initial release) has 201 lines of code,\n whereas Python-TStat has 349.\n- *Python 3 Support*. This is also important to me. This library supports all\n python versions from 2.6 up.\n\nAll of that said, Python-TStat is a good library that works well. I just\ndecided that the quickest way for me to achieve the above goals was to start\nfrom scratch, which was relatively painless since the device's API isn't very\ncomplicated or large.\n\nRelease Notes\n=============\n\n2.0.0\n-----\n\n- Add support for the LED API (David Rasch)\n- Allow unknown thermostats to work properly instead of failing (@JerryWorkman,\n @craftyguy)\n- Handle transient thermostat errors (@tubaman)\n\n1.4.1\n-----\n\nMinor update to bump version in setup.py\n\n1.4\n---\n\nSeveral new models were added with thanks to the corresponding contributors!\n\nCT80 Rev B1 V1.00 - Eamon Doyle\nCT80 Rev B2 V1.00 - Clayton Craft\n\nAdditional changes:\n- Add 'model' parameter to `get_thermostat()` - skimj\n- Add program_mode for CT80 - skimj\n\n1.3\n---\n\nSeveral models were added with thanks to the corresponding contributors!\n\nCT30 v1.75 - Albert Lee\nCT30 V1.94 - billy1\nCT30 v1.99 - Adam Fazzari\nCT50 V1.92 - mdingman\nCT80 Rev B2 V1.09 - Steve Bauer\n\nThanks also to Albert Lee for adding remote temperature support, energy LED\nsupport, plus support for the \"lock_mode\" and \"simple_mode\".\n\n1.2\n---\n\nThanks to a contribution from Nick Pegg, the CT80 Rev B2 V1.03 is now supported.\n\nSupport for `Travis CI `_ was added, so all pushes to\nthe GitHub repository are automatically tested with multiple python versions.\n\n1.1\n---\n\nThanks to community contributions, this library now supports the CT50 V1.09 and\nCT50 V1.88. No changes were made except to certify that all functionality works\nwith these models, and add a new subclass for each.\n\n1.0\n---\n\nInitial release! This supports only the CT50 V1.94", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mhrivnak/radiotherm", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "radiotherm", "package_url": "https://pypi.org/project/radiotherm/", "platform": "", "project_url": "https://pypi.org/project/radiotherm/", "project_urls": { "Homepage": "https://github.com/mhrivnak/radiotherm" }, "release_url": "https://pypi.org/project/radiotherm/2.0.0/", "requires_dist": null, "requires_python": "", "summary": "client library for wifi thermostats sold by radiothermostat.com", "version": "2.0.0" }, "last_serial": 4573262, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "a4a6be09dad4eb05801f8119d7b81499", "sha256": "165f49f8a10a7b4fe6f4a632924f60153574af0c0b88a068615340fa55ddde6a" }, "downloads": -1, "filename": "radiotherm-1.0.tar.gz", "has_sig": false, "md5_digest": "a4a6be09dad4eb05801f8119d7b81499", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7478, "upload_time": "2012-11-17T18:30:45", "url": "https://files.pythonhosted.org/packages/c8/55/2726b990d134c4f9b4aa462223711c6ae4195e57d6ebd6ec11289662c77e/radiotherm-1.0.tar.gz" }, { "comment_text": "", "digests": { "md5": "143d03da7e005f417ccfac7bf52c4a26", "sha256": "e8a70e0cf38f21170a3a43d5de62954aa38032dfff20adcdf79dd6c39734b8cc" }, "downloads": -1, "filename": "radiotherm-1.2.tar.gz", "has_sig": false, "md5_digest": "143d03da7e005f417ccfac7bf52c4a26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8533, "upload_time": "2013-11-25T03:01:28", "url": "https://files.pythonhosted.org/packages/f3/72/22d9f179d4f4cc387196cac1adbab495215ec33420175d412ad3d69a59bb/radiotherm-1.2.tar.gz" } ], "1.1": [], "1.2": [], "1.3": [ { "comment_text": "", "digests": { "md5": "e7b9f050045ccfc87d6d8e0794e9498b", "sha256": "67b94a0aedab81d75afaa7db8297bb95591cd3248f58c2b47ad97d8ed46d5581" }, "downloads": -1, "filename": "radiotherm-1.3.tar.gz", "has_sig": false, "md5_digest": "e7b9f050045ccfc87d6d8e0794e9498b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9146, "upload_time": "2017-06-17T03:15:16", "url": "https://files.pythonhosted.org/packages/f9/60/fec10ecd630fad80190b4e87fec7cb528ec8502201e2fe247cc63b8d28d4/radiotherm-1.3.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "a85cc3831050d94acb1126925a196868", "sha256": "644f012d197ff0f3f0e5bf040e0006df3d4f5312f119aa437175b50109eb344b" }, "downloads": -1, "filename": "radiotherm-1.4.1.tar.gz", "has_sig": false, "md5_digest": "a85cc3831050d94acb1126925a196868", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9449, "upload_time": "2018-08-09T02:18:55", "url": "https://files.pythonhosted.org/packages/99/1d/46b85601f76b1dfc03ef04cedf2a3f3328f5c5dca5ab1ff6b589b4b2ec97/radiotherm-1.4.1.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "9f1b91045d4861c5aedc707bc3e8df9f", "sha256": "3abc32f848960c41c786c09a43d6d97e13632549372838516db6b59e1e1bd85d" }, "downloads": -1, "filename": "radiotherm-2.0.0.tar.gz", "has_sig": false, "md5_digest": "9f1b91045d4861c5aedc707bc3e8df9f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10061, "upload_time": "2018-12-07T20:39:53", "url": "https://files.pythonhosted.org/packages/ef/43/9ecf3320c3b30d2b42aaa94b68fdfce841ff2e8c865d95e8dda5999bfad2/radiotherm-2.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9f1b91045d4861c5aedc707bc3e8df9f", "sha256": "3abc32f848960c41c786c09a43d6d97e13632549372838516db6b59e1e1bd85d" }, "downloads": -1, "filename": "radiotherm-2.0.0.tar.gz", "has_sig": false, "md5_digest": "9f1b91045d4861c5aedc707bc3e8df9f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10061, "upload_time": "2018-12-07T20:39:53", "url": "https://files.pythonhosted.org/packages/ef/43/9ecf3320c3b30d2b42aaa94b68fdfce841ff2e8c865d95e8dda5999bfad2/radiotherm-2.0.0.tar.gz" } ] }