From 7c887a05ee75fe8854d526ddcb483ee628be7949 Mon Sep 17 00:00:00 2001 From: Merlin Schumacher Date: Thu, 9 May 2019 19:07:26 +0200 Subject: [PATCH] Initial commit --- .gitignore | 4 + LICENSE | 674 +++++++++++++++++++++++++++++++++++++++ README.md | 11 + include/README | 39 +++ lib/README | 46 +++ platformio.ini | 19 ++ schematics/wakeon_pc.fzz | Bin 0 -> 123948 bytes src/config.h | 89 ++++++ src/hextools.h | 24 ++ src/main.cpp | 51 +++ src/mqtt.h | 117 +++++++ src/pin.h | 24 ++ src/wifi.h | 50 +++ src/wol.h | 62 ++++ test/README | 11 + 15 files changed, 1221 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 include/README create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 schematics/wakeon_pc.fzz create mode 100644 src/config.h create mode 100644 src/hextools.h create mode 100644 src/main.cpp create mode 100644 src/mqtt.h create mode 100644 src/pin.h create mode 100644 src/wifi.h create mode 100644 src/wol.h create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04451df --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.pio +.pioenvs +.piolibdeps +.vscode diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /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..3e3c13a --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Wake-on-ESP – PCs per WLAN einschalten + +Dies ist der Quellcode zum Artikel ["Funkwecker" aus c't 11/2019](#). Der Code basiert auf PlatformIO und ist für den ESP8266 gedacht. + +Einen Schaltplan als Fritzing-Datei finden Sie im Unterverzeichnis schematics. + +# Wake-on-ESP – Powering up computers via WiFi + +This is the source code to the german language article ["Funkwecker" presented in c't 11/2019](#). The code is based on PlatformIO and was written for the ESP8266. + +A Fritzing schematic is found in the correspondingly named folder. \ No newline at end of file diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..fc39b1d --- /dev/null +++ b/platformio.ini @@ -0,0 +1,19 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:d1_mini_lite] +platform = espressif8266 +board = d1_mini_lite +framework = arduino +lib_deps = ESPAsyncUDP, AsyncMqttClient, WifiManager, ArduinoJson +monitor_speed = 115200 +; set frequency to 160MHz +board_build.f_cpu = 160000000L +build_flags = -DASYNC_TCP_SSL_ENABLED=1 diff --git a/schematics/wakeon_pc.fzz b/schematics/wakeon_pc.fzz new file mode 100644 index 0000000000000000000000000000000000000000..77a8c2e93d59d98c3ee3f74f47001efe052078ae GIT binary patch literal 123948 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�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 x$_iuj0NySFy@5hkT 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 IzW8eQfAa05mH+?% literal 0 HcmV?d00001 diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..28e3cf5 --- /dev/null +++ b/src/config.h @@ -0,0 +1,89 @@ +#include +#include + +static char mqtt_server[128] = ""; +static char mqtt_port[6] = ""; +static char mqtt_user[128] = ""; +static char mqtt_password[128] = ""; +static char mqtt_topic[128] = ""; +static char mqtt_fingerprint[256] = ""; + +static bool shouldSaveConfig = false; + +void saveConfigCallback(); +void loadConfig(); +void saveConfig(); + +void saveConfigCallback () { + Serial.println("Should save config"); + shouldSaveConfig = true; +} + +void loadConfig() { + Serial.println("mounting FS..."); + + if (SPIFFS.begin()) { + Serial.println("mounted file system"); + if (SPIFFS.exists("/config.json")) { + //file exists, reading and loading + Serial.println("reading config file"); + File configFile = SPIFFS.open("/config.json", "r"); + if (configFile) { + Serial.println("Opened config file"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + + configFile.readBytes(buf.get(), size); + + StaticJsonDocument<1024> doc; + DeserializationError error = deserializeJson(doc, buf.get()); + if (error) + Serial.println("Failed to read file, using default configuration"); + + JsonObject json = doc.as(); + if (!json.isNull()) { + Serial.println("Parsed json"); + + strcpy(mqtt_server, json["mqtt_server"]); + strcpy(mqtt_port, json["mqtt_port"]); + strcpy(mqtt_user, json["mqtt_user"]); + strcpy(mqtt_password, json["mqtt_password"]); + strcpy(mqtt_topic, json["mqtt_topic"]); + strcpy(mqtt_fingerprint, json["mqtt_fingerprint"]); + + } else { + Serial.println("failed to load json config"); + } + configFile.close(); + } + } + } else { + Serial.println("Failed to mount FS. Formatting in 10 Seconds."); + delay(10000); + SPIFFS.format(); + } +} + +void saveConfig() { + Serial.println("saving config"); + + StaticJsonDocument<1024> doc; + + doc["mqtt_server"] = mqtt_server; + doc["mqtt_port"] = mqtt_port; + doc["mqtt_user"] = mqtt_user; + doc["mqtt_password"] = mqtt_password; + doc["mqtt_topic"] = mqtt_topic; + doc["mqtt_fingerprint"] = mqtt_fingerprint; + + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + Serial.println("failed to open config file for writing"); + } + if (serializeJson(doc, configFile) == 0) { + Serial.println(F("Failed to write to file")); + } + configFile.close(); + shouldSaveConfig = false; +} diff --git a/src/hextools.h b/src/hextools.h new file mode 100644 index 0000000..61cc81e --- /dev/null +++ b/src/hextools.h @@ -0,0 +1,24 @@ +#include + +byte valFromChar(char c) { + if(c >= 'a' && c <= 'f') return (byte( (c - 'a') + 10) & 0x0F); + if(c >= 'A' && c <= 'F') return (byte( (c - 'A') + 10) & 0x0F); + if(c >= '0' && c <= '9') return (byte( (c - '0')) & 0x0F); + return 0; +} + +/* +* Very simple converter from a String representation of a MAC address to +* 6 bytes. Does not handle errors or delimiters, but requires very little +* code space and no libraries. +*/ +void StringToBytes(const String input, byte *bytes) { + if(input.length() >= 12) { + for(unsigned int i = 0; i < 6; i++) { + bytes[i] = byte((valFromChar(input.charAt(i*2)) << 4) | valFromChar(input.charAt(i*2 + 1))); + } + } else { + Serial.println("Incorrect MAC format."); + } +} + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..555952c --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "hextools.h" +#include "wifi.h" +#include "pin.h" +#include "mqtt.h" +#include "wol.h" + +void setup() { + Serial.begin(115200); + Serial.println("===Wake-on-ESP==="); + loadConfig(); + + wifiSetup(); + + if (shouldSaveConfig) { + saveConfig(); + } + + pinSetup(); + wolSetup(); + mqttSetup(); +} + +void loop() { + if(action_power == 1){ + pinToggle(POWER_PIN, 200); + action_power = 0; + } + if(action_power_force == 1){ + pinToggle(POWER_PIN, 5000); + action_power_force = 0; + } + if(action_reset == 1){ + pinToggle(RESET_PIN, 200); + action_reset = 0; + } + + // is configuration portal requested? + if ( digitalRead(CONFIG_PIN) == LOW ) { + wifiSetup(true); + } + if (shouldSaveConfig) { + saveConfig(); + } +} diff --git a/src/mqtt.h b/src/mqtt.h new file mode 100644 index 0000000..85a0c6a --- /dev/null +++ b/src/mqtt.h @@ -0,0 +1,117 @@ +#include +#include +#include + +static bool action_power = 0; +static bool action_power_force = 0; +static bool action_reset = 0; + +static AsyncMqttClient mqttClient; +Ticker mqttReconnectTimer; + +void mqttSetup(); + +void connectToMqtt() { + Serial.println("*MQTT: Connecting to MQTT..."); + mqttClient.connect(); +} + +void onMqttConnect(bool sessionPresent) { + Serial.println("*MQTT: Connected to MQTT."); + Serial.print("*MQTT: Session present: "); + Serial.println(sessionPresent); + if (strlen(mqtt_topic)==0) { + strcpy(mqtt_topic,"wakeonesp/wake"); + }; + uint16_t packetIdSub = mqttClient.subscribe(mqtt_topic, 2); + Serial.print("*MQTT: Subscribing at QoS 2, packetId: "); + Serial.println(packetIdSub); +} + +void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { + Serial.println("*MQTT: Disconnected from MQTT."); + + // if (reason == AsyncMqttClientDisconnectReason::TLS_BAD_FINGERPRINT) { + // Serial.println("Bad server fingerprint."); + // } + + if (WiFi.isConnected()) { + mqttReconnectTimer.once(5, connectToMqtt); + } +} + +void onMqttSubscribe(uint16_t packetId, uint8_t qos) { + Serial.println("*MQTT: Subscribe acknowledged."); + Serial.print("*MQTT: packetId: "); + Serial.println(packetId); + Serial.print("*MQTT: qos: "); + Serial.println(qos); +} + +void onMqttUnsubscribe(uint16_t packetId) { + Serial.println("*MQTT: Unsubscribe acknowledged."); + Serial.print("*MQTT: packetId: "); + Serial.println(packetId); +} + +void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { + Serial.println("*MQTT: Publish received."); + Serial.print("*MQTT: topic: "); + Serial.println(topic); + Serial.print("*MQTT: qos: "); + Serial.println(properties.qos); + Serial.print("*MQTT: dup: "); + Serial.println(properties.dup); + Serial.print("*MQTT: retain: "); + Serial.println(properties.retain); + Serial.print("*MQTT: len: "); + Serial.println(len); + Serial.print("*MQTT: index: "); + Serial.println(index); + Serial.print("*MQTT: total: "); + Serial.println(total); + Serial.println(); + if (!strncmp(payload, "on", len)) { + action_power = 1; + } else if (!strncmp(payload, "force_off", len)) { + action_power_force = 1; + } else if (!strncmp(payload, "reset", len)) { + action_reset = 1; + } +} + +void onMqttPublish(uint16_t packetId) { + Serial.println("*MQTT: Publish acknowledged."); + Serial.print("*MQTT: packetId: "); + Serial.println(packetId); +} + +void mqttSetup() { + mqttClient.onConnect(onMqttConnect); + mqttClient.onDisconnect(onMqttDisconnect); + mqttClient.onSubscribe(onMqttSubscribe); + mqttClient.onUnsubscribe(onMqttUnsubscribe); + mqttClient.onMessage(onMqttMessage); + mqttClient.onPublish(onMqttPublish); + + IPAddress mqtt_ip; + mqtt_ip.fromString(mqtt_server); + + Serial.print("*MQTT: Connecting to: "); + Serial.println(mqtt_ip); + + mqttClient.setServer(mqtt_ip, atoi(mqtt_port)); + mqttClient.setCredentials(mqtt_user, mqtt_password); + String clientIdStr = "WoE-"+WiFi.macAddress(); + char clientId[24]; + clientIdStr.toCharArray(clientId,24); + mqttClient.setClientId(clientId); + + // if (strncmp(mqtt_port, "8883", 4)) { + // mqttClient.setSecure(true); + // byte target_fp[128]; + // StringToBytes((String)mqtt_fingerprint, target_fp); + // mqttClient.addServerFingerprint(target_fp); + // } + mqttClient.connect(); +} diff --git a/src/pin.h b/src/pin.h new file mode 100644 index 0000000..c3a372a --- /dev/null +++ b/src/pin.h @@ -0,0 +1,24 @@ +#include +#define RESET_PIN 15 //D7 +#define POWER_PIN 13 //D8 +#define CONFIG_PIN 2 //D4 + +void pinSetup(); +void pinToggle(uint8_t pin, unsigned long ms); + +void pinSetup() { + pinMode(CONFIG_PIN, INPUT); + + pinMode(RESET_PIN,OUTPUT); + digitalWrite(RESET_PIN, LOW); + pinMode(POWER_PIN,OUTPUT); + digitalWrite(POWER_PIN, LOW); +} + +void pinToggle(uint8_t pin, unsigned long ms) { + Serial.printf("*PIN: Closing pin %i for %i ms\n", pin, int(ms)); + digitalWrite(pin, HIGH); + delay(ms); + digitalWrite(pin, LOW); + Serial.println("*PIN: Circuit open."); +} diff --git a/src/wifi.h b/src/wifi.h new file mode 100644 index 0000000..226e4f8 --- /dev/null +++ b/src/wifi.h @@ -0,0 +1,50 @@ +#include +// #include "config.h" + +void wifiSetup(bool onDemand); + +void wifiSetup(bool onDemand = false) { + String mac = "

This devices MAC-Address is: "; + mac += WiFi.macAddress(); + mac += "

"; + + String fp_info = "

Run

echo | openssl s_client -connect MYMQTTSERVER:8883 | openssl x509 -fingerprint -noout
to get your TLS fingerprint.

"; + + WiFiManagerParameter custom_text(mac.c_str()); + WiFiManagerParameter custom_text_ssl(fp_info.c_str()); + WiFiManagerParameter custom_mqtt_server("server", "MQTT Server IP", mqtt_server, 128); + WiFiManagerParameter custom_mqtt_port("port", "MQTT Port", mqtt_port, 6); + WiFiManagerParameter custom_mqtt_user("user", "MQTT Username", mqtt_user, 128); + WiFiManagerParameter custom_mqtt_password("password", "MQTT Password", mqtt_password, 128); + WiFiManagerParameter custom_mqtt_topic("topic", "MQTT Topic", mqtt_topic, 128); + WiFiManagerParameter custom_mqtt_fingerprint("fingerprint", "MQTT Fingerprint", mqtt_fingerprint, 128); + + WiFiManager wifiManager; + wifiManager.setAPStaticIPConfig(IPAddress(192,168,4,1), IPAddress(192,168,4,1), IPAddress(255,255,255,0)); + wifiManager.setTimeout(240); + + wifiManager.setSaveConfigCallback(saveConfigCallback); + + wifiManager.addParameter(&custom_text); + // wifiManager.addParameter(&custom_text_ssl); + wifiManager.addParameter(&custom_mqtt_server); + wifiManager.addParameter(&custom_mqtt_port); + wifiManager.addParameter(&custom_mqtt_user); + wifiManager.addParameter(&custom_mqtt_password); + wifiManager.addParameter(&custom_mqtt_topic); + // wifiManager.addParameter(&custom_mqtt_fingerprint); + + if (onDemand) { + wifiManager.startConfigPortal("Wake-on-ESP"); + } else { + wifiManager.autoConnect("Wake-on-ESP"); + + } + + strcpy(mqtt_server, custom_mqtt_server.getValue()); + strcpy(mqtt_port, custom_mqtt_port.getValue()); + strcpy(mqtt_user, custom_mqtt_user.getValue()); + strcpy(mqtt_password, custom_mqtt_password.getValue()); + strcpy(mqtt_password, custom_mqtt_topic.getValue()); + strcpy(mqtt_fingerprint, custom_mqtt_fingerprint.getValue()); +} diff --git a/src/wol.h b/src/wol.h new file mode 100644 index 0000000..4845492 --- /dev/null +++ b/src/wol.h @@ -0,0 +1,62 @@ +#include +#include + +static AsyncUDP udp; +static uint16_t localUdpPort = 9; // local port to listen on +static unsigned char incomingPacket[255]; // buffer for incoming packets +const byte preamble[] = {255,255,255,255,255,255}; +static byte target_mac[6]; + +void udpCallback(AsyncUDPPacket packet); +void wolSetup(); + +void udpCallback(AsyncUDPPacket packet) { + size_t len = packet.length(); + memcpy(&incomingPacket, packet.data(),len); + + if (len == 102) { + + Serial.printf("*WOL: Received a package from %s\n", packet.remoteIP().toString().c_str()); + if (len > 0) { + incomingPacket[len] = 0; + } + + bool packageIsValid = true; + for(byte b=0; b<6; b++) { + if(preamble[b] != incomingPacket[b]) + { + packageIsValid = false; + break; + } + } + + if(packageIsValid) { + Serial.println("*WOL: Package seems to be a valid WOL-package"); + } + + for(byte b=6; b<12; b++) { + if(int(target_mac[b-6]) != int(incomingPacket[b])) + { + packageIsValid = false; + break; + } + } + + if(packageIsValid) { + Serial.println("*WOL: Package is destined for me."); + action_power= 1; + } + + } +} + +void wolSetup() { + Serial.print("*WOL: My MAC-Address is: "); + String mac = WiFi.macAddress(); + Serial.println(mac); + mac.replace(":",""); + StringToBytes(mac, target_mac); + udp.listen(localUdpPort); + udp.onPacket(udpCallback); + Serial.printf("*WOL: Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html