From 4c654ec969da6e43c5965850f7f15c336e57e9e8 Mon Sep 17 00:00:00 2001 From: mia Date: Tue, 27 May 2025 11:25:37 +0200 Subject: [PATCH] The webserver is now using flask instead of python http server. This is due to its incapability to easily render images or graphs. The program now also uses a new class called 'Sensor' instead of a very long for loop to correctly format the data from the json file. Added LICENSE file Added favicon Added Flask HTML --- LICENSE | 660 ++++++++++++++++++++++++++ README.md | 43 +- shell.nix | 9 +- webserver/plots/sensor_001.png | Bin 22314 -> 0 bytes webserver/plots/sensor_002.png | Bin 23712 -> 0 bytes webserver/plots/sensor_003.png | Bin 23137 -> 0 bytes webserver/server.py | 301 ++++++++---- webserver/{ => static}/favicon.ico | Bin webserver/static/plots/sensor_001.png | Bin 0 -> 21127 bytes webserver/static/plots/sensor_002.png | Bin 0 -> 22879 bytes webserver/static/plots/sensor_003.png | Bin 0 -> 22073 bytes webserver/{ => static}/plots/test.png | Bin webserver/templates/index.html | 34 ++ 13 files changed, 932 insertions(+), 115 deletions(-) create mode 100644 LICENSE delete mode 100644 webserver/plots/sensor_001.png delete mode 100644 webserver/plots/sensor_002.png delete mode 100644 webserver/plots/sensor_003.png rename webserver/{ => static}/favicon.ico (100%) create mode 100644 webserver/static/plots/sensor_001.png create mode 100644 webserver/static/plots/sensor_002.png create mode 100644 webserver/static/plots/sensor_003.png rename webserver/{ => static}/plots/test.png (100%) create mode 100644 webserver/templates/index.html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c6f01c6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,660 @@ +# GNU AFFERO GENERAL PUBLIC LICENSE + +Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + +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. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing +under this license. + +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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your +version supports such interaction) an opportunity to receive the +Corresponding Source of your version by providing access to the +Corresponding Source from a network server at no charge, through some +standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any +work covered by version 3 of the GNU General Public License that is +incorporated pursuant to the following paragraph. + +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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + +### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for +the specific requirements. + +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 AGPL, see . diff --git a/README.md b/README.md index 37c6aea..edba6a3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Project Name +# PiWebSense ## Milestones @@ -14,27 +14,25 @@ The Raspberry Pi should be integratable to a Home Assistant Server and be used a Data should be sent and received via MQTT to an ESP32. The Pi acts as a sensor gateway. -## Tech Stack +## Tech Stack / Hardware Requirements -- **Raspberry Pi model**: -- **Programming languages**: Python -- **Frameworks/tools/Libraries**: (e.g., Flask, GPIO Zero) +- **Raspberry Pi**: Model 4 +- **Programming languages**: Python, jinja2 +- **Frameworks/tools/Libraries**: - Webserver: - - Python Http Server + - Flask - Json - - Sensors: - -## Hardware Requirements - -- Raspberry Pi with [model/specs] + - Sensors: Temperature, - **Sensors**: - - LER (Lichtsensor) - - Temperatur und Luftfeuchtigkeit + - LDR (Lightsensor) + - Sound Detector + - Temperature + - Temperature and humidity - ... ## Docs -- Json format: +- The data needs to be providet in the following format: ```Json { @@ -78,6 +76,8 @@ Data should be sent and received via MQTT to an ESP32. The Pi acts as a sensor g This file holds the requirements for pip - `shell.nix` This file is only used on nixos and for the nix packagemananger +- `.envrc` + This is also a bit of linuz nixos magic to automatically set up the development environment using direnv - `main.py` The main file for the project @@ -112,4 +112,17 @@ Data should be sent and received via MQTT to an ESP32. The Pi acts as a sensor g ### License -MIT +PiWebSense +Copyright (C) 2025 Kieler, Chiara + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License Version 3.0 as published by +the Free Software Foundation. + +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 Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . diff --git a/shell.nix b/shell.nix index 7c8b82d..c5f95c1 100644 --- a/shell.nix +++ b/shell.nix @@ -5,10 +5,11 @@ pkgs.mkShell { (pkgs.python3.withPackages (ps: with ps; [ matplotlib numpy + flask ])) ]; - shellHook = '' - export SHELL=${pkgs.zsh}/bin/zsh - exec ${pkgs.zsh}/bin/zsh - ''; + # shellHook = '' + # export SHELL=${pkgs.zsh}/bin/zsh + # exec ${pkgs.zsh}/bin/zsh + # ''; } diff --git a/webserver/plots/sensor_001.png b/webserver/plots/sensor_001.png deleted file mode 100644 index c7e6383a840a28b3d753b6cbb358907e1a663cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22314 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 diff --git a/webserver/plots/sensor_002.png b/webserver/plots/sensor_002.png deleted file mode 100644 index 4b768f08f66b405086882c652f34235b4b9f92f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23712 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 T6Mi&k;gm0|4_Q@N_$B`Z>L6dX diff --git a/webserver/plots/sensor_003.png b/webserver/plots/sensor_003.png deleted file mode 100644 index 930084a19cfc7b0c35ea18d6b4c958f267bb930a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23137 zcmd?RbySvLw>J6^!UKqaNOuSdl1g_7q6nf$OGrv1DUGx=h=`;h3J3x!(wzzlNJ@uv zODc8djrx1v{q65NWA8KeIscsBc;DgB=f2myVy?O7ysm4m&>Jd>g!t6>C=`lN>5BYK z6bjQ9g~Av|3zq0cD5I} zMY#DdFj_b{**l8z@YwwG0Jq(Ja~>uYtZ&c=p8XYVM-+<42>Cxow$!V8D3taWC3zWj zx8&uK2kMWvCR^4!8U%gc3a6iB2@5HGHT@=0+V*kcwJ_aB(}Nt&c8P}^?>!1;Vy9yX zxSyKpjP!gepKiX(@rdBjGlC>$-iP=NY>S>gKH(}V4>7UYYd!U6+eKVcx5QG-S9V6Q zE?$vEV=%*i{50gv^e7Veua^gh5¬G(w$*KNG3`fBe_pqBwTdyPfGW7K884C#R(F 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 {value}{unit}
" - graphdata[0].append(timeNoDate) - graphdata[1].append(value) + def getId(self): + return self.id - create_plot(i, unit, graphdata[0], graphdata[1]) + def getUnit(self): + return self.unit - htmldata += f""" -

