From 39740276ec2d52d9b71a4eb3dbd7e0268270dbf5 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 16 Feb 2021 10:40:22 +0700 Subject: [PATCH] minimum viable product --- .gitignore | 9 + LICENSE.md | 621 ++++++++++++++++++++++++++++++++ README.md | 21 ++ aqi_monitor/aqi_monitor.ino | 169 +++++++++ aqi_monitor/config.sample.h | 7 + backend/flask/.dockerignore | 1 + backend/flask/Dockerfile | 14 + backend/flask/app.ini | 10 + backend/flask/app/__init__.py | 5 + backend/flask/app/aqi_parser.py | 73 ++++ backend/flask/app/views.py | 63 ++++ backend/flask/config.sample | 3 + backend/flask/dyn/values.json | 1 + backend/flask/requirements.txt | 5 + backend/flask/run.py | 26 ++ backend/nginx/Dockerfile | 8 + backend/nginx/nginx.conf | 10 + deploy.sh | 9 + docker-compose.yml | 73 ++++ frontend/nginx.conf | 23 ++ frontend/nginx/css/style.css | 91 +++++ frontend/nginx/favicon.ico | Bin 0 -> 41662 bytes frontend/nginx/img/cloud.png | Bin 0 -> 111720 bytes frontend/nginx/index.php | 35 ++ frontend/nginx/js/aqi.js | 77 ++++ tests/example_post.py | 29 ++ 26 files changed, 1383 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 aqi_monitor/aqi_monitor.ino create mode 100644 aqi_monitor/config.sample.h create mode 100644 backend/flask/.dockerignore create mode 100644 backend/flask/Dockerfile create mode 100644 backend/flask/app.ini create mode 100644 backend/flask/app/__init__.py create mode 100644 backend/flask/app/aqi_parser.py create mode 100644 backend/flask/app/views.py create mode 100644 backend/flask/config.sample create mode 100644 backend/flask/dyn/values.json create mode 100644 backend/flask/requirements.txt create mode 100644 backend/flask/run.py create mode 100644 backend/nginx/Dockerfile create mode 100644 backend/nginx/nginx.conf create mode 100755 deploy.sh create mode 100644 docker-compose.yml create mode 100644 frontend/nginx.conf create mode 100644 frontend/nginx/css/style.css create mode 100644 frontend/nginx/favicon.ico create mode 100644 frontend/nginx/img/cloud.png create mode 100644 frontend/nginx/index.php create mode 100644 frontend/nginx/js/aqi.js create mode 100755 tests/example_post.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70ab999 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# python stuff +__pycache__ + +# protect real config files +config +config.h + +# frontend font files +*.ttf \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..09c3f8d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,621 @@ +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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc0a467 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# AQI sensor project + +This is a place to show off what went into building my AQI measuring station currently publishing to: + +[lpb-air.com](lpb-air.com) + +This is a *Minimum Viable Product* and under development. The main purpose is educational. + +The webserver is a simple VPS, provisioned with docker-compose.yml. + +## aqi_monitor +*aqi_monitor.ino* is the arduino script running on the **nodeMCU ESP8266** microcontroller. The microcontroller posts data to the flask backend on a regular interval. +Connected to that is: +* SDS011: pm2.5 and pm10 sensor from Nova Fitness. +* BME280: Pressure Humidity Temperature Sensor Module. + +## backend +A [flask](https://pypi.org/project/Flask/) based application that takes the data from the ESP8266 for processing and storage. + +## frontend +A simple web site that gets AQI values from the backend to publish it nicely to see. Mostly build with HTML/CSS/JS and a little bit of PHP. diff --git a/aqi_monitor/aqi_monitor.ino b/aqi_monitor/aqi_monitor.ino new file mode 100644 index 0000000..1610544 --- /dev/null +++ b/aqi_monitor/aqi_monitor.ino @@ -0,0 +1,169 @@ +// config file +#include "config.h" + +// basics +#include +#include "base64.h" + +// wifi +#include +#include +#include + +// sds +#include + +// bme +#include +#include +#include +#include + + +// pin mapping +#define SDS_PIN_RX D7 +#define SDS_PIN_TX D8 +#define BME_SCK D1 +#define BME_MISO D4 +#define BME_MOSI D2 +#define BME_CS D3 + + +// initiate devices +NovaSDS011 sds011; +Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI +ESP8266WiFiMulti WiFiMulti; + + +// build base64 auth string +String auth = base64::encode(String(authUsername) + ":" + String(authPassword)); + + +void setup() { + Serial.begin(9600); + delay(500); + Serial.println(); + + // initiate device + sds011.begin(SDS_PIN_RX, SDS_PIN_TX); + + + if (sds011.setWorkingMode(WorkingMode::work)) { + Serial.println("SDS011 working mode \"Work\""); + } else { + Serial.println("FAIL: Unable to set working mode \"Work\""); + } + + // main loop speed + if (sds011.setDutyCycle(3)) { + Serial.println("SDS011 Duty Cycle set to 3min"); + } else { + Serial.println("FAIL: Unable to set Duty Cycle"); + } + + // BME setup + // default settings + bool status; + status = bme.begin(); + if (!status) { + Serial.println("Could not find a valid BME280 sensor, check wiring!"); + } + + // wifi setup + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + Serial.println(); + +} + + +void loop() { + // setup vars + float pm25, pm10, temperature, pressure, humidity; + int uptime; + // wait until no errors to print values + if (sds011.queryData(pm25, pm10) == QuerryError::no_error) { + + uptime = millis() / 1000; + // bme vars + temperature = bme.readTemperature(); + pressure = bme.readPressure() / 100.0F; + humidity = bme.readHumidity(); + + // build JSON + StaticJsonDocument<200> doc; + + doc["uptime"] = uptime; + doc["temperature"] = temperature; + doc["pressure"] = pressure; + doc["humidity"] = humidity; + doc["pm25"] = pm25; + doc["pm10"] = pm10; + + // send data + String response; + + if (WiFi.status() == WL_CONNECTED) { + + // format json body + String requestBody; + serializeJson(doc, requestBody); + Serial.println(requestBody); + + // connect to remote + WiFiClientSecure client; + client.setInsecure(); + char host[] = "data.lpb-air.com"; + + // retry on error + int retry = 0; + while ((!client.connect(host, 443)) && (retry < 5)) { + delay(1000); + Serial.print("."); + retry++; + } + if (retry == 5) { + Serial.println("Connection failed"); + } + // build request + client.print(String("POST ") + "/ingest" + + " HTTP/1.1\r\n" + + "Host: " + host + "\r\n" + + "Authorization: Basic " + auth + "\r\n" + + "Connection: close\r\n" + + "Content-Length: " + requestBody.length() + "\r\n" + + "Content-Type: application/json;charset=UTF-8\r\n\r\n" + + requestBody + "\r\n"); + + // read response + while (client.connected()) { + String line = client.readStringUntil('\n'); + if (line == "\r") { + break; + } + } + while (client.available()) { + response += client.readStringUntil('\n'); + } + Serial.println(response); + + } else { + + // wifi problems + Serial.println("wifi not connected"); + + } + + delay(60000); + + } +} diff --git a/aqi_monitor/config.sample.h b/aqi_monitor/config.sample.h new file mode 100644 index 0000000..756bc3d --- /dev/null +++ b/aqi_monitor/config.sample.h @@ -0,0 +1,7 @@ +// example config file + +const char* ssid = "my-wifi-ssid"; +const char* password = "my-wifi-password"; + +const char* authUsername = "username"; +const char* authPassword = "password"; diff --git a/backend/flask/.dockerignore b/backend/flask/.dockerignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/backend/flask/.dockerignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/backend/flask/Dockerfile b/backend/flask/Dockerfile new file mode 100644 index 0000000..7138ce8 --- /dev/null +++ b/backend/flask/Dockerfile @@ -0,0 +1,14 @@ +# Use the Python3.7.2 image +FROM python + +# Set the working directory to /app +WORKDIR /app + +# Copy the current directory contents into the container at /app +ADD . /app + +# Install the dependencies +RUN pip install -r requirements.txt + +# run the command to start uWSGI +CMD ["uwsgi", "app.ini"] diff --git a/backend/flask/app.ini b/backend/flask/app.ini new file mode 100644 index 0000000..4e98651 --- /dev/null +++ b/backend/flask/app.ini @@ -0,0 +1,10 @@ +[uwsgi] +wsgi-file = run.py +callable = app +socket = :8080 +processes = 4 +threads = 2 +master = true +chmod-socket = 660 +vacuum = true +die-on-term = true diff --git a/backend/flask/app/__init__.py b/backend/flask/app/__init__.py new file mode 100644 index 0000000..7b1c6f4 --- /dev/null +++ b/backend/flask/app/__init__.py @@ -0,0 +1,5 @@ +from flask import Flask + +app = Flask(__name__) + +from app import views diff --git a/backend/flask/app/aqi_parser.py b/backend/flask/app/aqi_parser.py new file mode 100644 index 0000000..17a2b59 --- /dev/null +++ b/backend/flask/app/aqi_parser.py @@ -0,0 +1,73 @@ +import json +from datetime import datetime +import numpy as np + +def input_process(data): + # parse string + # print(data) + # print('type' + type(data)) + json_dict = data + + pm25 = json_dict['pm25'] + + aqi, aqi_category = get_AQI(pm25) + json_dict['aqi_value'] = float(aqi) + json_dict['aqi_category'] = aqi_category + + now = datetime.now() + timestamp = now.strftime("%Y-%m-%d %H:%M:%S") + epoch_time = int(now.strftime('%s')) + + json_dict['timestamp'] = timestamp + json_dict['epoch_time'] = epoch_time + + new_string = json.dumps(json_dict) + + return new_string + + +def get_AQI(pm25): + if pm25 <= 12: + aqi = (pm25 / 12) * 50 + aqi_category = "Good" + elif pm25 > 12 and pm25 <= 35.4: + perc = (pm25 - 12) / (35.4 - 12) + aqi = (100 - 50) * perc + 50 + aqi_category = "Moderate" + elif pm25 > 35.4 and pm25 <= 55.4: + perc = (pm25 - 35.4) / (55.4 - 35.4) + aqi = (150 - 100) * perc + 100 + aqi_category = "Unhealthy for Sensitive Groups" + elif pm25 > 55.4 and pm25 <= 150.4: + perc = (pm25 - 55.4) / (150.4 - 55.4) + aqi = (200 - 150) * perc + 150 + aqi_category = "Unhealthy" + elif pm25 > 150.4 and pm25 <= 199.9: + perc = (pm25 - 150.4) / (199.9 - 150.4) + aqi = (250 - 200) * perc + 200 + aqi_category = "Very Unhealthy" + elif pm25 > 199.9 and pm25 <= 250.4: + perc = (pm25 - 199.9) / (250.4 - 199.9) + aqi = (300 - 250) * perc + 250 + aqi_category = "Very Unhealthy" + elif pm25 > 250.4 and pm25 <= 299.9: + perc = (pm25 - 250.4) / (299.9 - 250.4) + aqi = (350 - 300) * perc + 300 + aqi_category = "Hazardous" + elif pm25 > 299.9 and pm25 <= 350.4: + perc = (pm25 - 299.9) / (350.4 - 299.9) + aqi = (400 - 350) * perc + 350 + aqi_category = "Hazardous" + elif pm25 > 350.4 and pm25 <= 424.6: + perc = (pm25 - 350.4) / (424.6 - 350.4) + aqi = (450 - 400) * perc + 400 + aqi_category = "Hazardous" + elif pm25 > 424.6 and pm25 <= 500.4: + perc = (pm25 - 424.6) / (500.4 - 424.6) + aqi = (500 - 450) * perc + 450 + aqi_category = "Hazardous" + elif pm25 > 500.4: + aqi = pm25 + aqi_category = "Hazardous" + aqi = np.round_(int(aqi), decimals=0, out=None) + return aqi, aqi_category diff --git a/backend/flask/app/views.py b/backend/flask/app/views.py new file mode 100644 index 0000000..df1402c --- /dev/null +++ b/backend/flask/app/views.py @@ -0,0 +1,63 @@ +import configparser + +from flask_cors import CORS +from flask import request +from flask_httpauth import HTTPBasicAuth + +from app import app +from app import aqi_parser + +cors = CORS(app, resources={r"/": {"origins": "*"}}) +auth = HTTPBasicAuth() + + +def get_config(): + """ read out config file """ + # parse + config_parser = configparser.ConfigParser() + config_parser.read('config') + # build dict + config = {} + config["authUsername"] = config_parser.get('aqi_monitor', "authUsername") + config["authPassword"] = config_parser.get('aqi_monitor', "authPassword") + return config + + +config = get_config() + + +# build username / pw dict for basic auth +USER_DATA = {} +USER_DATA[config['authUsername']] = config['authPassword'] + + +@auth.verify_password +def verify(username, password): + if not (username and password): + return False + return USER_DATA.get(username) == password + + +# ingest +@app.route('/ingest', methods=['POST']) +@auth.login_required +def ingest(): + data = request.json + if data: + data = aqi_parser.input_process(data) + with open('dyn/values.json', 'w') as f: + f.write(data) + print(data) + return 'ingest' + + +# output +@app.route('/') +def home(): + try: + with open('dyn/values.json', 'r') as f: + data = f.read() + except FileNotFoundError: + # will get regeneratod on next run + data = '{}' + return data diff --git a/backend/flask/config.sample b/backend/flask/config.sample new file mode 100644 index 0000000..e664d09 --- /dev/null +++ b/backend/flask/config.sample @@ -0,0 +1,3 @@ +[aqi_monitor] +authUsername = username +authPassword = password \ No newline at end of file diff --git a/backend/flask/dyn/values.json b/backend/flask/dyn/values.json new file mode 100644 index 0000000..b678851 --- /dev/null +++ b/backend/flask/dyn/values.json @@ -0,0 +1 @@ +{"uptime": 1476, "temperature": 28.46, "pressure": 975.0873, "humidity": 40.52051, "pm25": 11, "pm10": 64.4, "aqi_value": 45.0, "aqi_category": "Good", "timestamp": "2021-02-14 14:27:06", "epoch_time": 1613287626} \ No newline at end of file diff --git a/backend/flask/requirements.txt b/backend/flask/requirements.txt new file mode 100644 index 0000000..b30c269 --- /dev/null +++ b/backend/flask/requirements.txt @@ -0,0 +1,5 @@ +Flask +flask-cors +Flask-HTTPAuth +uWSGI +numpy diff --git a/backend/flask/run.py b/backend/flask/run.py new file mode 100644 index 0000000..d014d8e --- /dev/null +++ b/backend/flask/run.py @@ -0,0 +1,26 @@ +""" + +Documentation: https://flask.palletsprojects.com + +Install on Arch +- sudo pacman -S python-flask +- sudo pacman -S python-flask-httpauth + +or with pip +- pip install Flask +- pip install Flask-HTTPAuth + + +Run Debug env: +export FLASK_APP=run.py +export FLASK_DEBUG=1 + +""" + + +from app import app + + + +if __name__ == "__main__": + app.run() diff --git a/backend/nginx/Dockerfile b/backend/nginx/Dockerfile new file mode 100644 index 0000000..e60bd5b --- /dev/null +++ b/backend/nginx/Dockerfile @@ -0,0 +1,8 @@ +# Use the Nginx image +FROM nginx + +# Remove the default nginx.conf +RUN rm /etc/nginx/conf.d/default.conf + +# Replace with our own nginx.conf +COPY nginx.conf /etc/nginx/conf.d/ diff --git a/backend/nginx/nginx.conf b/backend/nginx/nginx.conf new file mode 100644 index 0000000..1ffac49 --- /dev/null +++ b/backend/nginx/nginx.conf @@ -0,0 +1,10 @@ +server { + + listen 80; + + location / { + include uwsgi_params; + uwsgi_pass flask:8080; + } + +} \ No newline at end of file diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..244099c --- /dev/null +++ b/deploy.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# upload project to vps2 + +rsync --progress -a docker-compose.yml vps2:docker/ +rsync --progress -a --delete-after --exclude dyn --exclude config.sample backend vps2:docker/ +rsync --progress -a --delete-after frontend vps2:docker/ + +## +exit 0 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a200e77 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,73 @@ +version: "3" + +services: + # ssl + letsencrypt: + image: jrcs/letsencrypt-nginx-proxy-companion + container_name: nginx-proxy-letsencrypt + restart: always + volumes: + - ./volume/nginx-proxy/html:/usr/share/nginx/html + - ./volume/nginx-proxy/dhparam:/etc/nginx/dhparam + - ./volume/nginx-proxy/vhost:/etc/nginx/vhost.d + - ./volume/nginx-proxy/certs:/etc/nginx/certs + - /run/docker.sock:/var/run/docker.sock:ro + environment: + - NGINX_PROXY_CONTAINER=nginx-proxy + - DEFAULT_EMAIL=simobilleter@gmail.com + # proxy for all web services + nginx-proxy: + image: jwilder/nginx-proxy + container_name: nginx-proxy + restart: always + ports: + - "80:80" + - "443:443" + volumes: + - ./volume/nginx-proxy/html:/usr/share/nginx/html + - ./volume/nginx-proxy/dhparam:/etc/nginx/dhparam + - ./volume/nginx-proxy/vhost:/etc/nginx/vhost.d + - ./volume/nginx-proxy/certs:/etc/nginx/certs + - /run/docker.sock:/tmp/docker.sock:ro + labels: + - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy" + # backend flask + flask: + build: ./backend/flask + container_name: flask + restart: always + environment: + - APP_NAME=FlaskBackend + - TZ=Asia/Bangkok + expose: + - "8080" + # backend nginx + nginx: + build: ./backend/nginx + container_name: backend_nginx + restart: always + environment: + - VIRTUAL_HOST=data.lpb-air.com + - LETSENCRYPT_HOST=data.lpb-air.com + expose: + - "80" + # php fast-cgi + php: + image: php:7-fpm + container_name: php-fpm + restart: always + volumes: + - ./frontend/nginx:/air + # lpb-air + air: + image: nginx + container_name: lpb-air_nginx + restart: always + expose: + - "80" + volumes: + - ./frontend/nginx:/air:rw + - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf + environment: + - VIRTUAL_HOST=www.lpb-air.com,lpb-air.com + - LETSENCRYPT_HOST=www.lpb-air.com,lpb-air.com diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..2114710 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + index index.php index.html; + server_name localhost; + error_log /var/log/nginx/error.log; + access_log /var/log/nginx/access.log; + root /air; + + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass php:9000; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +} + +server { + server_name lpb-air.com; + return 301 https://www.lpb-air.com$request_uri; +} diff --git a/frontend/nginx/css/style.css b/frontend/nginx/css/style.css new file mode 100644 index 0000000..64110ed --- /dev/null +++ b/frontend/nginx/css/style.css @@ -0,0 +1,91 @@ +@font-face { + font-family: Rubik-Bold; + src: url(/font/Rubik-Bold.ttf); +} + +@font-face { + font-family: Rubik-Light; + src: url(/font/Rubik-Light.ttf); +} + +@font-face { + font-family: Rubik-Regular; + src: url(/font/Rubik-Regular.ttf); +} + +body { + margin: 0; + padding: 0; +} + +h1 { + font-family: Rubik-Bold; + font-size: 3em; +} + +h2 { + font-family: Rubik-Light; +} + +p { + font-family: Rubik-Regular; +} + +.colorbox { + height: 40px; + margin: 0; + padding: 0; +} + +.title { + padding: 30px 0; +} + +.top_content, .tagline_content { + width: 70%; + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.cloud { + position: relative; + padding-bottom: 30px; +} + +.cloud img { + width: 100%; +} + +.aqi_box { + position: absolute; + top: 50%; + left: 50%; + text-align: right; + transform: translate(-50%, -50%); + color: #fff; +} + +.aqi_box h1 { + font-size: 10em; + margin: 0; +} + +.aqi_box h2 { + margin: 0; +} + +.tagline_content { + text-align: center; +} + +/* responsiv */ +@media screen and (max-width: 700px) { + + .top_content { + width: 90%; + } + .aqi_box h1 { + font-size: 7em; + } +} \ No newline at end of file diff --git a/frontend/nginx/favicon.ico b/frontend/nginx/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ba9ca4feb7bff7f357a4ab0442e1ca4f7f91fd64 GIT binary patch literal 41662 zcmeI5drTY29mgG|()FaOsiIyhRXQb7RjL1+)c)HN9M%EbJVJ7pBe{s6@P?2CjLn&c zIr9u5;SnwrNVxC{Nr3b&$$@PirZL2T6ChBomsTgWp-qoVdZ+f9R#n2o(-|AXvhf;w zy@S2hY&7itX6#}2_xb*2W`DaPBGESZFDXd`f9@7_b%;bi5{X1VhXq!NEU=(@whaIv zB8B*XXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&dXn<&d zXn<&dXn<&dXn<&dXn<&dO#^K2oiOW5EE7TLcg@oW2F72C4Kv`^{eR%C1oh2YwAy|IS#3HQmR` zf=XHdLDa)7VZme`w08!?q>nz=HksqNa;SV@*?D}}`~)`#Ivbh#5jG}N%mbgWptC_- z;@=u6_Sh| z5W^JKvB?!%dD%4YJofJQeQeNqpyQB;`(U&2tJE?frVLY7SN_7?7JO$0gl0V9k4fAk zzlsey7b?r5sozq|Ly9baw5XMzlKK$`u9_e_p%-TIab3&(d-G$W7bJkU6`$MAcf%^A)ZhqZba zBUIv-ASlE)>syDP-QDkzOauBoN}SQW;LIn!u9Fwea*h$|(4=3FQ%qKI%8>;WBXHh$ zBbev=ZN4~$+?)ja(ic2tLLL8$pjaR_!J$(C&LeLqN6lS)`42}w;paTRZ{Hg!tk`hG zit^lOSFF+eH4Z=W)n{m`ofh0!<=`VfGPW!>z%>YuxmrAZeFkLe&o^a49Tvv=*5QBVUMz!o1ixot&+CVF zPPpVjCHx%(iG|I>#z!DLkZ!_DCs~<<92Djp&Ww?*%%^)Bi+gWPIn8ZRal%{QGC3d{ z<>P&s%jLo+{KDAA7)f~s#B%@6Q91LyvpSUXjT)F(XG?8^H>E}zxeWd;TkyBz8e7RDcZAu zybJd#VE$_R+xo#3X|E9osYEw?3XU8c1V;`9MmZKYV1@as?I@?%JaMNd{zf?vR8i)G z%*fvYWr#5#%9&!rL&O4Yw?7-*skmLYBp4o-OF(?60whbc0l`AK-vFB1O+T^Iu>b6s zG?WU4M}iu}Q(3lhGOAthOsc8|y67w%$2F#|&;6cBm3EBi+5Q zKXVVqt?!i#wtnNcOs>H>?j7X@9*9YLc)cKbsE_LwKk6{Kd^Zj<`C+NQGAYo!!oogo zWrHkvub`NykM}LYIpa-cOgOVqoYanV&-qoHw3dQ+nSzB!7D$nv6%3C;h3=cp;=&o1 zt5f}2)t!rre!=BLE-MSi+ zh)I$}1C-Pdb|%?U&(;sBLwajPslmb}CR}mqdT4yNY3!E1!r1YZy0_s)#>dsx)Sh$T zq-|e`?|$-Vj$1qslZ^c>*m=~}4PB_aI8;_zp#O7jV&6;ULA}++D0C2H%Lahz9lbR# zx$i|;q5e-7e`8d+@+pos7(?Gb^-1jtmiQ_Az-<J955y!bq7EMq$q<0!&JMnOhohhJq4sB3c)%PL@~`Jb0kR_QU}2JT zM7M&&hkW&k=KJLCv;5B;t2rvqS=jldNXxMBD9+VC;mdb8`stc6zK10?XgMmbOio4L z;GK!T&mFA~bPc@oVC1N{@<^2A10@{q`O3+^AE#Twp=mz*2-fJcW8M@~<{Kt2nFg`x!jmIWA zs?B`Q)}9tw;~fu}=V)rV`xf86!_i;c1AQ%TJTf-VQL*{lb-e;)M&07X1l@OEY%re2 z;X53C!W_zBUU;A!m4xG%6#42i5hkBxX^H1NFe_iSMrp~Gyh=LGwo9cJKbi2a!~b+#xz`h!`Uy)FD`h+qujF`72VH?`<0;K>J8g_ zGUYW*9f{E@E4`h5oG8f!+4}}vGlBVGtxER{J}cUd(`PvQhI2?2XC54LR1QC@aw?wE zudTlA+K)BGwKHs7P8_)8oCmy5(VXo2x4+--(XW;57>!x*eW7JeOjKNRRB*0=^G)sL zw!_ZO3&qUYy2~{=>a$;_#pW+3gxm9y36v5j!gaR$L^LK9oap;+WqJRIP}Wb*uGLxH z6-#fM$2`2uQ7JOZ{^jgk*y#lVCDp34~<2rg~heOhDo_BApRbAv&PNclL@fwb62(&)oI}qxm?h4oWcQ12P z`5#pOG0^;m^LpAR4P~i4E}o}*k)z7ZKmQo#xd&?B*QW^~s#+XH|Evf3abX&&cz5-bg!^zf|4SivBxZvhm;n^bE0bxbv?` z4e(%U)KQ>ohjX^Lv* zYA&_C$I?weSF`<{WKvK5hBnav(E!l^(E!l^(E!l^(E!l^(E!l^(E!l^(E!l^(E!l^ z(E!l^(E!l^(E!l^(E!l^(E!l^(E!l^(SQ#%0DrZ8`xd^r;W$QnV)Nh+)7tAWVw*qL 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

