From 14a283f6ee3a98260c06b2a4d667504d0579fcff Mon Sep 17 00:00:00 2001 From: Devmel Apps Date: Mon, 17 May 2021 14:23:10 +0200 Subject: [PATCH] first commit --- .gitignore | 10 + LICENSE | 674 ++++++++++++++++++++++++ README.md | 40 ++ configuration.example.yaml | 21 + custom_components/airsend/__init__.py | 18 + custom_components/airsend/cover.py | 102 ++++ custom_components/airsend/manifest.json | 11 + custom_components/airsend/switch.py | 98 ++++ hacs.json | 5 + icons/icon.png | Bin 0 -> 28025 bytes img/screenshot.png | Bin 0 -> 23480 bytes secrets.example.yaml | 6 + 12 files changed, 985 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 configuration.example.yaml create mode 100644 custom_components/airsend/__init__.py create mode 100644 custom_components/airsend/cover.py create mode 100644 custom_components/airsend/manifest.json create mode 100644 custom_components/airsend/switch.py create mode 100644 hacs.json create mode 100644 icons/icon.png create mode 100644 img/screenshot.png create mode 100644 secrets.example.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23d241c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +nbproject/ +plugins +sftp-config.json +.project +.DS_Store +Thumbs.db +*.pyc +docs/_site/ +docs/Gemfile.lock +docs/.sass-cache/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..af0199f --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +[![License][license-shield]](LICENSE) + +[![hacs][hacsbadge]](hacs) + +App icon + +# AirSend Home Assistant + +Component for sending radio commands (433-434Mhz) through the AirSend device. + +## Installation + +1. To use this plugin, copy the `airsend` folder into your [custom_components folder](https://developers.home-assistant.io/docs/creating_integration_file_structure/#where-home-assistant-looks-for-integrations). +2. Add `airsend:` to your HA configuration (see configuration.example.yaml). + +## Configuration + +### YAML + +To integrate `airsend` into Home Assistant, go to `airsend.cloud -> import/export -> Export YAML` and add the contents of the downloaded file into your HA configuration `configuration.yaml`. + +Simple example: + +```yaml +# Example configuration.yaml entry +airsend: + devices: + light: + id: 9000 + type: 4098 + apiKey: !secret asKey + prise somfy: + id: 9010 + type: 4097 + apiKey: !secret asKey +``` + +## Preview + + diff --git a/configuration.example.yaml b/configuration.example.yaml new file mode 100644 index 0000000..4f7b558 --- /dev/null +++ b/configuration.example.yaml @@ -0,0 +1,21 @@ + +# Configure a default setup of Home Assistant (frontend, api, etc) +default_config: + +airsend: + devices: + lumière: + id: 9000 + type: 4098 + apiKey: !secret asKey + prise somfy: + id: 9010 + type: 4097 + apiKey: !secret asKey + + +group: !include groups.yaml +automation: !include automations.yaml +script: !include scripts.yaml +scene: !include scenes.yaml + diff --git a/custom_components/airsend/__init__.py b/custom_components/airsend/__init__.py new file mode 100644 index 0000000..749d85f --- /dev/null +++ b/custom_components/airsend/__init__.py @@ -0,0 +1,18 @@ +"""The AirSend component.""" +from homeassistant.core import HomeAssistant +from homeassistant.helpers.typing import ConfigType +from homeassistant.helpers import discovery +from homeassistant.const import ( + CONF_DEVICES, +) + +DOMAIN = "airsend" +AS_TYPE = ['switch', 'cover'] + +async def async_setup(hass : HomeAssistant, config : ConfigType): + """Set up the AirSend component.""" + if DOMAIN not in config: + return True + for plateform in AS_TYPE: + discovery.load_platform(hass, plateform, DOMAIN, config[DOMAIN][CONF_DEVICES].copy(), config) + return True diff --git a/custom_components/airsend/cover.py b/custom_components/airsend/cover.py new file mode 100644 index 0000000..a7e7770 --- /dev/null +++ b/custom_components/airsend/cover.py @@ -0,0 +1,102 @@ +"""AirSend switches.""" +import logging +from typing import Any +from requests import get +from homeassistant.core import HomeAssistant +from homeassistant.helpers.typing import ConfigType +from homeassistant.helpers.entity import async_generate_entity_id +from homeassistant.components.cover import ( + CoverEntity, +) +from . import ( + DOMAIN, +) + +_LOGGER = logging.getLogger(DOMAIN) + +async def async_setup_platform(hass : HomeAssistant, config : ConfigType, async_add_entities, discovery_info=None): + if discovery_info is None: + return + for name, options in discovery_info.items(): + if options['type'] == 4098: + entity = AirSendCover(hass, name, options['id'], options['type'], options['apiKey']) + async_add_entities([entity]) + return + + +class AirSendCover(CoverEntity): + """Representation of an AirSend Cover.""" + + def __init__(self, hass : HomeAssistant, name : str, id: str, type : int, apikey : str): + """Initialize a cover device.""" + self._name = name + self._id = id + self._type = type + self._apikey = apikey + uname = DOMAIN+name + self._unique_id = "_".join(x for x in uname) + self._state = False + + @property + def unique_id(self): + """Return unique identifier of remote device.""" + return self._unique_id + + @property + def available(self): + return True + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def name(self): + """Return the name of the device if any.""" + return self._name + + @property + def extra_state_attributes(self): + """Return the device state attributes.""" + return None + + @property + def assumed_state(self): + """Return true if unable to access real state of entity.""" + return True + + @property + def is_closed(self): + """Return if the cover is closed.""" + return not self._state + + def open_cover(self, **kwargs: Any) -> None: + """Open the cover.""" + url = "https://airsend.cloud/device/"+str(self._id)+"/command/5/" + self._call_cloud(url, True) + + def close_cover(self, **kwargs: Any) -> None: + """Close cover.""" + url = "https://airsend.cloud/device/"+str(self._id)+"/command/4/" + self._call_cloud(url, False) + + def stop_cover(self, **kwargs): + """Stop the cover.""" + url = "https://airsend.cloud/device/"+str(self._id)+"/command/3/" + self._call_cloud(url, False) + + def _call_cloud(self, url : str, new_state : bool): + headers = {"Authorization": "Bearer "+self._apikey, "content-type": "application/json", "User-Agent": "hass_airsend"} + status_code = 404 + try: + response = get(url, headers=headers) + status_code = response.status_code + except: + pass + if status_code == 200: + self._state = new_state + self.schedule_update_ha_state() + else: + _LOGGER.error("airsend.cloud error : "+str(status_code)) + raise Exception("airsend.cloud error : "+str(status_code)) diff --git a/custom_components/airsend/manifest.json b/custom_components/airsend/manifest.json new file mode 100644 index 0000000..4a82f7e --- /dev/null +++ b/custom_components/airsend/manifest.json @@ -0,0 +1,11 @@ +{ + "domain": "airsend", + "name": "AirSend", + "documentation": "https://github.com/devmel/hass_airsend", + "dependencies": [], + "config_flow": false, + "codeowners": ["@devmel"], + "requirements": [], + "version": "3.4", + "iot_class": "cloud_polling" +} diff --git a/custom_components/airsend/switch.py b/custom_components/airsend/switch.py new file mode 100644 index 0000000..2667d48 --- /dev/null +++ b/custom_components/airsend/switch.py @@ -0,0 +1,98 @@ +"""AirSend switches.""" +import logging +from typing import Any +from requests import get +from homeassistant.core import HomeAssistant +from homeassistant.helpers.typing import ConfigType +from homeassistant.helpers.entity import async_generate_entity_id +from homeassistant.components.switch import ( + SwitchEntity, +) +from . import ( + DOMAIN, +) + +_LOGGER = logging.getLogger(DOMAIN) + +async def async_setup_platform(hass : HomeAssistant, config : ConfigType, async_add_entities, discovery_info=None): + if discovery_info is None: + return + for name, options in discovery_info.items(): + if options['type'] == 4096 or options['type'] == 4097: + entity = AirSendSwitch(hass, name, options['id'], options['type'], options['apiKey']) + async_add_entities([entity]) + return + + +class AirSendSwitch(SwitchEntity): + """Representation of an AirSend Switch.""" + + def __init__(self, hass : HomeAssistant, name : str, id: str, type : int, apikey : str): + """Initialize a switch or light device.""" + self._name = name + self._id = id + self._type = type + self._apikey = apikey + uname = DOMAIN+name + self._unique_id = "_".join(x for x in uname) + self._state = False + + @property + def unique_id(self): + """Return unique identifier of remote device.""" + return self._unique_id + + @property + def available(self): + return True + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def name(self): + """Return the name of the device if any.""" + return self._name + + @property + def extra_state_attributes(self): + """Return the device state attributes.""" + return None + + @property + def assumed_state(self): + """Return true if unable to access real state of entity.""" + return True + + @property + def is_on(self): + return self._state + + def turn_on(self, **kwargs: Any) -> None: + """Turn the device on.""" + command = "1" if self._type == 4097 else "6" + url = "https://airsend.cloud/device/"+str(self._id)+"/command/"+command+"/" + self._call_cloud(url, True) + + def turn_off(self, **kwargs: Any) -> None: + """Turn the device off.""" + command = "0" if self._type == 4097 else "6" + url = "https://airsend.cloud/device/"+str(self._id)+"/command/"+command+"/" + self._call_cloud(url, False) + + def _call_cloud(self, url : str, new_state : bool): + headers = {"Authorization": "Bearer "+self._apikey, "content-type": "application/json", "User-Agent": "hass_airsend"} + status_code = 404 + try: + response = get(url, headers=headers) + status_code = response.status_code + except: + pass + if status_code == 200: + self._state = new_state + self.schedule_update_ha_state() + else: + _LOGGER.error("airsend.cloud error : "+str(status_code)) + raise Exception("airsend.cloud error : "+str(status_code)) diff --git a/hacs.json b/hacs.json new file mode 100644 index 0000000..6ae1600 --- /dev/null +++ b/hacs.json @@ -0,0 +1,5 @@ +{ + "name": "AirSend", + "render_readme": true, + "iot_class": "Cloud Polling" +} diff --git a/icons/icon.png b/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7280984c2354bb436a9ac93beeb45cde4cc4467a GIT binary patch literal 28025 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

4Q(^ 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 literal 0 HcmV?d00001 diff --git a/secrets.example.yaml b/secrets.example.yaml new file mode 100644 index 0000000..5ff1d03 --- /dev/null +++ b/secrets.example.yaml @@ -0,0 +1,6 @@ + +# Use this file to store secrets like usernames and passwords. +# Learn more at https://www.home-assistant.io/docs/configuration/secrets/ +some_password: welcome +asKey: 18xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx26 +