Id: {i}

-

Type: {type}

-

Readings:

-
- {readings} - Graph -
-
- """ + def getType(self): + return self.type -html = f""" - - - - - Sensor Data - - - - {htmldata} - - -""" + def getReadings(self, limit=5, reversed=True, timetype="ts"): + datadic: dict = {} + match timetype: + case "ts": + for i in range(limit if limit < len(self.ts) else len(self.ts)): + datadic[self.ts[i]] = self.values[i] + case "time": + for i in range(limit if limit < len(self.ts) else len(self.ts)): + datadic[self.timeonly[i]] = self.values[i] + case "timedate": + for i in range(limit if limit < len(self.ts) else len(self.ts)): + datadic[self.timedate[i]] = self.values[i] + case _: + return "ERROR: timetype must be one of 'ts', 'time', 'timedate'" + return dict(sorted(datadic.items(), reverse=reversed)) + + # This only exist because jinja2 can not accept arguments :( + def getReadingsTimeDate(self): + return self.getReadings(timetype="timedate") + + def getReadingsTime(self): + return self.getReadings(timetype="time") + + def getValueByTimestamp(self, ts: int): + c = 0 + for i in self.ts: + c += 1 + if i == ts: + return self.values[c] + + def getTimestampByValue(self, value: float): + values: list = [] + for i in range(len(self.values)): + if self.values[i] == value: + values.append(self.ts[i]) + return values + + def renderPlot(self): + plt.plot(self.timeonly, self.values) + plt.title(self.id) + plt.xlabel("Time") + plt.ylabel(self.unit) + path = f"plots/{self.id}.png" + plt.savefig(f"static/{path}") # Save to file + plt.close() + return path + + # def formatLine(self, ts: int): + # for i in self.ts: + # if i == ts: + # return f"{self.timedate}> {self.values[]}" -class MyHandler(BaseHTTPRequestHandler): - def do_GET(self): - self.send_response(200) - # self.send_header("Content-type", "text/html") - self.end_headers() - self.wfile.write(html.encode("utf-8")) +# Json +f = open(jsonpath) +jsondata = json.load(f) # returns JSON object as a dictionary +# sensordict = dict() +sensors: dict = {} +for i in jsondata["sensors"]: # Iterating through the json list + timestamps: list = [] + values: list = [] + # print(len(i["readings"])) + for j in range(len(i["readings"])): + timestamps.append(i["readings"][j]["ts"]) + values.append(i["readings"][j]["value"]) + # print(i) + # print(i["readings"][1]) + # print("\n") + # sensordict[i["id"]] = [i["type"], i["unit"], i["readings"]] + # print(sensordict[i["id"]]) + sensors[i["id"]] = Sensor(i["id"], i["unit"], i["type"], timestamps, values) + + +f.close() +print("\n") +# print(sensordict) +print(sensors) +# print(sensors["sensor_001"].getReadings(limit=2, reversed=True, timetype="time")) + +# for i in sensordict: +# type = sensordict[i][0] +# unit = sensordict[i][1] +# readings = "" +# datapoints: list = [] +# sensorrange = len(sensordict[i][2]) if len(sensordict[i][2]) < 5 else 5 +# for j in range(sensorrange): +# datapoints.append([]) +# ts = sensordict[i][2][j]["ts"] +# value = sensordict[i][2][j]["value"] +# datapoints[j].append(ts) +# datapoints[j].append(value) +# datapoints[j].append(unit) +# datapoints.sort(reverse=True) +# +# graphdata: list = [[], []] +# for j in datapoints: +# ts = j[0] +# time = datetime.fromtimestamp(ts).strftime("%d.%m.%Y %H:%M.%S") +# timeNoDate = datetime.fromtimestamp(ts).strftime("%H:%M.%S") +# value = j[1] +# unit = j[2] +# # print(f"{time} {j}") +# readings += f"{time}> {value}{unit}
" +# graphdata[0].append(timeNoDate) +# graphdata[1].append(value) +# +# # create_plot(i, unit, graphdata[0], graphdata[1]) +# +# htmldata += f""" +#