-Il3GDCp!o>R`oWtVzS#XFHWE1T_ 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 eEjRX3qzf>(Q`$Pxe{v5%YQ literal 0 HcmV?d00001 diff --git a/frontend/nginx/index.php b/frontend/nginx/index.php new file mode 100644 index 0000000..4dc1d9d --- /dev/null +++ b/frontend/nginx/index.php @@ -0,0 +1,35 @@ + + + + + + + + + AQI + + +

+
+
+
+

Live Air Quality

+

in Luang Prabang Laos PDR

+

Last updated:

+
+
+ cloud +
+

+

+
+
+
+
+
+
+

More is coming soon here!

+
+
+ + \ No newline at end of file diff --git a/frontend/nginx/js/aqi.js b/frontend/nginx/js/aqi.js new file mode 100644 index 0000000..cd09159 --- /dev/null +++ b/frontend/nginx/js/aqi.js @@ -0,0 +1,77 @@ +document.addEventListener("DOMContentLoaded", startInterval); + + +var colorConfig = +{ + // green + 'Good': [ + "#85a762", "#dbe4d1", + "invert(66%) sepia(11%) saturate(1318%) hue-rotate(47deg) brightness(92%) contrast(86%)"], + // yellow + 'Moderate': [ + "#d4b93c", "#f9f0c7", + "invert(79%) sepia(5%) saturate(4660%) hue-rotate(9deg) brightness(89%) contrast(103%)"], + // orange + 'Unhealthy for Sensitive Groups': [ + "#e96843", "#f8d0c8", + "invert(61%) sepia(93%) saturate(3252%) hue-rotate(333deg) brightness(95%) contrast(91%)"], + // red + 'Unhealthy': [ + "#d03f3b", "#f1c5c4", + "invert(39%) sepia(16%) saturate(2264%) hue-rotate(314deg) brightness(97%) contrast(110%)"], + // pink + 'Very Unhealthy': [ + "#be4173", "#e9c9d6", + "invert(45%) sepia(32%) saturate(3238%) hue-rotate(308deg) brightness(77%) contrast(90%)"], + // violet + 'Hazardous': [ + "#714261", "#d7c6d0", + "invert(31%) sepia(8%) saturate(2659%) hue-rotate(268deg) brightness(91%) contrast(88%)"] +} + +function startInterval() { + refreshAqiValues(); + setInterval("refreshAqiValues();",60000); +} + + +// wrap for setAqiValues +function refreshAqiValues() { + var req = new XMLHttpRequest(); + req.responseType = 'json'; + req.open('GET', 'https://data.lpb-air.com', true); + req.setRequestHeader('cache-control', 'no-cache'); + req.onload = function() { + var responseAqi = req.response; + var timestamp = responseAqi['timestamp']; + var aqiValue = responseAqi['aqi_value']; + var aqiCategory = responseAqi['aqi_category']; + setAqiValues(timestamp,aqiValue,aqiCategory); + setAqiColors(aqiCategory) + }; + req.send(); +} + +function setAqiValues(timestamp,aqiValue,aqiCategory) { + + document.getElementById('aqiValue').innerHTML = aqiValue; + document.getElementById('aqiCategory').innerHTML = aqiCategory; + document.getElementById('timestamp').innerHTML = timestamp; + +} + +function setAqiColors(aqiCategory) { + // parse config + var colMain = colorConfig[aqiCategory][0]; + var colSecond = colorConfig[aqiCategory][1]; + var colFilter = colorConfig[aqiCategory][2]; + // apply main col + document.getElementById('colorbox').style.backgroundColor = colMain; + // apply light background change + var lightBg = document.getElementsByClassName('light_background'); + for(var i = 0; i < lightBg.length; i++) { + lightBg[i].style.backgroundColor = colSecond; + }; + // apply cloud + document.getElementById('cloud').style.filter = colFilter; +} diff --git a/tests/example_post.py b/tests/example_post.py new file mode 100755 index 0000000..fd2d8c0 --- /dev/null +++ b/tests/example_post.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +""" test script to post data to the ingest route """ + +import requests +import json +import configparser + +# get auth +config_parser = configparser.ConfigParser() +config_parser.read('../backend/flask/config') +user_name = config_parser.get('aqi_monitor', "authUsername") +user_pass = config_parser.get('aqi_monitor', "authPassword") + +# example json data as from the esp8266 +json_data = { + "uptime": 1476, + "temperature": 28.46, + "pressure": 995.0873, + "humidity": 10.52051, + "pm25": 56.5, + "pm10": 64.4 +} + +# make the call +response = requests.post("https://data.lpb-air.com/ingest", json=json_data, auth = (user_name, user_pass)) + +# print result +print(response) +print(response.text)