Id: {i}

+#

Type: {type}

+#

Readings:

+#
+# {readings} +# Graph +#
+#
""" +# +# html = f""" +# +# +# +# +# Sensor Data +# +# +# +# {htmldata} +# +# +# """ + + +# class MyHandler(BaseHTTPRequestHandler): +# def do_GET(self): +# self.send_response(200) +# # self.send_header("Content-type", "text/html") +# self.end_headers() +# self.wfile.write(html.encode("utf-8")) +# +# +# if __name__ == "__main__": +# server_address = ("", 8000) +# httpd = HTTPServer(server_address, MyHandler) +# print("Serving on http://localhost:8000") +# httpd.serve_forever() + +app = Flask(__name__) + + +@app.route("/") +def index(): + return render_template("index.html", data=sensors) + + +# @app.before_request +# def before_request(): +# for sensor in sensors.values(): +# print(sensor) +# sensor.renderPlot() if __name__ == "__main__": - server_address = ("", 8000) - httpd = HTTPServer(server_address, MyHandler) - print("Serving on http://localhost:8000") - httpd.serve_forever() + app.run(debug=True) diff --git a/webserver/favicon.ico b/webserver/static/favicon.ico similarity index 100% rename from webserver/favicon.ico rename to webserver/static/favicon.ico diff --git a/webserver/static/plots/sensor_001.png b/webserver/static/plots/sensor_001.png new file mode 100644 index 0000000000000000000000000000000000000000..78d8e46e65ac19d82b07e65ba7df508fea707ba6 GIT binary patch literal 21127 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 z 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 + + + + + Sensor Data + + + +

Sensor Readings

+

{% for sensor in data.items() %}

+

{{ sensor[1].getId() }}[{{ sensor[1].getType() }}]

+
    + {% for key,value in sensor[1].getReadingsTimeDate().items() %} +
  • {{ key }}ยป {{ value }}{{ sensor[1].getUnit() }}
  • + {% endfor %} + Graph +
+ {% endfor %} + +