From fdc52ee122d057a153966355b920f5a6170ff2b6 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 14 Apr 2014 23:40:45 +0200 Subject: [PATCH 01/30] initial commit --- .gitignore | 17 + AUTHORS | 1 + COPYING | 674 ++++++++++++++++++++++ ChangeLog | 3 + Makefile.am | 30 + NEWS | 0 README | 4 + autogen.sh | 6 + contrib/csv/vaillant/ci.csv | 58 ++ contrib/csv/vaillant/ci.ods | Bin 0 -> 19166 bytes contrib/csv/vaillant/old/vaillant_cyc.csv | 14 + contrib/csv/vaillant/old/vaillant_cyc.ods | Bin 0 -> 14106 bytes contrib/csv/vaillant/old/vaillant_get.csv | 244 ++++++++ contrib/csv/vaillant/old/vaillant_get.ods | Bin 0 -> 20824 bytes contrib/csv/vaillant/old/vaillant_set.csv | 95 +++ contrib/csv/vaillant/old/vaillant_set.ods | Bin 0 -> 20808 bytes contrib/csv/vaillant/vpm20s.csv | 16 + contrib/csv/vaillant/vpm20s.ods | Bin 0 -> 14451 bytes contrib/csv/vaillant/vpm3035w.csv | 20 + contrib/csv/vaillant/vpm3035w.ods | Bin 0 -> 17230 bytes contrib/csv/vaillant/vr603.csv | 51 ++ contrib/csv/vaillant/vr603.ods | Bin 0 -> 20495 bytes contrib/csv/vaillant/vr903.csv | 6 + contrib/csv/vaillant/vr903.ods | Bin 0 -> 15028 bytes contrib/csv/vaillant/vwx.csv | 107 ++++ contrib/csv/vaillant/vwx.ods | Bin 0 -> 20557 bytes contrib/csv/wolf/wolf_cycle.csv | 8 + contrib/csv/wolf/wolf_cycle.ods | Bin 0 -> 26080 bytes src/baseloop.cpp | 154 +++++ src/baseloop.h | 92 +++ src/cycdata.cpp | 88 +++ src/cycdata.h | 56 ++ src/ebusloop.cpp | 110 ++++ src/ebusloop.h | 57 ++ src/main.cpp | 222 +++++++ src/network.cpp | 220 +++++++ src/network.h | 84 +++ test/feed.cpp | 99 ++++ test/scan_ebusd.bin | Bin 0 -> 18 bytes utils/appl.cpp | 161 ++++++ utils/appl.h | 102 ++++ utils/daemon.cpp | 117 ++++ utils/daemon.h | 48 ++ utils/logger.cpp | 201 +++++++ utils/logger.h | 177 ++++++ utils/notify.h | 56 ++ utils/tcpsocket.cpp | 92 +++ utils/tcpsocket.h | 77 +++ utils/thread.cpp | 84 +++ utils/thread.h | 46 ++ utils/wqueue.h | 85 +++ 51 files changed, 3782 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100755 autogen.sh create mode 100644 contrib/csv/vaillant/ci.csv create mode 100644 contrib/csv/vaillant/ci.ods create mode 100644 contrib/csv/vaillant/old/vaillant_cyc.csv create mode 100644 contrib/csv/vaillant/old/vaillant_cyc.ods create mode 100644 contrib/csv/vaillant/old/vaillant_get.csv create mode 100644 contrib/csv/vaillant/old/vaillant_get.ods create mode 100644 contrib/csv/vaillant/old/vaillant_set.csv create mode 100644 contrib/csv/vaillant/old/vaillant_set.ods create mode 100644 contrib/csv/vaillant/vpm20s.csv create mode 100644 contrib/csv/vaillant/vpm20s.ods create mode 100644 contrib/csv/vaillant/vpm3035w.csv create mode 100644 contrib/csv/vaillant/vpm3035w.ods create mode 100644 contrib/csv/vaillant/vr603.csv create mode 100644 contrib/csv/vaillant/vr603.ods create mode 100644 contrib/csv/vaillant/vr903.csv create mode 100644 contrib/csv/vaillant/vr903.ods create mode 100644 contrib/csv/vaillant/vwx.csv create mode 100644 contrib/csv/vaillant/vwx.ods create mode 100644 contrib/csv/wolf/wolf_cycle.csv create mode 100644 contrib/csv/wolf/wolf_cycle.ods create mode 100644 src/baseloop.cpp create mode 100644 src/baseloop.h create mode 100644 src/cycdata.cpp create mode 100644 src/cycdata.h create mode 100644 src/ebusloop.cpp create mode 100644 src/ebusloop.h create mode 100644 src/main.cpp create mode 100644 src/network.cpp create mode 100644 src/network.h create mode 100644 test/feed.cpp create mode 100644 test/scan_ebusd.bin create mode 100644 utils/appl.cpp create mode 100644 utils/appl.h create mode 100644 utils/daemon.cpp create mode 100644 utils/daemon.h create mode 100644 utils/logger.cpp create mode 100644 utils/logger.h create mode 100644 utils/notify.h create mode 100644 utils/tcpsocket.cpp create mode 100644 utils/tcpsocket.h create mode 100644 utils/thread.cpp create mode 100644 utils/thread.h create mode 100644 utils/wqueue.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6e9b6338 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +/INSTALL +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache/ +/config* +/depcomp +/ebus-daemon +/ebus-daemon*.tar.* +/install-sh +/missing +/stamp-h? +.deps/ +*.o +*.dirstamp +/compile +/feed diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..f24a463e --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Roland Jax diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..5af6adfb --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ +2014-01-09 Roland Jax + + * Initial commit. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..d8d36187 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,30 @@ +AUTOMAKE_OPTIONS = subdir-objects + +ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} + +AM_CXXFLAGS = $(LIBEBUS_CFLAGS) -I$(top_srcdir)/utils -fpic -Wall -Wextra + +bin_PROGRAMS = ebus-daemon + +ebus_daemon_SOURCES = src/main.cpp \ + src/baseloop.cpp \ + src/ebusloop.cpp \ + src/cycdata.cpp \ + src/network.cpp \ + utils/thread.cpp \ + utils/logger.cpp \ + utils/tcpsocket.cpp \ + utils/daemon.cpp \ + utils/appl.cpp + +ebus_daemon_LDADD = $(LIBEBUS_LIBS) \ + -lpthread + +dist_noinst_SCRIPTS = autogen.sh + +noinst_PROGRAMS = feed + +feed_SOURCES = test/feed.cpp \ + utils/appl.cpp + +feed_LDADD = $(LIBEBUS_LIBS) diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..1e6cf141 --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +ebusd +----- + +Daemon to communicate with ebus based heating systems. diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..2d8179c1 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,6 @@ +#!/bin/sh -e +test -n "$srcdir" || srcdir=`dirname "$0"` +test -n "$srcdir" || srcdir=. + +autoreconf --force --install --verbose "$srcdir" +test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" diff --git a/contrib/csv/vaillant/ci.csv b/contrib/csv/vaillant/ci.csv new file mode 100644 index 00000000..d3137d6b --- /dev/null +++ b/contrib/csv/vaillant/ci.csv @@ -0,0 +1,58 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;ci;HydraulicMap;Hydraulikplan;MS;15;B509;3;0D2900;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;Language;Sprache;MS;15;B509;3;0D2600;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;HolidayPeriod;Ferien Zeitraum;MS;15;B509;3;0D4300;4;start1;sd;1,2,3;hda;-;-;-;Start 1;start2;sd;5,6,4;hda;-;-;-;Start 2;end1;sd;7,8,9;hda;-;-;-;Ende 1;end2;sd;11,12,10;hda;-;-;-;Ende 2 +get;ci;HolidayRoomSetTemp;Ferien Solltemperatur;MS;15;B509;3;0D2200;1;-;sd;1,2;d2c;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;Password;Kennwort;MS;15;B509;3;0D2C00;4;pin1;sd;1;uch;-;-;-;Pin 1;pin2;sd;2;uch;-;-;-;Pin 2;pin3;sd;3;uch;-;-;-;Pin 3;pin4;sd;4;uch;-;-;-;Pin 4 +get;ci;DesiredTemp;Solltemperatur;MS;15;B509;3;0D0500;1;-;sd;1,2;d2c;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;FlowTempSensor;Vorlauftemperatur Ist;MS;15;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;ci;HeatingTimeMaxHotWaterRequest;Heizzeit MAX bei Warmwasseranforderung;MS;15;B509;3;0D4D00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;LoadingTimeMaxHeatRequest;Ladezeit MAX bei Heizanforderung;MS;15;B509;3;0D4C00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;TempIncrease;Temperaturüberhöhung;MS;15;B509;3;0D2F00;1;-;sd;1,2;d2c;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;PreTurnOffTime;Vorabschaltzeit;MS;15;B509;3;0D2D00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;FrostProtectionDelayTime;Frostschutzverzögerung;MS;15;B509;3;0D2E00;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;TempErrorDetectTime;Temperaturfehlererkennung;MS;15;B509;3;0D3300;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit2;Name Heizkreis 2;MS;15;B509;3;0D4108;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit4;Name Heizkreis 4;MS;15;B509;3;0D4118;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit5;Name Heizkreis 5;MS;15;B509;3;0D4120;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit6;Name Heizkreis 6;MS;15;B509;3;0D4128;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit7;Name Heizkreis 7;MS;15;B509;3;0D4130;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit8;Name Heizkreis 8;MS;15;B509;3;0D4138;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit9;Name Heizkreis 9;MS;15;B509;3;0D4140;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit10;Name Heizkreis 10;MS;15;B509;3;0D4148;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit11;Name Heizkreis 11;MS;15;B509;3;0D4150;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit12;Name Heizkreis 12;MS;15;B509;3;0D4158;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit13;Name Heizkreis 13;MS;15;B509;3;0D4160;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit14;Name Heizkreis 14;MS;15;B509;3;0D4168;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit15;Name Heizkreis 15;MS;15;B509;3;0D4170;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;NameHeatCircuit16;Name Heizkreis 16;MS;15;B509;3;0D4178;1;-;sd;1,10;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;PhoneNumber1;Telefonnummer 1;MS;15;B509;3;0D4200;1;-;sd;1,9;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;PhoneNumber2;Telefonnummer 2;MS;15;B509;3;0D4208;1;-;sd;1,9;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;HeatBufferAvailable;Bufferspeicher vorhanden;MS;15;B509;3;0D5C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear1;Energieertrag aktuelles Jahr Monat 1;MS;15;B509;3;0D8400;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear2;Energieertrag aktuelles Jahr Monat 2;MS;15;B509;3;0D8408;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear3;Energieertrag aktuelles Jahr Monat 3;MS;15;B509;3;0D8410;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear4;Energieertrag aktuelles Jahr Monat 4;MS;15;B509;3;0D8418;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear5;Energieertrag aktuelles Jahr Monat 5;MS;15;B509;3;0D8420;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear6;Energieertrag aktuelles Jahr Monat 6;MS;15;B509;3;0D8428;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear7;Energieertrag aktuelles Jahr Monat 7;MS;15;B509;3;0D8430;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear8;Energieertrag aktuelles Jahr Monat 8;MS;15;B509;3;0D8438;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear9;Energieertrag aktuelles Jahr Monat 9;MS;15;B509;3;0D8440;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear10;Energieertrag aktuelles Jahr Monat 10;MS;15;B509;3;0D8448;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear11;Energieertrag aktuelles Jahr Monat 11;MS;15;B509;3;0D8450;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear12;Energieertrag aktuelles Jahr Monat 12;MS;15;B509;3;0D8458;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear1;Energieertrag letztes Jahr Monat 1;MS;15;B509;3;0D8500;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear2;Energieertrag letztes Jahr Monat 2;MS;15;B509;3;0D8508;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear3;Energieertrag letztes Jahr Monat 3;MS;15;B509;3;0D8510;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear4;Energieertrag letztes Jahr Monat 4;MS;15;B509;3;0D8518;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear5;Energieertrag letztes Jahr Monat 5;MS;15;B509;3;0D8520;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear6;Energieertrag letztes Jahr Monat 6;MS;15;B509;3;0D8528;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear7;Energieertrag letztes Jahr Monat 7;MS;15;B509;3;0D8530;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear8;Energieertrag letztes Jahr Monat 8;MS;15;B509;3;0D8538;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear9;Energieertrag letztes Jahr Monat 9;MS;15;B509;3;0D8540;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear10;Energieertrag letztes Jahr Monat 10;MS;15;B509;3;0D8548;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear11;Energieertrag letztes Jahr Monat 11;MS;15;B509;3;0D8550;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear12;Energieertrag letztes Jahr Monat 12;MS;15;B509;3;0D8558;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldDayTransfer;Energieertrag Tagesübertrag;MS;15;B509;3;0D8600;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldSum;Energieertrag Gesamt;MS;15;B509;3;0D8700;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;SystemMode;Modus (Heizen/Kühlen/Warmwasser);MS;15;B509;3;0D9700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/ci.ods b/contrib/csv/vaillant/ci.ods new file mode 100644 index 0000000000000000000000000000000000000000..69613923c51f7ee21e7aa469e45c15bd4f5ad4d3 GIT binary patch literal 19166 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 literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/old/vaillant_cyc.csv b/contrib/csv/vaillant/old/vaillant_cyc.csv new file mode 100644 index 00000000..041e42ae --- /dev/null +++ b/contrib/csv/vaillant/old/vaillant_cyc.csv @@ -0,0 +1,14 @@ +# type;class;cmd;comment;msg type: 1=BROAD, 2=MM, 3=MS;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +cyc;broad;date_time_temp;Datum, Uhrzeit und Aussentempertur;BR;FE;0700;9;-;4;temp;md;1,2;d2b;1.0;°C;-;Temperatur;day;md;8;bdy;-;-;-;Wochentag;date;md;6,7,9;bda;-;-;-;Datum;time;md;5,4,3;bti;-;-;-;Uhrzeit +cyc;broad;load_VF_temp;Speicherladung und Vorlauftempertur;BR;FE;B505;4;27;3;load;md;2;bcd;1.0;-;00,01;Speicherladung;temp;md;3;d1c;1.0;°C;-;Temperatur;stat;md;4;bcd;1.0;-;-;Status;;;;;;;; +cyc;broad;date_time;Datum, Uhrzeit;BR;FE;B516;8;00;3;day;md;7;hdy;-;-;-;Wochentag;date;md;5,6,8;bda;-;-;-;Datum;time;md;4,3,2;bti;-;-;-;Uhrzeit;;;;;;;; +cyc;broad;temp;Aussentemperatur;BR;FE;B516;3;01;1;-;md;2,3;d2b;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +cyc;mv;VF1_temp;Vorlauftemperatur VF1;MS;08;B509;3;290100;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; +cyc;mv;RF1_temp;Rücklauftemperatur RF1;MS;08;B509;3;290700;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; +cyc;mv;VF2_temp;Vorlauftemperatur VF2;MS;08;B509;3;290300;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; +cyc;mv;brine_in;Quellentemperatur;MS;08;B509;3;290F00;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; +cyc;amu;high_eff_pump_stat;Hocheffizenzpumpenstatus;MS;08;B509;3;29B801;1;-;sd;3;bcd;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +cyc;cir2;heat_pump_stat;Status Heizkreispumpe;MS;08;B509;3;29B901;1;-;sd;3;bcd;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +cyc;cir2;date_time_temp;Datum, Uhrzeit und Aussentempertur;MS;50;B504;1;00;4;day;sd;7;hdy;-;-;-;Wochentag;date;sd;5,6,8;bda;-;-;-;Datum;time;sd;4,3,2;bti;-;-;-;Uhrzeit;temp;sd;9,10;d2b;1.0;°C;-;Temperatur diff --git a/contrib/csv/vaillant/old/vaillant_cyc.ods b/contrib/csv/vaillant/old/vaillant_cyc.ods new file mode 100644 index 0000000000000000000000000000000000000000..f289937bac75e2453f9b2b72ef19e3f042d3ba44 GIT binary patch literal 14106 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 Kuehlung > Heizung;MS;50;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;50;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;min_diff;min Diff VL / RT;MS;50;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;holiday_cooling;Kühlen im Ferienbetrieb;MS;50;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;statbit_cooling;Statusbit Kühlfunktion;MS;50;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;cooling_request;HK spezifische Kühlanforderung?;MS;50;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;heat_pump_stat;Status Heizkreispumpe;MS;50;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;50;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;50;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;heat_pump_heat;Heizkreispumpe Standardwert;MS;50;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir2;heat_pump_pause;Heizkreispumpe in Pausen;MS;50;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# Heizkreis 4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;mode;Heizkreis - Betriebsart;MS;52;B509;3;0D2B00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;type;Heizkreis - Kreis Typ;MS;52;B509;3;0D3C00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;rt_day;Heizkreis – Raumsolltemperatur;MS;52;B509;3;0D3200;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;rt_night;Heizkreis – Absenktemperatur;MS;52;B509;3;0D3300;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;curve;Heizkreis – Heizkurve;MS;52;B509;3;0D3500;1;-;sd;1;d1b;0.010;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;at_off;Heizkreis – Aussentemperatur Abschaltgrenze;MS;52;B509;3;0D3600;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;vl_min;Heizkreis - minimale Vorlauftemperatur;MS;52;B509;3;0D3000;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;vl_max;Heizkreis - maximale Vorlauftemperatur;MS;52;B509;3;0D3100;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;pre_hours;Heizkreis - max. Voraufheizung in Stunden;MS;52;B509;3;0D3800;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;estrich;Heizkreis Estrichtrocknung Tag;MS;52;B509;3;0D3B00;1;-;sd;1;bcd;1.000;dd;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;floor_protect;Fußbodenschutz;MS;52;B509;3;0D7B01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;cooling;Kühlbetrieb;MS;52;B509;3;0D8C01;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;cooling_support;Kühlbetrieb supported/ für freigegeben;MS;52;B509;3;0D8601;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;outdoor_24h_average;Außentemperatur mittel 24h;MS;52;B509;3;0D8801;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;cooling_offset_outdoor;Kühlung Offset AT-Abschaltgrenze;MS;52;B509;3;0D8701;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;locktime_cool>heat;Sperrzeit Kuehlung > Heizung;MS;52;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;52;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;min_diff;min Diff VL / RT;MS;52;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;holiday_cooling;Kühlen im Ferienbetrieb;MS;52;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;statbit_cooling;Statusbit Kühlfunktion;MS;52;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;cooling_request;HK spezifische Kühlanforderung?;MS;52;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;heat_pump_stat;Status Heizkreispumpe;MS;52;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;52;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;52;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;heat_pump_heat;Heizkreispumpe Standardwert;MS;52;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir4;heat_pump_pause;Heizkreispumpe in Pausen;MS;52;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# Heizkreis 5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;mode;Heizkreis - Betriebsart;MS;53;B509;3;0D2B00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;type;Heizkreis - Kreis Typ;MS;53;B509;3;0D3C00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;rt_day;Heizkreis – Raumsolltemperatur;MS;53;B509;3;0D3200;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;rt_night;Heizkreis – Absenktemperatur;MS;53;B509;3;0D3300;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;curve;Heizkreis – Heizkurve;MS;53;B509;3;0D3500;1;-;sd;1;d1b;0.010;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;at_off;Heizkreis – Aussentemperatur Abschaltgrenze;MS;53;B509;3;0D3600;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;vl_min;Heizkreis - minimale Vorlauftemperatur;MS;53;B509;3;0D3000;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;vl_max;Heizkreis - maximale Vorlauftemperatur;MS;53;B509;3;0D3100;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;pre_hours;Heizkreis - max. Voraufheizung in Stunden;MS;53;B509;3;0D3800;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;estrich;Heizkreis Estrichtrocknung Tag;MS;53;B509;3;0D3B00;1;-;sd;1;bcd;1.000;dd;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;floor_protect;Fußbodenschutz;MS;53;B509;3;0D7B01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;cooling;Kühlbetrieb;MS;53;B509;3;0D8C01;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;cooling_support;Kühlbetrieb supported/ für freigegeben;MS;53;B509;3;0D8601;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;outdoor_24h_average;Außentemperatur mittel 24h;MS;53;B509;3;0D8801;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;cooling_offset_outdoor;Kühlung Offset AT-Abschaltgrenze;MS;53;B509;3;0D8701;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;locktime_cool>heat;Sperrzeit Kuehlung > Heizung;MS;53;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;53;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;min_diff;min Diff VL / RT;MS;53;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;holiday_cooling;Kühlen im Ferienbetrieb;MS;53;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;statbit_cooling;Statusbit Kühlfunktion;MS;53;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;cooling_request;HK spezifische Kühlanforderung?;MS;53;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;heat_pump_stat;Status Heizkreispumpe;MS;53;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;53;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;53;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;heat_pump_heat;Heizkreispumpe Standardwert;MS;53;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;cir5;heat_pump_pause;Heizkreispumpe in Pausen;MS;53;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/old/vaillant_get.ods b/contrib/csv/vaillant/old/vaillant_get.ods new file mode 100644 index 0000000000000000000000000000000000000000..05cf37ab41b8ff9642e3ff2be77bc8ebf89db32d GIT binary patch literal 20824 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 z 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 Kuehlung > Heizung;MS;50;B509;4;0E8401;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;cir2;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;50;B509;4;0E8501;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;cir2;min_diff;min Diff VL / RT;MS;50;B509;4;0E8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;cir2;holiday_cooling;Kühlen im Ferienbetrieb;MS;50;B509;4;0E9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +set;cir2;heat_pump_pause;Heizkreispumpe in Pausen;MS;50;B509;4;0EE101;1;-;sd;1;d1b;1.000;%;-;%;;;;;;;;;;;;;;;;;;;;;;;; +#Boiler;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +set;hw;mode;WW/ Betriebsmodus;MS;25;B509;4;0E2B00;1;-;sd;1;bcd;1.000;-;-;01=Ein 02=Aus 03=Auto;;;;;;;;;;;;;;;;;;;;;;;; +set;hw;temp;WW/ Solltemperatur;MS;25;B509;5;0E8200;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;hw;min_temp;WW/ Min. Temperatur;MS;25;B509;5;0E8300;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;hw;legionella_protect;WW/ Legionellenschutz;MS;25;B509;4;0E4000;1;-;sd;1;bcd;1.000;-;-;00=Aus 01=An;;;;;;;;;;;;;;;;;;;;;;;; +set;hw;legionella_wday;WW/ Legionellenschutz Wochentag;MS;25;B509;4;0E7C01;1;-;sd;1;bcd;1.000;-;-;00=Mo 01=Di 02=Mi 03=Do ... ;;;;;;;;;;;;;;;;;;;;;;;; +#set;hw;legionelle_starttime;WW/ Legionellenschutz Startzeit;MS;25;B509;6;0E6700;1;-;sd;1;???;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +#Shortcuts;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +set;short;cir2_party;Quick/ Party-Modus;MS;50;B505;2;0A;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;short;cir2_rt_day;Quick/ Raumsolltemperatur;MS;50;B505;2;01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;short;cir2_mode;Quick/ Heizkreis Betriebsmodus;MS;50;B505;2;02;1;-;sd;1;d1b;1.000;-;-;01=Ein 02=Aus 03=Auto 04=Eco 05=Absenken;;;;;;;;;;;;;;;;;;;;;;;; +#set;short;cir2_curve;Quick/ Heizkurve;MS;50;B505;2;03;1;-;sd;-;???;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;short;party;Quick - Partymodus;MS;50;B505;2;05;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;short;hw_load;Quick - WW Speicherladung;MS;50;B505;2;06;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;short;cir2_save;Quick/ Sparen bis..;MS;50;B505;2;07;1;-;sd;1;d1c;1.000;-;-;21.5 = 21:30 Uhr;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/old/vaillant_set.ods b/contrib/csv/vaillant/old/vaillant_set.ods new file mode 100644 index 0000000000000000000000000000000000000000..b346275384b62516c7bb77ca3656457a74c4c2f0 GIT binary patch literal 20808 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 LRQ-8u3Ece;A(DLU literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/vpm20s.csv b/contrib/csv/vaillant/vpm20s.csv new file mode 100644 index 00000000..c49bbe6a --- /dev/null +++ b/contrib/csv/vaillant/vpm20s.csv @@ -0,0 +1,16 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;vpm20s;Date;Datum;MS;ED;B509;3;0D2400;1;-;sd;1,2,3;hda;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;Time;Uhrzeit;MS;ED;B509;3;0D2300;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;Country;Ländercode;MS;ED;B509;3;0D3900;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;YieldDay;Tagesertrag;MS;ED;B509;3;0D3B00;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;YieldSum;Gesamtertrag;MS;ED;B509;3;0D5600;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;SolarNtcFrom;vom Kollektor;MS;ED;B509;3;0D0500;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm20s;SolarNtcTo;zum Kollektor;MS;ED;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm20s;SolarPower;Solarpumpe Leistung;MS;ED;B509;3;0D1000;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;SolarHours;Solarpumpe Laufzeit;MS;ED;B509;3;0D1B00;1;-;sd;1,2;uin;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;SolarRelay;Solarpumpe Relais;MS;ED;B509;3;0D0F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;BufferNtcFrom;vom Speicher;MS;ED;B509;3;0D0800;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm20s;BufferNtcTo;zum Speicher;MS;ED;B509;3;0D0700;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm20s;BufferPower;Speicherpumpe Leistung;MS;ED;B509;3;0D1100;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;BufferHours;Speicherpumpe Laufzeit;MS;ED;B509;3;0D4C00;1;-;sd;1,2;uin;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;BufferFlow;Speicherpumpe Volumenstrom;MS;ED;B509;3;0D2E00;1;-;sd;1,2;uin;-;ml/min;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vpm20s.ods b/contrib/csv/vaillant/vpm20s.ods new file mode 100644 index 0000000000000000000000000000000000000000..e33d3f52eadf1308af0852f47d401621f81558af GIT binary patch literal 14451 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 UgF}24g8}@x11hw|^!fJx09R^w+yDRo literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/vpm3035w.csv b/contrib/csv/vaillant/vpm3035w.csv new file mode 100644 index 00000000..9a8e45a0 --- /dev/null +++ b/contrib/csv/vaillant/vpm3035w.csv @@ -0,0 +1,20 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;vpm3035w;Ntc1Sensor;Ntc1Sensor;MS;0A;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Ntc2Sensor;Ntc2Sensor;MS;0A;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Ntc3Sensor;Ntc3Sensor;MS;0A;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Vortex;Wirbel, Bypass?;MS;0A;B509;3;0D0300;1;-;sd;1,2;uin;-;hz;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;CircoPumpPower;Zirkulationspumpe Leistung;MS;0A;B509;3;0D0400;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;PumpDutyCycle;Pumpe Einschaltdauer;MS;0A;B509;3;0D0500;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;MixerPosition;Mischer Position max. 220 Schritte;MS;0A;B509;3;0D0600;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;ElectricHeater;Elektrische Zusatzheizung;MS;0A;B509;3;0D0800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;HeatDemand;Heizanforderung;MS;0A;B509;3;0D0900;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;OperatingMode;Betriebsart;MS;0A;B509;3;0D0A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;TappingSetpointManual;Zapfsollwert manuell;MS;0A;B509;3;0D0B00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;TappingSetpointAuto;Zapfsollwert automatisch;MS;0A;B509;3;0D0C00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;TappingSetpointActual;Zapfsollwert aktuell;MS;0A;B509;3;0D0E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;LegionellaProtectionDay;Legionellenfunktion Wochentag;MS;0A;B509;3;0D1000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;LegionellaProtectionTime;Legionellenfunktion Zeitpunkt;MS;0A;B509;3;0D1100;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;StartParty;Modus Party;MS;0A;B509;3;0D1200;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;StartHoliday;Modus Urlaub;MS;0A;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;FlowRate;Volumenstrom;MS;0A;B509;3;0D4600;1;-;sd;1,2;d2c;1.0;l/min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;VPMType;1=VPM20/25 2=VPM30/35;MS;0A;B509;3;0D4B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vpm3035w.ods b/contrib/csv/vaillant/vpm3035w.ods new file mode 100644 index 0000000000000000000000000000000000000000..b5607c137d72205ee2ec0e41ffd40954dd44636b GIT binary patch literal 17230 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

SRJjoC%)h09NBSZitbb(n|%I@&j zwnC@0ivV!gavjxCOl7jr_gfs8lEOj*wIg%0q^{mEr!unEvIBa~?qMIILbfT@hV++$ z90g9eGpzDDWP)QQSiza1f12($4=b=82RJ390IUT-T*Iq2^Bkdbzp_|` zCqZ2RUzD{jqzkSaFQRLSu`PWObEoU-%FfW5K`QiOV&Nj6)sc$!3TIsrpn3{gr}EaT z+p9~ZN}a}o1Y}L4YmG3~+@cw4dR7b)Z2+FN)wzwRD0s;XNar+eFhJof!JUT(w?$&m z$Hd0+YacjLS&)Ho87^>elg(iUdRQ~)w~m(8ciB3L1MDyS1)2>rB_%Y-bkx%qQ=Ouh z`_rGOAe6*nX{<0>Mr{q#4c$)XHkz7P|0Hh!&}AnXDx|D=WDMVaL6~0<-3^WfE~I)` zS6_*hd-<`q6jT!h9<)pOR4{&YJHVyOtK8^EKcl}SP@w<^z7IU$2PP*cKfGRc`aUe1 zr4kxJbU_-C+f5`IUW6b4)o=(w1mRdg(k^aGG*g4=B-xp;)&e?Zstaad^~$Wil}V}n z+ky1pySZH|W;Tzz(o^HeiG#z5hyfG_z!addC|h+0fU8iClmYZw{st^8tUDDJ=_nBq zk%OaSp7!NN`)b4Yk|q4Nu5wuL!x_5vJ0*|3a)I9I6LcsJ^GKnx+m)M}o2TFCH8nL( zKdOHYuu%t!5gJE8YfUpNqYoNmd4PPSY1wMF-v!ttNO)`!EJih5w`}R&Qju64bduRm zGAaZ?rMD|zlZN1pGLi%fklYvrsqYn$(~Yql)pc8(1TjLL4XsAPu1`=3?eS#eXv`&` zIm}ya*14SZaCjf`N4|2gj*aCiD(J!CX-thwr~SM767sX_i1InTDBg3 zv#jNbSHk4B?o&R1eXSR5RX=Q)HljBVHy2ApP0a)-;DUy4laYp77zmQ+d^emG=`;mN z1xuG{B}?VfNOFMInsWq`bkt<@9C$^j>1EiRf%}TJcWJ;=Gnq$7QIkt~C~ywY)P56$ zkX5wU*O7Fk9!wQAoyt-90fl+T-e^1pG`5HAXSLpfe(Tj_+yXwFyDUf#0Y9rWwsf6> z2YV19(*)4U!VKo4$+X(dc7(&%WU&^EBOnalycJ0R3I2cx8p&B%jfRNoK4mO_B31&Pd8P1hV#ecy8 zR1i@Dm#$r6KmkAkw6bZF1dAmWs~!+$`b2^6a6OEbtNvtBp5$Q!^fRhAH_y+u==+zxb?;P?z~WMVsuxD{qt=r^sx}$k-OsiGKt;vGW&){}m?>IKPc(&u0;o+6 z0S2nHFrPYb;4~W6c#=bk*AX^eaP~<8Fb3*|GF*~O<|qfDe+foNICZf^m_io+K_)Az z-!aO8KBfnyZE!{yE`z_28?Rwc5MV4@O7kE`+#DDD0b+r%olpl7pOEl+f7)a+`lT-j zikmgZUN7fNTRrjm=@;lv2J;BsRq(^^NF61m01hf1p3FMkE22z5xHFzLN&6fOr=U%L~~RlF^>+i3@Ky7!-5q= znX_z-=$I`1@0h?*7;QsV)9~ZB0SB3fJ?8np9n-pu^IC3iZ?}h+^%m!Us$VYE>;h7v zj1cw^vfkL=MMZ<{&VD+YfEm@{HkFbAJhaj@fR{avT@4dhymToTqF1>wBtvM0arpb| zxeghF=2-MBf3gdOatU2!Rd1LZvhQXS{ODu(_8 z6f*nf$d9AHhOxx;r6#A3O( z_~ln%q>oEkz<25wA9(b}z<=v&sgWoMI}<%t4%UL|ky2n=F_cRw*!n{=scUX>xan^t zm<-^)k*Pi|u;H*Noy{!`CUe1oT=zJQK|-v00@EoC7YjqfycRXqSQ-FZApyMO^oDYG zV}P$1kSe&VuvlKa5-$kL2QiLrUQP?ZFq*>D_=Y<#QmRVG86(JKUi@t;Q}|z_(6_-{ z_v)jWP@PoZ�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

^6r1I1$4f6QMUWf`Y zce=v-P$UI8t#U{N1tJsiNML=~%@lpU#-CV%C~|AwSZ$=~!8p$-1=<-$#An4j9{Lf3 z9eqKDTAA?fuxI~7gTCBZa?C6T|37WV<40{bJ}k%MP^yl}cL(VKYAJO^k&qRhX@aME zT2n2Te_V7E9P2vnzj`=T6&J;4#sy=T9kG8*=p{JfdrP3+2FO1yzNTk#Pg*M>ypwII zL>PtpNOjh0c`e;P!8T!cUSnXgH;r2o`B7%<`^CquR)bIQF=eF9O8Z?dyZc7Dp>iR; z>OncCV?Jm15-xinym@ghk%S5Vux_psT>hX2N7O$0eYz*q*Qbv{R zZPJPoeaw3Z(fS7#WU$~V#V|EraXclu3?|%gO(9zHEMK2Z&%Mh15K{~Z4b=?q9H#Mm zXR3@!$K{=5jihkcqjfXI^*ezP&ZA=fRov`kYMNNI9M$+ZVZKrn%0rr2QqY%?cO8CH zCGIB!=ZAyj(%nkh{%22wj0toOG8nW4sY?`RY z2)i#V6u1uI%}L?T`ZQ=&`G!4M@?goS_q!5VFuTF$4M%ymulqQ1yX zN3nf#nUJ}i+y1?AW~ikYx9seaT~~jqa{yOUV0{wa$Z~30BTa8eAF{u^w0GMvKM8vI z#f&p21$wrYd0XQrBCdN);F+vKq4D(%{bw|1A~)UC16Yl-j{3hm|Icj@)`m6~rY4R~ zbPmR*;|b$7fec7Nmps8H6H5a0;NT7vBfl+kx>!Rr!0B(&Q8qea64Vq6%TIFVb}Pl0 zH)HBE&JDi~Mb?&ftFRbRl8#82Hyl%QwbK1ATIE_o+gg2sy$vbf*#!seXVfi_iFbUMwAbAKe@ja=s{ z%dLemY*cCwZ6x^NFAxnaGZN$!__ak&x}Q1uR*|zi?|f&_pnWzlpU2>eI%aZdBMh#1 zUvI0u`a&mg(<{l`?Q87 z{sv!Fyy|oK>L1N#zyX0%;QtvokpqTL*w)6>!pzy>uh-Wdndl9Tj7+Rd0GGB7^hVAO z4*#_h3JQp+AwPp>pwAc1Kg++r$NrCd|M(ABVf`OuEvyaAOdRQjES#(j?HmD9{P|-2 z|7&LpIsjQ#R7H?hQcjHizvmVZtyic>+w>A3tskO&Ssj@&Rn6njR5^j30af5}i8Bxw zLn3XWk4cnQEh?WsJ9ynNg3z!==w|mE+9Pt=5#@`7m>SsFUJ8#r_k5*dJME{!bOJ>> zt(%_XD~wzXk5?2Ij$ug$DqKEE1$s4?1~PtY*UL$z+lcln(x6YL-rVA;Z{WwTniszA zkPUIoQg{@o+y-iAro~5f>M7jIV$~U)!}D}Up|N$AlERXa=LY&>8IyQk86?j#k+4%o zi5lZt*lZxCpzQMn7T9qeewb^Ldk79vP1)m1b@b5eGk!FV-*~TJcq|?sf1snxfzMMf ze7UN89p?rSf(^|xn4q-DFL1>9XwBvL+e_{z{6&0yaP&-)p`F5Z(bOUJlR@?BcaYEd z5n48mAplIfDA?!x0E3_b{qJ8d_}3Zx=eG?06YD>}Pw-DH6~O8L_O*h)sr)^`|GN18 zDYO49zF+@+Bh!Ck{%cm}b8-HkWs&gTmg@f#@n2I1fAQ^qV>Z(Ry8B-#p#Q}BSGDt* zR`_R$V*J-6!++xatGxYt2Sa%OT}AyT=4TCmi`1t){;-5r- zfIg-1pXDq6|0Mc9Wb+@4^Y`TaD^q<+=Rb=kfY|?2Ru!bdAwI!i0DoS9-n9vQUj2V& CjT_kj literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/vr603.csv b/contrib/csv/vaillant/vr603.csv new file mode 100644 index 00000000..4a220575 --- /dev/null +++ b/contrib/csv/vaillant/vr603.csv @@ -0,0 +1,51 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;vr603;OutsideTemp24hAvg;Aussentemperatur 24h Mittelwert;MS;52;B509;3;0DBB00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempSensor;Vorlauftemperatur Ist;MS;52;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vr603mk1;OutsideTemp;Aussentemperatur;MS;52;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vr603mk1;RemoteControlActive;Fernsteuerung aktiv;MS;52;B509;3;0D0A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;MixerDutyCycle;Mischer Einschaltdauer;MS;52;B509;3;0D0E00;1;-;sd;1;sch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;HolidayActive;Ferienprogramm aktiv;MS;52;B509;3;0D2700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;OperatingMode;Betriebsart;MS;52;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempMin;Vorlaufsollwert MIN;MS;52;B509;3;0D3000;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempMax;Vorlaufsollwert MAX;MS;52;B509;3;0D3100;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;DesiredTemp;Solltemperatur;MS;52;B509;3;0D3200;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;DesiredTempLow;Absenktemperatur;MS;52;B509;3;0D3300;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;HeatingCurve;Heizkurve;MS;52;B509;3;0D3500;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;52;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;PreHeatingTimeMax;Voraufheizung MAX;MS;52;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FloorScreedDryingDay;Estrichtrocknung Tag;MS;52;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;HeatingCircuitType;Heizkreistyp;MS;52;B509;3;0D3C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;OperatingModeRemoteControl;Betriebsart Fernsteuerung;MS;52;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempDesired;Vorlauftemperatur Soll;MS;52;B509;3;0D4600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;TankHeatingActive;Speicherladung aktiv;MS;52;B509;3;0D4700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;PowerSavingActive;Sparfunktion aktiv;MS;52;B509;3;0D4B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;PartyActive;Partyfunktion aktiv;MS;52;B509;3;0D4E00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;PumpCutOffTime;Pumpe Sperrzeit;MS;52;B509;3;0D4F00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;PumpState;Pumpe Status;MS;52;B509;3;0D9100;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;52;B509;3;0DBA00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;CoolingHysteresisTempMin;Kühlung Hysteresis Vorlauftemperatur MIN;MS;52;B509;3;0DBE00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;CoolingOperatingMode;Kühlung Betriebsart;MS;52;B509;3;0DBF00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempSensor;Vorlauftemperatur Ist;MS;53;B509;3;0D0300;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vr603mk2;OutsideTemp;Aussentemperatur;MS;53;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vr603mk2;RemoteControlActive;Fernsteuerung aktiv;MS;53;B509;3;0D0A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;MixerDutyCycle;Mischer Einschaltdauer;MS;53;B509;3;0D0F00;1;-;sd;1;sch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;HolidayActive;Ferienprogramm aktiv;MS;53;B509;3;0D2700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;OperatingMode;Betriebsart;MS;53;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempMin;Vorlaufsollwert MIN;MS;53;B509;3;0D3000;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempMax;Vorlaufsollwert MAX;MS;53;B509;3;0D3100;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;DesiredTemp;Solltemperatur;MS;53;B509;3;0D3200;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;DesiredTempLow;Absenktemperatur;MS;53;B509;3;0D3300;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;HeatingCurve;Heizkurve;MS;53;B509;3;0D3500;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;53;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;PreHeatingTimeMax;Voraufheizung MAX;MS;53;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FloorScreedDryingDay;Estrichtrocknung Tag;MS;53;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;HeatingCircuitType;Heizkreistyp;MS;53;B509;3;0D3C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;OperatingModeRemoteControl;Betriebsart Fernsteuerung;MS;53;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempDesired;Vorlauftemperatur Soll;MS;53;B509;3;0D4600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;TankHeatingActive;Speicherladung aktiv;MS;53;B509;3;0D4700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;PowerSavingActive;Sparfunktion aktiv;MS;53;B509;3;0D4B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;PartyActive;Partyfunktion aktiv;MS;53;B509;3;0D4E00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;PumpCutOffTime;Pumpe Sperrzeit;MS;53;B509;3;0D4F00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;PumpState;Pumpe Status;MS;53;B509;3;0D9400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;53;B509;3;0DBA00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;CoolingOperatingMode;Kühlung Betriebsart;MS;53;B509;3;0DBF00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vr603.ods b/contrib/csv/vaillant/vr603.ods new file mode 100644 index 0000000000000000000000000000000000000000..84109af18d92c9398051f616b1d2f47fb327b4f7 GIT binary patch literal 20495 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 literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/vr903.csv b/contrib/csv/vaillant/vr903.csv new file mode 100644 index 00000000..9b54b112 --- /dev/null +++ b/contrib/csv/vaillant/vr903.csv @@ -0,0 +1,6 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;vr903;RoomTempAct;Raumisttemperatur;MS;1C;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vr903;RoomTempActOffset;Raumisttemperatur Offset;MS;1C;B509;3;0D1F00;1;-;sd;1,2;d2c;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr903;HolidayPeriod;Ferien Zeitraum;MS;1C;B509;3;0D4300;4;start1;sd;1,2,3;hda;-;-;-;Start 1;start2;sd;5,6,4;hda;-;-;-;Start 2;end1;sd;7,8,9;hda;-;-;-;Ende 1;end2;sd;11,12,10;hda;-;-;-;Ende 2 +get;vr903;RoomSetTempHoliday;Ferien Solltemperatur;MS;1C;B509;3;0D2200;1;-;sd;1,2;d2c;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr903;LcdContrast;Kontrast Display;MS;1C;B509;3;0D3600;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vr903.ods b/contrib/csv/vaillant/vr903.ods new file mode 100644 index 0000000000000000000000000000000000000000..a8e68ad95db736d9ac47d07ebfd9747c521cf6b3 GIT binary patch literal 15028 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 aX8$c#<)y&D|1^UF{CNZ3j*$J&-Twj6ROz|^ literal 0 HcmV?d00001 diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv new file mode 100644 index 00000000..d95e6681 --- /dev/null +++ b/contrib/csv/vaillant/vwx.csv @@ -0,0 +1,107 @@ +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +get;vwx;BivalentTemp;Bivalenztemperatur;MS;08;B509;3;0D6500;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Bleeding;Entlüften;MS;08;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpPower;Solepumpe Leistung;MS;08;B509;3;0DAC01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpPowerHeating;Solepumpe Leistung beim Heizen;MS;08;B509;3;0DAE01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpPreRunTime;Vorlaufzeit Quellenpumpe;MS;08;B509;3;0D7600;1;-;sd;1,4;ulg;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpState;Solepumpe Status;MS;08;B509;3;0D1900;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpState;Solepumpe Status;MS;08;B509;3;0DB801;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrineTempInput;T3 Sole Temperatur Vorlauf – von Quelle;MS;08;B509;3;0D0F00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;BrineTempOutput;T8 Sole Temperatur Rücklauf – zur Quelle;MS;08;B509;3;0D0800;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;CirculationPumpInput;Zirkulationspumpe Eingang;MS;08;B509;3;0D0B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CirculationPumpPower;Zirkulationspumpe Leistung;MS;23;B509;3;0DE601;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CirculationPumpState;Zirkulationspumpe Status;MS;08;B509;3;0D0C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Code1;Code 1;MS;08;B509;3;0D9700;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Code2;Code 2;MS;08;B509;3;0D9800;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CodeValid;Code 1 und 2 gültig;MS;08;B509;3;0D2400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CommutationState;Kompressor Kommunikationsstatus;MS;08;B509;3;0DAA00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CompressorNumberStarts;Kompressor Starts pro Stunde;MS;08;B509;3;0D7400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CompressorState;Kompressor Status;MS;08;B509;3;0D1D00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CompressorTempInput;T1 Kompressor Temperatur Eintritt;MS;08;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;CompressorTempOutput;T2 Kompressor Temperatur Austritt;MS;08;B509;3;0D0400;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;Date;Datum;MS;08;B509;3;0D2900;1;-;sd;1,2,3;hda;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;DeicingState;Enteisung Status;MS;08;B509;3;0DCE01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;DeicingWaitTime;Enteisung Wartezeit zur nächsten Enteisung;MS;08;B509;3;0D7000;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;EvaporatorTemp;Verdampfer Temperatur;MS;08;B509;3;0D0500;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;ExpansionValveInputTemp;TEV Temperatur Eintritt;MS;08;B509;3;0D0D00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;FlowTemp;VF2 Vorlauftemperatur IST;MS;08;B509;3;0D0300;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;FlowTempIntern;T6 interne Vorlauftempertur IST;MS;08;B509;3;0D0900;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;FrezzeProtectionTempMin;Einfrierschutz T81;MS;08;B509;3;0D7A01;1;-;sd;1;sch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;HeatPumpState;Heizkreispumpe Status;MS;08;B509;3;0D1700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;Hysteresis;Kompressor Hysterese;MS;08;B509;3;0D7D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;InitialCurrentLimitation;Anlaufstrombegrenzung;MS;08;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Integral;Energieintegral;MS;08;B509;3;0D8000;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;IntegralStartValue;Energieintegral Startwert;MS;08;B509;3;0D7C00;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;MixerPosition;Mischer Position -100 – 100;MS;08;B509;3;0D0E00;1;-;sd;1;sch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;NoiseReductionFactor;Lautstärken Reduktion Faktor;MS;08;B509;3;0D2401;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;NoiseReductionState;Lautstärken Reduktion Status;MS;08;B509;3;0DA901;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Overheating;Überhitzung;MS;08;B509;3;0D8D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;PhaseOrder;Drehfeld Status;MS;08;B509;3;0D5701;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;PhaseState;Phasen Status;MS;08;B509;3;0D8800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;PowerCutOff;EVU Sperrzeit – Stromunterbrechung;MS;08;B509;3;0D1100;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;PumpState;Pumpen Status;MS;08;B509;3;0D1800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RetrurnTempMax;Heizkreis Rücklauftemperatur MAX;MS;08;B509;3;0D7300;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;ReturnTempIntern;T5 interne Rücklauftempertur IST;MS;08;B509;3;0D0A00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;RunTime;Kompressor Laufzeit Summe;MS;08;B509;3;0D9A00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RunTimeHeating;Kompressor Laufzeit Heizung;MS;08;B509;3;0D9B00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RunTimeHotWater;Kompressor Laufzeit Warmwasser;MS;08;B509;3;0D9C00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;ServiceMode;Servicezeit;MS;08;B509;3;0D6600;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;SoftwareState;Software Status;MS;08;B509;3;0DCF00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;SwitchValve;Umschaltventil Heizen = 0 / Warmwasser = 1;MS;08;B509;3;0D1000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;TempOutside;Aussentemperatur;MS;08;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;TempSpreadMax;Zulässige Temperaturspreizung T6 zu T7;MS;08;B509;3;0D6E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Time;Uhrzeit;MS;08;B509;3;0D2800;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Undercooling;Unterkühlung;MS;08;B509;3;0D8E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Weekday;Wochentag;MS;08;B509;3;0D2A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;BrineTempInput;Kalibrierung Quelle Eintritt;MS;08;B509;3;0DCD00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;BrineTempOutput;Kalibrierung Quelle Austritt;MS;08;B509;3;0DC900;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;CompressorTempInput;Kalibrierung Kompressor Eintritt;MS;08;B509;3;0DC600;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;CompressorTempOutput;Kalibrierung Kompressor Austritt;MS;08;B509;3;0DC700;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;FlowTemp;Kalibrierung Vorlauftemperatur VF1;MS;08;B509;3;0DCA00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;FlowTempVF2;Kalibrierung VF2 Temperatur;MS;08;B509;3;0DC500;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;HotWaterTemp;Kalibrierung Warmwassertemperatur;MS;08;B509;3;0DC400;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;OutsideTemp;Kalibrierung Aussentemperatur;MS;08;B509;3;0DC300;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;ReturnTemp;Kalibrierung Rücklauftemperatur RF1;MS;08;B509;3;0DCB00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;TankTempBottom;Kalibrierung Speicher Bodentemperatur;MS;08;B509;3;0D3401;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxcal;TankTempTop;Kalibrierung Speicher Kopftemperatur;MS;08;B509;3;0D3301;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;CommutationState;Zusatzheizung Kommunikationsstatus;MS;08;B509;3;0DB100;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;ElectricHeaterModeHeat;Zusatzheizung für Warmwasser;MS;08;B509;3;0D6300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;ElectricHeaterModeHotWater;Zusatzheizung für Heizung;MS;08;B509;3;0D6400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;ElectricHeaterState;Zusatzheizung Status;MS;08;B509;3;0D5F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;ElectricHeaterType;Zusatzheizung Typ;MS;08;B509;3;0D9200;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;Hysteresis;Zusatzheizung Hysterese;MS;08;B509;3;0D7E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;IntegralStartValue;Zusatzheizung Energieintegral Startwert;MS;08;B509;3;0D7F00;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTime;Zusatzheizung Laufzeit Summe;MS;08;B509;3;0DA100;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTimeHeating;Zusatzheizung Laufzeit Heizung;MS;08;B509;3;0DA200;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTimeHotWater;Zusatzheizung Laufzeit Warmwasser;MS;08;B509;3;0DA300;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;FlowTemp;VF1 Bufferspeicher Kopftemperatur;MS;08;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwxhw;HotWaterTempMax;Warmwasser Termperatur MAX;MS;25;B509;3;0D8200;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;HotWaterTempMin;Warmwasser Termperatur MIN;MS;25;B509;3;0D8300;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;LegionellaProtectionActive;Legionellenfunktion aktivert;MS;25;B509;3;0D4000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;LegionellaProtectionDay;Legionellenfunktion Wochentag;MS;25;B509;3;0D7C01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;LegionellaProtectionTime;Legionellenfunktion Zeitpunkt;MS;25;B509;3;0D6700;2;hh;sd;1;uch;-;h;-;Stunde;mm;sd;2;uch;-;min;-;Minute;;;;;;;;;;;;;;;; +get;vwxhw;OperatingMode;Betriebsart;MS;25;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxhw;ReturnTemp;RF1 Bufferspeicher Bodentemperatur;MS;08;B509;3;0D0700;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwxhw;TankTemp;Speichertemperatur IST;MS;08;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwxhw;TankTypePipe;Speichertyp ist Rohr;MS;25;B509;3;0DCD01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;CoolingOperatingMode;Kühlung Betriebsart;MS;50;B509;3;0D8C01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;DesiredTemp;Solltemperatur;MS;50;B509;3;0D3200;1;-;sd;1;d1c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;DesiredTempLow;Absenktemperatur;MS;50;B509;3;0D3300;1;-;sd;1;d1c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;FloorProtectionTempLimit;Fußbodenschutz Temp > VF2;MS;50;B509;3;0D7B01;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;FloorScreedDryingDay;Estrichtrocknung Tag;MS;50;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;FlowTempDesired;Vorlauftemperatur Soll;MS;50;B509;3;0D4600;1;-;sd;1;d1c;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;HeatingCircuitType;Heizkreistyp;MS;50;B509;3;0D3C00;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;HeatingCurve;Heizkurve;MS;50;B509;3;0D3500;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;OperatingMode;Betriebsart;MS;50;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;50;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;PreHeatingTimeMax;Voraufheizung MAX;MS;50;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;PumpPower;Pumpen Leistung;MS;50;B509;3;0DBA01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;PumpState;Pumpen Status;MS;50;B509;3;0DB901;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods new file mode 100644 index 0000000000000000000000000000000000000000..65cbb4f01498de125aca4102ab9e2774a431e483 GIT binary patch literal 20557 zcmaI71ymhN*Cvd+ySoJ^xVsY|xCfWu?oM!bf;$9vcXti$?h@RmbMO0pGxM)C|Jm!T zuBz^;>Z)ze-gSAyurI~%hwMR`d?I6OGu5kzSzF(u$S00IIE0s{t=B4H?j zx5VX?786!+%Q(+;x5E&>9pXfb2D#oT(FgrO0~&-^Nd3@VI*vOh$MB`KB@ z>DP~9vxinPY*F2fLI!~ro9+jJB8&u!R@iGGb_Iffha3v==f#w_J~L~Xyscwo{Nm-c zhMkvp?ydE~`eFRx{Pu>4p1vL>i0pN26{NR}#FtD(cKhqqTO0RzpBwAS)|t(oe}$gyrn_AsGwVQpMcfqA%%G@)=z2e~iV0QH#Xx zi>Cx$=s$ge-JP?n>R4!TG^3VXh=8^ivQ#F21(XprQSk9VzAZu zbarko>07*Zxof6mG(n5wAyT8+R8~d1mk4I9;C3zE;(WejjL-eD8Ow%T+UEgWUysX< z2R+}nyMlrOY(2LgbTujpif**=Us*I6ic+w?D_y>VRBe^IZHD;d%7%tJ^QFp}pCHw* z*V|k-n`}29HhnK)=~f#oT_3Nu{ro_zIBhr9&{a`nXtotvT3YNvcZXt(+H5yFCsP7O zP^-TDWNUFb|EcwYlPVE{L@2YHaQ$gpp`$$Uut-8tR6UD^m+a7@J!ejsL^z_HXY;wqi zOD~09v)ASni$QA-mX77jy&hQn$J1OWD!JWtVs`e&2z9nji-QTku-(BZ$65@=2;Z9t z&J*ifucsi|_nYEE*_7HSnIzh6XJAp2DGoOW6Y$uK7#J9@cZ=V?pVOuPfmH?Orx)Vz zyg$q0_v}p*c)L|TByXFUnZcQ&S0f!oSMz8ECjE2A)n*0oM6FZ?78dsDst-8{SM^{Y z{a4Om;lJ9%QYq+tJ0l4&)^fgNronO%4ILdE4D9}5-4oz)lg;|d!Zo|)LjOSan_;nh zrpNJYAtA4e)5Thg&)YMgJ4Ds%uJ&6B=^WM`kJ}-cu&|zBYbfo{CuIrL3Ic!v0h_!A z%W)IT3=M~j9P&|Gmq=4IoZb0$zxqkJh|Oy0YKYjkT&v+E+xK0wP$sEq)2B_d&Xm~q z^*TRB;Mb`FQ|IFju<311$F<%s_bGZFutw5>P>4RjWa@hECV1*S zXAOgtCFtAfX6NJMV`@s(et)&ySKS3D!DZ*m#isAa+Za<90s&X-j}h1xj3@L?>a`F+ z$h@w125dX-03|=9Rj=f8z0hg*zGykj@;Ldl&Pwcg#&Y|<8zUHf4o&QJbu^RzNEJ=U z8~h2@6R;PdO!|wJx)(T2rW1Hx4G-(C--LxhSJ5#r`somxY5|Roj6^t4Xod~~U31G= zDpfAl>+mQnEVRH62rLE+4$&H*L24CR`v(Vu0|OP`x`^I`GE;?SSb=6LUx#2a-&R2D z;MeOGkp&(>u<05ZmAS66AmOp94;8Ld4G2VvhlYmgisxB|Rez}*#|XaL4RJ-nrCx54 zJzf|jsT>1uz+4MV*EY`&&b>ch-KCCZI@sz7OeL>2 z+h}($EiFx;`qB%rS8JbIfJDd>bZpui1lvA)bY!mfi4V5Qu880BJ`$I8(D3)I@AEOW zO?zk~DVN(wJY_3%guaz_jUgmI^fra~`)xnELb+ZCUYER=@1tz}dL-H(PmPtzzo zc4qc!>qjz1*5*Tgmd386EaZuN| zlbc|v`kFnc3?%-#DV)XZ`fDsRGFm`mWTd5g_)G-3MBQLm2ef6JD?_p%D9((E+##wTi)iYWuSq*!Z5onyMId)#(QFqFF9~Hqmx};Q z4&d-!rEyp`z@Xi=?9MgxBvCoVP;6q&ND!c`SWXRP@7N;&r{avaTN> z4D=>oJ>JEnRWY9{ni!5FH>fV~ju3GNeE1dX<4yz<^L~vu?owE_^=yH3y9Hq00UIp} z3wUR(HW!9Xmm&RL<7YR3$4|w1_Y83RPft%)o#+w0VeySbxVX!8W>fR?^AqWuF~ovd zwsWsXNK|t})}(Oza+(dk2zo4^vIV^HZamG+OPbGX8-fOOp1EH2UQp*c#dCG=Ww)ur z4SCYxU>hD|1>_S!1qx!&P5kWd!y-+=!FLm7Rgh4_woc8JoOzzEYvH`M?z^zessjq(A4j6H5g zxgk~zXnS|D0+snOMl#-j6C!rsi#uJc%IC&`FI-^JIPAur@$~oiCnY7tS=Y5GcNKbW zM!Jdw{9U+b!NT>5=3(eWA{Oi)b}3?N6_IDIT(sSjv>@ES7|l?}mv-|Ib!T_i-V!kF zm}_eWtMb1zRZ`N@xb3!tc;RHVv{u$y9PQJ-X=tRTq@={g>K6;K1oi5N(TjG*aG+m}F(Ai)SM9&=34}HP;e|3H`ndFKuCR=sFSF|Giw(OZ zB2O@mAF!c?)=h7CB8>C{`fu&b6)Ozc4OCV+%c9(nXm%&{))7>wz7K<947CIvj|LMb_ePu@il|AT#tDp~`L}VV;}-Fb z=pS_{^q{oYS=D%Hc)=)$!4`E7ND_K>LrtXCz#RO|3d{O8hUjm8H@__xdv&V#GMnAGNNEvTdVH0`?KXhmT@(~bjCxL0c}1^ z+wB-?ji832`j8sfxQDub2f{HL)Ruert=L`&)Avv5zeaiF@wxf3ymyzcAf`<hYphSi>>IW6`X2_hFvzGHG6&66G#g3?1KNo~*U4mnp@I9a6vqkJNC5KXe`}vY z>YZ_Gp9Glu=VlqezIp3V{uQ+6X0-oLg$WR8)&F6OiMNgpZZUw4U-O1=m6Vk1o~l%F zVW_V~yxYgs21&zoBCt<(^W+&Wh9-*CaEDm(xF#n9B>xn;02qiu<}h#GXQv-lJ9D?r zEmwf?WPZmdl2XfL%}|xMg)5pkxNuL2ccsva%Y|pi3>Z>}UUA%e?1nGw6K(PV$ewJCP=!UEcHtxO0iY${a;87K$rQ3(jp(aC*i zrOz9I5lOw)R?w|>pc>= zPDZ=NV%r1o{n=V?ugH0Jpk_!xaj`Or1a^3nhUd1P7-SvAYotXMfE9sI9SffY>)&o< zZeoxrSE*zy?mb_D$b5MzKdMIGw3sB45tvRSvSj=xyKJo(zELhoBm=Fe>!5R zlhI-X)%^I^Z?9zAHHDtq-zzdT0;o}zx3(EZ*6-7Sui+B*0)tJ}ooEazjyka*;H*qd zO&uIQH`*g-r>2IkN~g#gA=)=j$B2txY%8VhnYacF{vNUq5v~GAx51>mZ#m> z8lqbYkLEyd284=%f`EHQx|h}T8EEh+(5UTe@Hw)F+CACD`2eDZ-!(>(R>XX6v7W!g z6-P7)2J?y)nY0_NHaop{R(Q~Gf>K)b=zF50*?=rFypT#D#y>N z?#OonV^{%b0^*V34~S#i^ezHf@B%CBobX@MKK*Xo>K5@*iaU-ppl!Ss*_5c+JeUet z6z_I%xe32MH(elPPV|uWhzt<4BYj_-(gE(7v_tZf6q=%(&fdr0;y~K|9LrR@0NU-_ z#bqW)77EWP&y6s4z_Cq(b{J@P8PqFv;snr6J+}Oz3-oI5aDKSwx=3>VZ74rp0Yl=cHB=>E^>6wd?h{{`MkkDUShR#|TYmq=?l^ zV`RfZo@R|#`unh$Civz4J50->KYe~fsvAzSTQ-*s;6_^n7^#RB7U(F6?mO4|3S#K| zZtandcP{|Q7@7+pRwta5Yzl7zb+;8G`AnXq_;@lzv{b*rXhQ7{4`)2SQJl;9A^XK( zZTU4Kk69rRXaJM%_}29G_PU%cf!dY<@wt$YUje(Mn3(<=nJ=y9ctK1=E61w^kbO#p zsH?5rTF@(HPe%p1SqUySEH}R0orQfKlzV*KwXQjn9f~Gwb3Vo5U1Yz3(QQ{IuF`J00F?Xv>5#bnJsY!84Jn(&{$hVDWx0h> zTgv=e-kZSbWFD3%Sbe?0q2Ceqhg-1#5|H*lCm_fGk|OtY4Gv`FoKOiv)7X5$rx{L=zoT?X#`u(RQd_d z%MD*|kE2GyG&eLy%=Hf!{<5Qg8VJC75Y81$s$x##lasN~(Qkl+*={2VH#hEs$64h9 z5*N|X)fksuheIn? zinjqf1`h{!<@{MS%sL;_5OaBX`Ro<|i!Mjgp!YhRUdx6P3=uW`K1v1=s+8}*j0O^l zim@7=A|haPSa0ON&VjUC{5%mJ-YD|q=xA>-&a9ZF?x{x1&W~rVsRMje)Sl0X$V7Y^ ziNEZ<8ovMbxI6jb2nfkoQz30{U*Ga^>g5%xj1W_<+=#q(IA2Dy#az*mf?K=>@071q zO>~cr^`gxA6}1m@d2cb0YQ?NzC($d3xv}a@_Dl<=Eamz98BHMN=T9K{eQ>=ybYsmX z`73~$779o&Th11Y9A^7o7%OeRlrzf~Fq#a=eCI_MZ%}G84>ad)T2KTq$YkAvVotPS~7lRK(M`z z3G7AO5-}9m&*b=JFWh()LQG7PGKm_vEG-;Su+{ERPavCpjG@bFI+^hax4Y^3)C3<0 zHS<=Yo3u(ZiLDMJm@$C0D06H&^snC9YpvyZvD9Ztry>EmFMMlXg;C270RUTjiD8Zi zpK}W-V%PGRQ@G_LbPbv}>vmux1s=2QQD=t;Pj|8SN%496DnfnnA0|E`BVq*r47-R~ z%iy8aX!~xa6Lf1o^xRw-i+HmoogD9rKg2W&{lUs8^6UodbZ4(E(pZm%^0Dexx^iR! z0KyXBaS_V@aYlO|psI?F)KjMNsK7}Ih_tx8Sfz-5z`v(7FfcIxoc#Q~^WP5wP;fMH zaOkCdAt>(RmyC|!A;UX491w%|d5EBf)A zz;c1IC{GaUz?mrkntXd+`&|E0;q~r=TeAQbR50u*f4DVm0gB9A;I-g*F_?1hI{EUR z?wBEO0iqWwj0UQ14J&i}skSi1@p!+FpBi;dl&tiYD@@3P_KF!wkN&37%+u27DSFTXM4qgrmI9-Hs z&0pMMWMRe{Nh&r9@9-v=YQFEV6f7Eyd?^ho@|&B2nQ@OR#x)T11hRb|x24wvodFveCQV%AR=o$G;cT~A3jbgXu{s^fhXesYlW_SQ0~<)qr^ zteZkxE51(-pE-Lzf=01!ZK$uf_Yj;z5yWAC8o2oItk31!JnYSPcWQ->V#cl9QS6Y* zRrv+A($yIDXM@vZn$qWd8=DH7%_Mj%GY^n^R;+B2h5KluGwQqZtZ0nS!2+Lryrwc0>(7f8QGRk29D5sQ(+~W zT^(|-kO9aPl&>7y{xVYH)F!>tB+<(!@&S)R7%bTgAv{79(;38u81S*ngE;CIOnSl7UEf#LUn{k;xZTA84upaaN(j6fw0>4*G^ZLQQ6Y?4#zmWiLcH0 zGC*Wigmj54>bF(Y&LLzP<|s@8>hc#x_@;)bIf6tr!n~O@RP>IZ~kyAU9Y%V-s3+F@iH0Bd3JxIa^ve!p;V7_QeW7Y5PRT&QHoK~; zuWr8Cf^W9uk{R-O)u}Es+H$iwwG8!6rdNE^GAn#u__p~zHPyau%IJM=&xvGCBg=?f z_!a?TxrXXVj}wdRY_EZK$zAdGnp7+nZ?_ zoyq0hq`*83LC)OxPKZ_Wr8+SR1Y>l)A`lvGP>j*JDQ#>elgo#ah`MEW^dCa!>Tk33^Xf~ znb2h2u{|iT|NqZg(><9Tdkrk6ygVY@v@{1iz4ecA8+$B1f-uf3SFKeh3)w< zXdP1IX6t1Yl!zeFIM;Z^P}~vO2Q3X-kpi$CEc-re8WyY@0Yvt-xW=} z(O!?+61)kB*1vO8R{9GmV_JP~?+*1$Ax=BtgDN~^lg627naP%pk@R(UShL#&YswbL8!9NnTg10+ ztqc=nJ`Z{)Zi(!&U6^NyNOi)N#w)1#gp{_yGL$vMZ*kdmqr{GDO!Y)(# z4fj>hsA7yRAw6oGpdR$s;@vLE8eTScN6ox)HaKSd%&^7HqIy95=`5z|x8TailZ9Qn zXrxP4g@@Gr^Jkw4M5ud(v>X1_Uz*Em%Nwg@RCN`}N!Bl`QKLSeS6%9AD{4BlWgj>0 zKbPCyNqkI!ell!q^^mU5bmE2Q8ea?pi%S8tCVLr+0YrOi@7eWtbXo1^V$3Q{V(fx|$ zK#6>aXOXGNx5-1{7MrATKa0;fTRp+h3bdiBfak2?YP zG-;_-E~tV(+i813kPgsbc|Fc@zWQJsjndAd7A$(t{^Z+`hqaNe-<7vU3_Yr@-kWQz z)b5io9&KNiEiny=;M5jOg8neQeU4O?AmmxXsqt*6Q97O&_3da8Ba`S&aru7Pq+l!A zhHdL~EE|+)TUya>bw(GOV$N(Jtnrb-4ijv%+{QLuM{!DfR76Md3~FG_>hT+S@@Dyg?~lUUyv^S`h5>6&!fBOCg_G8K z^JC^^zS=bNzcEi}#m|1hIiusNh~jYya~~^tl-EB#swtKnLwE~xP(Vy)1n3lQ_WY?z z2-YL*ns9m#A@fQfkzMFD)G4$Dqco{4`267aTA-~s9Fc_eoyT=T3;Vk;@8EZy#mN<( z<%JwOtto!C6H+X~EiWFl+p|Vqroqk_7ajY{3;RKF1;rh4U77vW?2tH|zz@loYes-LqWs9uJt`wRG>O2Z5N=9@xXCs|q z&XrBC0_%Ae{r4|EdbwLT>|-kj_UT7R?Bh;{hG{p3*XtCE)@yCuj;S-$a7DN~;*Hv` z-wLV}z&PR8oZ@_P?r)O=9uC(OrXt)7f3`00^*Omcx;gM(8)?P6^8XSq*EcX5!&NxW zu2azcc6r?KHZrs7yMg=mbTc{kVrm+8nm|+A8{1vii$HYb1;dewCPrxaYs9u|S$|;Q z>&-9}uYmVweR1vvT_qVPaBUGPMmN zi2~W@%g+lrioWQK{J^}VL`oxU5I;AfdfvHBPCbo0O=hD#K4+dU!C~&#$&cRv&NgKF zvLqKh_=;bZ=r(UZTN$ z4#PA99ewu0d}to$K67ca(j}3w{Xb4Mq~jylOvA%=^e` zk5#MX+k>ps`Zs#X+&znN#4cFSyoK0WOCyGAqhP_%ff}fOC!t4CGdl*8K4o%fQ@i@D z#J)A;pN^%bqW`6)M&eDH34$FJ>F0YL4{D9)Ia`ZD6{HE29N4;_P5ku4`>&&-R+M!L zC$;h-*poC1#BfnA+?Uvu&M?xN+bDbYHl0SWrm9f?xS(-^Q89J%J|juCNV!O?)fu7! zU*hF^X-ft-`b5^_HgLL){^h==N`)x42ozgL6x)eTJ^tTNu*C!E#V?h^=V;%4mgJ+@ zqu9fW={TE^Au)c3X%;6+PlMt4k$@-v-EI=&uwVEx)$!Z;6IuuZ77k32{701cGzn1% z;URh0>OK4{PQV@fH-uvdV_i!2Zrn!erN`5II-oYT)pX> z;b#YZHR#l32vh8K+uk{&!8f)XrbBX*xX3RMR$zU82C&R$S2#FO2%@0{h`+BCNEl+( zuBA>hX$eh-bP^A{_jSHvab4214ZUJ?t1nzR!##p|fp%Jz1p6^{tM_clDn<+vF|}L` z6{#O|2gKfwi-TnHE1{8_5CI7i3bbBEFG;js;g%eZyjA?wGwxbj?#tv~Sm$rV&a9iLWFd1D{tvlc6OtO}LKn+K1 z1YKQHM2wS%z1|Xsptq#zH#fH?)x|K#iPGnR*Y)LrN{iE(c%!nj$4P^$W8bS;_Pg;bHE`1O*4|K-Q zoWA@Q$?6Wo7fN-293BC6pr!UB5JDn>jt%UoG!%~3g^y9q__UBFqv$&-;#|U}Pw}t#kE&7> zNQyk01?r_Oh)@({vw*`MJ2HV$6in5rYgw`z=Pn3~JQo)UEn|u;Yu2A=+(BBn;z-82 z#JX@xwIw00iLMC$hxXSggjOnQa{TK9>**5fwZ9Gwu+RSQcA4Oqv9mvNw^ z1q~MzE6;we2-1xyXR0UVfz2^WM}7(VtZrRR_5RG3m?&<)B>c!uLXAAkEik}i9a3H+{y{HgXfbG#*a^xz&-szaV~)AhgM&o1dT* zukjn#Z>3a?X?Bfme=Q>+-VRcJ#!v!@uPfbVDJpIhM-9hLR|Sa7AZV*3XmppPrf4h) zQ~LCCTA`^UxU49wX`ZMgrk|(uEGjzYuw?N2<;YBHxkN4+C3{1!ui_s$onnvrvBVd7 zI>f@!&0AmD*GC=Ngy;TCfA?apq9)$IC=j6ZUyuTqt7JQjQ@iG5wI=Oz_!k8JhsN5Z z{R*^=NWrC{0pe7Jhv?`k#tx7@kr@j=BI)K;loO>4OV2G zbfmJlU-xQO+CdIiMuL5i&?@INF)m5w9~bUYUuSmAKj9iI@>$lA-C=1+DBGYg$TX1& zxPPyHLFu!yTAiP?jMPe+kojb`9Ab6vSR-6+{Dp2*YRmVXkp6*ZOC!K& zL~Z=L4B1|xz_iGg1JuG@X?FmvP*vp6ZM46h5K|8JH2e|d?dRvE!?WaYcp?^Us6UgM zdoHDRgB;w2GA(DX50@Wyw9>r7vDm|Ol zSdeh68x2ZJg-(8N^LQ-&#i&cg!h~p* z;C;ps59Vk62Z2OH$&Z>;ObQNUoEE}V*GXDT5PnLGvGR8FAuMN|*rHS4t^j^!A6#A-Om(RRKe*JbtHROhoxq$Y<12JD3`a4 zK3?|*r#1&O2#8f6NV!)tEl3$7gg&h2%Wt+X&*%_={yhsndrT*!zQLoRsjXz$?}Sw6 z!jR!fP@%mo&rtjWVq`4O!x|Njj5n~#558pZd!0U09k4HKseUuk#0Id41}fv#Uk^b3 zTbYYEDHcCSnq#*+$X*d3SQQ;36IvvjTjwOZs_#`U)-=gWoG6rf7(cb)thRMST-TKl zJk1m&n%vonz=@b;A^DQIV+j3+x{bD2u2R{v(cG-a-6F@Te(9G>y>lQBccP)*N@Ju| zqsT!~$@Us+G~fdT@Py@?PyQot6UJX?ZRVd2*Xj(L9gL$7nDL)|yBDE)7T*Q_YDLS0 z#0->Ux<7||E~4$20P4N*4k3Qf9s@`QAIRY&f**Ldzbou5_>lbdaq(2aY6r!86z18D zEJ};+&KN$P%mH#hmibY;{pjT6ykGi?eog`i7H9;T{?|eTdN8b>OYlGbo5e7D`NbB# z(I)+8II}#Fn9D)4TWj`Lh>ujDn~CZil|ODjSw?V4WyhOYi#;c^b%knjY+#&NZF%#Mo|=e!R!b3E0;Izr3Vv9+s$ zKMwJ-EQed!Q=B0)vB9W4vJe{alJu!6)`g$#0xG)+P*Kzm`c(&>T}dj_;2wWH)2_Pt zR~oA^WA8xv@wnv3YbC?*)9Ormn@Ywvf4e=QTU{~ncAakk8L`L>~j7P#EYRp}PcCbcqP<27gd2)#j zMqNt6cWLkj_l^fWqqR*LQ#1FYGZfD-Y-IUK-O5_OU4xpHW|kdvB^P8i$pW^W7HdEE z`GWj%HD^bF<>V_UAv9r1UG!>T^#7*1T!n!DRA2m~cjFj7ITY`u-&`rE`no{PD2iGy z8r!6VGn#xRQ}1(f2#pOGALE1aGWm>*sub%M!N&o=m~w&wiiB1h71XKZaUREu4{}7O z9*HgkRt~yg9LXNiji>(w@EFU+>Xo_l_qDziv1?kv;8uQ(|2- zA|B6Vm}#9_hr0$&!soe7a(QIPLQtEjwJ*2@Kp*@(nfo@Aao>p}KVuy{1lG{&mrvEy zgVrML!o)%jkAl|X`Oynuk-!5LFyl1uKSo3drpxvQ{+y?M{Wxy*AllqL3!`ey5LTd# zAliNm-B|i#P)!RM);$e?KMQF@64K6Ln8q@PuZLXu{IX{zaA`R?8dJ^KawWZ%oZ#$} zImQakkAwpsnG{sRjEfuzIS6LtU(>BYXIMT~XO*6)InGnYQvqwVJUtLt#SvB&+Xw3f z*$MW|zp7h3IQx|_<(q15sMnjuw=kGzitv)yZhCz+`P7Emq;o$_pp3-~pW0BGddHoN zdSl+1=!`?x3n#2WQr-?z2Gt8@;9o7I0fcDD%hVqtm@`37U@*y2QXev^(p)_@QMQ{hRE7ENe zyf^6}+%4oYnD<|+-^mfw`A0#UxrfQv9L#@TTz_~P0u0>Wzx(VdQAl4CU85=6qRR2$ z#^(=Y@FBnVv+c{D@*RSKa}G?@WHZn>O(Em`q$nvhY_i&*Yw0qJ#DchkTq(t53kI=* z_efk>iIem!^z7IQrHu-cYIwPC5U7acHr;5vKZ9;B$yWgsO--&%WB=I}UhRfzlBmn>6~V(q==v&RLNB7NMCR?Dg?21updOkb<>+CwCpHS^K6<4~PCcu9 z($gQqp7H3PAvGKplp)n}N&>Hn%|heLXx z!ipAGh2TG=v+)H?Wev{~yMzm%W;0s(^A`OMtHWqHidEeygE*(oE5_h;B59&Hi89}l zKO@($2LoiYFmV!p!*(h1@d)-Y)}98$aqsb#Dh>^7(>GzGW<6T$>jlU1CE3d_kdSYw z0Vl&qU~piN{sBV514TLLcr3#FtoirH6BZ7elH=^v)YNCC2JGbe3O-A_s?3VnJ~^E^ z?)NO46tU6(4LEt`=vQuhM?=-w+z6nZ$AT;Ukz-9hpShL*c_hRn?psk8Vicx+@Qie zxWHBq3TD9xvT!4;S-B03sjnWdP5ut5i4M}WN|ey&cW<7YUro90Hz`M09PmieGdQB+ zUS-8^FWwS;z8tAeBR>>&?o~Q52qR5InGhgWNFY|$p}|1?nV*~1j)+NMQ0h5QZljT? zHvVQr_F&=e5>_7li&`~SiH)ZoL_jH_tz^!}cIc8KV|!(Ry3BbPwWD?6Qp zne_AVq}eQ-4bJX*gXi@PJNY)rdM%@}wHHqs5Qy)Z*s?qk%O$oj!E6ialQE+f<%3T6 znc{9u{m9ApZ^nW@;%;f^DUoHATDwqksiMxyB!2%64hz!90o!-d&8&~ZJRbbLdAu8JL@*iL!qhvYw9zcXtd)Z3^iG$;cI~Q*De+8V z4b@NTuIgrLg|$J_zuzv~H>}!S?*>OVq>V23)#GosRkl@A+&jPjEUx?ge9W*L@!hB$ zt>YXPPdqYYX3vG_tDtnjB&9)!#0@8JjJkW>-OFVNDe@&4kz^NVTjJ=ZLbT6E2cM6e zbWl8G-;GTF%`M@k)hDq{f%0~u*XEK$iz?4b%AtnLbXotx(BR$#b$WO5{-Ei}^7;JzKMlgwATsj+D%=fdr+lQteWL zkGq3(7wi1*`~MsUtET->dh>eu_uZj!IC7 zStUUkxO~IFYEws8(xaA$R{!-YOYJ+dc4^bF|8gRhD1=+4&&!UlMdO4)Ox9CJ+7S3+ z%%MDW)mD40X^4i*S1<{U(sBEcPJZ7(?b{`rY$6##>Ru)%td1l-5OVn8drRBNFOz2cmu`_NVWLlT{^HITk6B5dDhFFNT`E^;q zHWKC7brsl@VqFpMiuuV%q}_C|)D}%JRX+U?eV^0KI7i0kEWrX3wPa+?nh8q>(XX;S zw$gNyqin_XD~W8Y^Tq=Q6(p*m*fA!TMVb@p&lb2J-%cw;Ua|1J`rdO>{*3Dp#UR@U zAXh@3CyRP2 zdU{Lv{O11Qt$i^@)&h1W2eg@&n(Yhp7C{vRI&QZTM+SSy60AQ%awv%wAepbkcq#6`QAtF z^!IJ&o35v>ApGEPX`l9<_xZSw@Tv0FdD{oATFi<{Mrv#Vg;VC2{^p%HE_KMPX&M!? z!hw{6L#0=XVBi;T@}0>(NMyr8vq-PDw3g0_dHEu;d5u?`snp6$M*A2(d(X_Ye}6+B z!L>H?6T^%}%M0F^i;uLIca$?eG^$(&IHR5y)9dcn)dGupw#aoG*Shr0ttIyI0Yii8 zg#d%LoQTGnsS<)!A%VOE%3xz=WMk~w8ET!T1TZhdZ zO%bhhl=jz}zA+(4s6>B@BBYq7D6CHBBeK7qX$Mc*hU&+E zo2tc~EDl_-J3Zt^BIZ5}dy26k-(2K!hcG%CWL`P?D#u47&mWIt@+IhJWB~d4bv#Be zn0Ci?`H`}JFVS9WKmam-PscommVsl)WM*xF7G*{kZI}IfbHCCTtwoK zgx8jBh9|%F?aS<#kixNo7`>m+jG-JG+tcE6f`Y90ziE8$VolK8MZVTZ6=hBpxd^e1 z`9kWIcp8N3%uZeFFntOAvn;)dMp1yb;Ya&cw$&#H9{ud;_n9rpu~G?j!1bg(jZrM@d}2lHmig zYMZOt%-fyjo1Xh{i?QDtGQ_YUjnFgnpfad&E*X7>96hDlH-x%Y6TQse3^(Hj2D2ar zP()xTmSm?;Px){p3$|+MQu$11G6RrGJCnDSb)P?eW!Ld=w188D!_0|(@&xU~y;KW! z4a=ynD~PU(-PqyJVZY z&-Umq2CeLydv`e{rb|I{+zwHRS&6FqgGp}!YB^);1esn)&8tVW?gQFMV5-1Ut*!@% ze8ZN#m9KH)J4otuNk1TuXRp5DB;}HDba!qQ9V#2Y?>KMw)m|)Lfa}0`c1O$@gTi9k zwH@lYq>bmu&^+|34VAuDc7}FBDuuR>rDe)lct*TVyyjbBZUU}*3w}?AH%CeNf`L`` zGk~JBM`6t(bOy#K{Ky_No12U}hRx+<@pW94A&7?>W)27*>oyrpt18qJO}@knJ|Bb& z%H)WM(z?Rb{P~R*r+(cOH93fIn{(USW0JFO_SoBtun29aU^FllC%9YTXk#!&u4UXu z^z`ei6nC_zIdmf5tWm&HH}DVe3`u6eQE==2dMc~Hr#IsBrJTN>I z{lc$q_q`v6-sz!9UF|Y#7&Mam0cmUwm>RGx&{Q7C0{^<{0iNFlbLLwqZg!1Ap?QiH z4SK*R4>E!M5$kr&!3t&>@uBM9;yD6n;OiUJv+Ff)v?j`z<<;zw`k>JJI`A8faZVtH zPXS@#^l;iXU*^qSk~z!0CLY|7~XeGMwbDkF*}XIjScWhV;DhvhQh_GEDe z&G{IpX=0K7lhh@0OJp>2Qkcc|(crkn7vo~t<%?E!65NlH_5z?e%j&o6fhLkX?XwoE z0-F+g@$uWUlK8SFVWX&5u7qn<)U}ud%JC6FOz^Hq!cFOw4~P1s_?=GAgJwzAjfHd7 zp5};|#pJzHp>$otHyIL^roHZpF_GG8AKlK2)}A%Ja{T3YFdl{EXQ7g~#Nz`NHluw) zb&$gVgKyI^lkZci%gRA5gPB9(Uq06>4Cl+UB?OQ$;x6{_7xW2EDi0JB&kPfjX|~V1 z7MFJ!`SsciLAC_B^q(g4!kc}A391nn4&ls&pT^|{V90%P{`fsHgY-4B5qEy;ZV6_v zm1UY2&6dV=^hng(W~S)_xrV^ofM-gFz%@cy)iR3a)agmLk(Ppc$=f%4(nOmo*Qt?y zYaTES$MQR5K*Lg-v^l{CIU>9T2h2g%W!N`n;ovp(oLggCRY4kYS>{2(ClvqhXgV z+ld9pG}C;)wZZVTBs|VW7tK#hqX1VW%?Y-bkbHPwWw!pn@17q}2DH~obt{YTD35~; z?SJt&NM^d!OevXu8eP18@;D;q@~3IN!!mi>Sz9K-l_EXqg8ROnof2hVSxIDA?mQ)% zq0eKFY}m5NK^U>m zlQ|W@T9QS=+_9eKI=WhN)#D;#8cNE++H+icr(hk@YsZ}s3BS6e$Qwd1j2`zVSn5`9 zrnKIYsOsL~CF8G(Ud|}D)J+K=93xmCTxMKb8NqM^*=KA)uWPD=xff-H7%23!r%4w3 zh!4wMeHl@L&RauSRy9`lyjEAocyg%2SJ=J;qN6j4a?-ZFGUv;pJHfK3WC~6<;_7bS zh7Y7&_Ew&D-d@jQV;jV51~3`xlpL`I3$?)Cwowfm{t(!SGCWx&hImD?QTv3q!Kjce zzC0dr)01;$CtS=h_;JxB6{@1;w=ivCwYoN8Tly6(y#sADrHhIM>g#H_Ap0B8i7c8e z)v!h(O$3Em zWioO%yxucK@X9@n8FK_A_j?4yxn_=AJPFfpyW~L)DLlz?><4gJ9Q&Xcxu>%iQ;u&4 zS;pjpLl?qb98*cr!LMB&fi5{t=o2awVP+2;h^M9sx{FfAPA=d+_I0OB2p(g9HokN3 zzdrVHtqAV69?p&qUfzP9_KtnXK95Kts;Eu5I}ZJCl^_6sC#a{%CI5wZv>5>MDT^BO z9D%%MSX{B1Ke|w@Av%j_$o^={+#O$6_R?6)j+d)P3-)-0Pv)6mQ^}OfB-~q`Ey(-jU4B`Z}GW>Dz|VFCToI@3Ltf zi7b?}`I8SZ@D>wGUi!i6U2E-zMdWNy8Z2PLF2HA`b8D6()h0(|1G@T5*8gPbtKh&1 z<9tnnubP`uf05H+(o(}GRujz{+~aH5hYbU;xl-hR=1M%+$EOPSaCCO^@%&4@%S!}e zYiH-+=72qfdqV7dJU##Z(VGC9auMS)WjvhT7S4W@@%nb|+nN=-Iq%ll-PXy$3!>ue z?QVP13-a^)jTQ^mQ#V!?(AL+0{1aPjYF=fmk`#rnwyt+a>(I5&l_cku^W8e{3VyzR* z;7vfaRzEbVP#ixMmtv@?iV(}fD@Lzo;2ptq@a&IUt@1MjF$rNMW{@nt*>`dcj}=*K z##FbS>qXzrHP~0Gp2KSu6=1#O-Cq1YSKQ*wC`+I}H9y?v$`wXks4O0x3nKMnbre*r zA30yodkJy7_^FMCfl&zEFBiOKC|=79$aa$xUo#4zt4-)0IbclyhV^wQ$0f3`C`Nke zE{1&Wpr|l`)=Oj9FM9AF5Gw09R01f+60W0Dwl`%zvre#D188$NyXT8r)ib(HSG!DW zzvAQKqk^_auwlclPKb-o1$-L3pNqGhjo7J_+j-P^dA3uOF?RQ7Vr}2Od~Y8*+gpI+ z?5Q1MW#7&=6P-t%E#csL4^D0W@(-N|=YeOd1%J)ke~>+L*x~+N?>Ub;``W=(5>72c z;cQ*uJnk&tejMPPD?h%X&LeSm_)aMtA5ZO-&cA8&6Lx-g`dz5+)CnFQj*X`V)cv>9 pe{u8M#Q7e)vy%$P&QmkPI{Uv|HP8VN;VvV?EauOy>Mq+>mu=hbvTdWwwr$(CZG3q@&x`M!S+fSer_Rciu`)v$ zabll+_7x>B1qy}=1Ox>H1mx)`6lC=?oE}j8=k?D=*5=m6PVRQb`gV3!=7#!C=C(Er zE;dH=w)&3dj`X&6#x_Q_hR)W;Hcs@8b`Hk+Mvi92#!mA8qfaA$yL~5OAfSI+|3l+(^qw_rzr!Jq_cqL_vtK%l@41<2=a(G{_%*l z`0+^iKPoJVyx6Z6_QWzaby`l{Y{z6CZ+sZh6l$pHoiD`Vd`J3t9aA?cDd}#uJB_XW z9MchRtm=6uImU~AY16o$T5)l7q*1NQtamg*n2z83uH9cJ)+w@RJbm1GW7tC5YCw-y zK8HS_ldo}U&!u5fV94P!^u&Jp7-?0n3%oXk^{$tAALqLaw0QoyPTgYR(1ejFb4DT_ zhU{Eya{USr$;?7}r~18t^SrgV&u6e+keVVOu2>l%-=xv$mrcOMg`vKuzPCUB&Q8YH z_8fCro=ri4`G<6|4Qe_b#bp{#JwKA*y~F?^@3RD)Ni!Msktze3VA=daF)+4J1EaUv z#*xF-)%2KHid!n$_x3_ULj&96_}e30D_7j!l1QSFUhuJ}Y7b~*b+tBRau*cai9n-B zq5Y31N3%56!ga>xl3=`rHrPGrjaGy!_;)&;r(S_prD*f?(7z{f1i90ioH{Ax)A@3L zy>*S_`~0hH9c4Y)@OV87!d&P-+e+2@6d+V(``jWVR#-oH zx*Q*E%e&fMo_YKO`y^G%N^tyh_AK?!%JA1+2M4E=eV}hEHL6o=#)_6X`-f0<<8_RwthU=(-6|fg z4!>!KaB}du$gh37YSmq!?f&Zi4zv*`S#0a+Puzz8TR?2tbP-3P3k(=n*2+U##fse4KY$J*k_Bs}ri$&8JrFD0 zEoJED#$7Uhd)@zg11~PA1d2{2!`aDE>HQMx90<3xBa#|oAfVt zS58vNM9&95(uU9DuMi{GwyD1BOY~(~e2>?U(s~vHzTswiq3xY*f{l%toC@5Tr$%n~ zMxrQX%P(sP7G>+T+pi=RXD+a6{H-d7es=XpIweKj&Vg?lruT>>>X_~j4hHhUO?!R7 z^4zcCd~;tMU0o@ak~_t}-HF^PqJ6zCJM;XtSqNrTtbA?8n(*`2_UL{p@2w1$7M*w! zF~EO1Io_R=x(uE+@obt_cB_e}qQB{2*X`}Yl&rn%p8Bjfj2+FOcwB}vFVwiVWl8O& z`dsr&k;@5tlbVh1YB@*sK3^aOG(pEWaZ)y_jX#XX-{^doy4dGZL)o`E|Icw_`#&{A zkNN1{ho5N}J{y`t)k^92RS%@|Wd$CO8-XxR2A+~qVlL^F`~Kdq6qW3^$^I_FVZMJx zoamU;3-0kpslwgf<~+G?u{;LxIGCv@=6<~^$T>LG{IR}lh=9hRO=LPZ>8|Xn1Cve4 zTeeM>$TKS!7IROlwyFVeopj%fUf2<^vK0V24F2XlY8OeuZfat{&#?1n3YP%1vaCG} z>x%owU-g1V?7ch2)LQXzv`boCU)N+VqKC<~^db$AG2C=4eGUx&y$*SL_Sa1W(;Gal zM(uLP7nz@7o3|@}U?LTy18BUx&g%fjS~BsreA&3BzTObwNQ_ri<@^SGI-X!-&{x>) zbOoVX=j~@iZQ20%5GDC4?|lp#NV`e}#>>f5(k08+isKjr;PjbH#CTPdE$zZ&H{#r~ zeQ^-n{PnfcU3@^$HDY2)~Nsc10gF5&y$hQ$>kP{lb%tO zNn&_5!k~$^)8&rv&$|8tv8m}W{scnSql%}=x2tj4lJ-pd(n~j4HTDwqi|?~B8OH<| z@B9AInZNdGcFyyGeD(NeBlpjo5~UW8J$?Wlt+G!&R5o>HWe{)yMp;s;lp8!d!TCHl zAM;OAsu~a;w9)}VN~zT0qj48}9|U*0vek4f{+$(HqGadK!uC%K>#_ZoG8ryCQ0?`S z!ToZ!Yo}*HEA;zBx!)RW!w`?M5(`uF7-E_mGWgwz|E@=^j;74aXo%gDu?}vxc3Z>XvJ!b*N?+f7HBWsE zYvnM#pSy9{eInTYk4NlA(zb^2(kK8 zjf^6%ZHYad-MYa=YIdz1-}MC;zN4ea-pdcckax?8feZ zR;a;6rQ79oz17+M{q;^RlkWAjYFZ?f;&ZbjAS^tvtm})1hxhq*UOk=8R_^=#Rnh~E zN-1BX*K57rB(VKgHcQaj8!$x_3R$n`O;=uC-ZXNjlbJlJ6nZ=^my1o;?LmJX9UXsv zf6u22fx#G9uh+wr+uPgzU^p6u{DA_o7<78Amz3@gaIt>|85t^+NSGnq*$)7RfySVp zxKBt=_qf^VH5d#Z92l5LW!f*V?kZC#7T2y+4%@Bc>74r*C_j(5ATjHxm?WBSPen;LH_l(}gAsqL%N-uiRFun4 z%Jte+%2h{4M@^VxVE29Fh(&C+I!@2eEk|2^Oy;yZ5-qO%pl27A#pIJoWdwG{UsF|f z!z{|f34g+{Fg)`wEK?~rVU}f`Kl#a@g^!PK_FNkUoQCQ5Xg{6B6~YBZ$F;6rYcLoL zhXVl#Ssyc=!eB}i2j`P3;4=fYqXhy2BG19)VwdI}YhevK`3rkqty)Jw(=3{YhiARf zlEZq9)yWQr%>rz&Lc1M3OU(>^a{~s0p4;c+Ws)Om=~Dy}w0DL5OxCPcC2XRH`|WH5;>nO^qw>UoDtw`$4#wd`>O;)(Evw?gB1)q z*GMQXGVGj8OiT;C#Ud$; z%|EUeD@Zsvo&ZNqqEY+0=|^bs@95|#mQD*;A6Z}LqNlgn?F)(_;6u-n`yk+Uvnv+e zo6O)C)We|H+KE%H*2zjsZehOdZsy(rT@#smT|KIQv!pdUwbYDqu98On157 z%pji&6fIap^Q$NnE+|?Y;N%$i_|bO*zF)P1LC^-s8637p+0>Gt7(dc*nG6O#-=Ezv z6ANu@nr$}2d&Dt{{6U5#!kENFMeFVul!_ylG<|OOz~9k{WXh;bTO5z!H5d=j$$DJ3 z+MLhV8ZBEk6nC5!tJLes2?_o9W<*7JOeQcy_rK1_PT&e6qUIY!x_Mx#Y7C634i9aH2+4kv?7)4 z9T2xG{f#*~$2wJ3Rd2x@tn2%UW;|$Pn~8Tv?i2B81}u*v#9>x(gXGHmO-bf2)yJc9 zMPgR3KM84qV65(6FikNy5v8jg**)pL)?nW60o9ViC@LuPhdTHXkx)up!Bf1=!XEqN z$BteX1|2puo(MWNHnn#V%z5-imv_6>>ch6ZvA3xfnij+Yhgy}EfN}|%@Nqo=HBBOg zsZue+$h@ikI?XHAv67M6Dq-wna^kRCVRG2uwnxn>?vtduT_xuGXZ&)e2Fbk=E{OCe z(eV0GkQ8)){!L!QcyURmox17|jR_v@q8px;)XiqQx}-+n82PYW>Hey?5r}QEP@>T8 zav3jJT#kOJAucZ7?el4ukzd-UBCr|OgvkTzgkMx%mr;~+zOB#*z4O|08TNGjzGjuW~ z<#7MNDtKh$b!%q+ltiu~N_(pU(_nw>Ul1pga+#cQzQPPz=k1bdf3oG1G+;;q((zMJ zLUKtJfX{~}_7XdcXU8YWF19*xc=(^7hXI)E^Lof9)mG3nmcz$~O2+1QTK0Hzvm?YV zYhXa!7TKmNQ6n|Q=a7Kt&8%h8rF-smwcX7(uOvuD2fiPddq3$Ko?HwDL8B3&a$bQw z(DT#f0&`n*JX!~u-6=~kc;z}ieuo2MI*dJGjghul-U4u<2SfbYn9j4^Y(O1^X{fIR z#IzD|gS*!XoU*+t0oX0T<#ZxnU;KH#$_2APQ?fh2Q{n@g{R5FYzhI5eDE4069%^fA ztHScSkCLg8MpI$Mn9!#l5EO*Y`LRQmo#SOZcB0c+EqU=-Y|6yZC%xJMaVheEKbb*S z=R@^Q0q^c8uyLe5PBrP)Rs>}spC9dqbz z8{f^qAphjk!^6V?Wqo?O+WY-!4ot5yjPA96A|rOfjwuHaP(F_`Y~8{eEti+F2_2Pq zxVZxY0^9@v_zB=n6#$5kl!TUzRq0p!VJC%E8hTum5&lmY6LlaYD^GT>r_*TQbiX5I z@uc;bHxog?T~>MUNuk#sldL63(MBwXAHPk4>`^t2(z<0-W1asL!QWlNTLQ1eMR^eClER*hLu z0v40Vlh1H+_QLH(OSMZdJ(jN;qu_`T=}b-}6)HIeZmv<8B;;S7PqYzAticUw`p5L{ zYw+zrg=-Z(xZJq< z2wDK>;$et*bnStEfh&zixA9owE;;){Sr$+QTdngwRT^Lk06;`vT;j>;sFWxEfZ`?y z0DUo1K)m}0+GTSpU5mLSFvYW*KpB8bm)INN3q|%JB6z8NsY%nS@*$&r0uDa0-8Q)$ z41HJfO#u`2`nVll8*$!L-pKbt_!D|Y&>45TKU_e6eAQ-SqG76cDO?9qnp^|?pw5Kd zZyg-<1BINE2B%P?4`Swf_xj-{(!aE)H7nsf=g7r?e+g1c>;n>gNJvNktf?85Y&_~h zW)~=HgfovawtqEXQ7vP8POAB#SZQsx{JZIY|Gv1^1{0KK(O}S<%ql?H5@!y3ye;Au z^LObGi|vnue;l1_K2?89a?x4$N5+3kT$VVswY4WiH)Puy%{Dw%D~!h`ryQa4s@g8O z>uLQgA{nga#8ssUo+D#g;(uvf+MUl;wb&xnbv-W|8yXtwjK}LFoY%4dd>$QP;;BtF zsnPdR=&p0AQj_BAhGI;^6GJVn-xc0?C5tp% z-4=_R`R_4y77i`hc~yXO!-m6^!Ij)ANX;4(caa8J+A%}<6UYXpi( z=rfbRIM;wYV6)Yc0xbM{g?)u;??ol0NW`z`XL$m-40HVob4WEZ?WE+QEP5k3l4Fr6 zr~v|SQ1DyQyG}{-KycwA4Do9Cfu{uDhxsHL%Zsn4FBTen{o=;=&e|H*7Y99HdgL3_gfe=SPWghzLpOKv4@5c|4>qgdGfANi2k}@zKY<7q^1J$dmA&?w z+qkgGs@g94QrJ@_C?_UM+Rm7@*S47tPX1qsz5lmr@c&=o|DkOD|7D?Gnk^9UekG=- zpY88EK3%K=WQCs`a$x!s-6}XZIP2BA-2hhKeLuxDHHj!-B-v)6*=T`=hW0p0k)zix zpC<^&F{h@`1Tf>O)&Su)C?rHKl~I2zk!pV^%F!hmiWp^1MYF|j7m(r9)G%5RaM}S8 zySP+A^@Tbu;scWXz95(=Y__!~YfUq=lKOgK#I)F|wH)8CR)IhW%-F?B&E?fsqRwQ%J^+qeo_qOl1 zxBWjk_O0(suE5YRy-o)wKmtjF7)KQwOeiN@ToVP*LUh{Seo;L=JpgKv_zwkn0_5ZU zAqcunR#@+pr)&}8ao@=RhSCo}-fTYKFM#$iJUonm!(JgAh8%;>qtRkV1O`w(F3-=` zTkH)P7#N;D+5uXM0p`VOt)ZBe)kUl0v1*l8T52jLAStrF-fRznlarh74TM}SQP_Wb zJO}6_op!r@ra9iKZBD0<2>5`+3olMCo%P2W8p%e7`#qp)1R4!G3JMAm((MqAEnyfS zp$Wege;sHx$Omv57aR9AXh0P8dD#uo>GU8YBU>y}8Q9XfUbX=@zn3<8wf}F6~EFMn(=8#iR{4Fe`)o%MI zOG11bi6gPE=^Lf-ycAsLb7=mVs8L_kdus8oI1%L#jN@V%R4k)!h8-~gQ>%XBJJLPlmVI3oiGfhx##|B$7qwMMlnKe^B9{B0k6s2(NmV zAQoz@uXK8Hq-%?#w`nz6ES9TP&vqmx!0@p zkefE;efo5+9-LS+@7bG6t!D zltGaHgXHZ;rDij_;Yzn}_Y2Y`=Q_WxAcunR2>aXf^|Y&jH2EM29x+)N`hP!x!_nD)e6M@R_Akc$0^>gmwh6kU^h?C;laU1v)Mg>->vXEpD6>x0>A-w z11#Hh*E{^`Q8G^c8{jb7UxXr&08$=Xt5)FIs{R|)ZHs;*4#4*GEC%7Oy2#7V0HlwW zV^nl>@+rIIi;}&;h!koSi>(g#xqby#SJ&CqfS3Pb<`+jt!94k4L7&O6Ij|au%tKZ` z5A^>n9SCmCkWXa(yw7so(hnm(0vzhSbwFYv(7WLvqDAOGErLqC90=&J4sW1Ie&Wi1X{6-=D0H%mHUKVsKif0wC7{w2a_aqser( z`s9Ag+|#tqCp1Wvx059~aT0$&Xn_!S_%}s7+q0?$@J?c)URb^VK@C zbX$B_9xx`s2POLj09DlOa06xvBVS5oGHj6x<^r4S#6+k+WGoSU$rB36U-EjnAN?Y}i0t1ZX$*wDCf0R#vSN!vMXMosn_I|Ii#+u@ded=HlV!7p(b^3D8w}ZZ)+b zVVv`t)GS_oO<|ZtjDr~g=ZZnS&gdMr;!rF+WZhxyFYX5W`$<8}3PkfppWslA}>I4hL1XbRbUr^ZF`%;w&O8 zoJg;Y{X?RY-&CLXemI8U8bGN(-yUnDbVz>X0wg=6ZNtQxYQ{woF0^UsFk?^c4CifQ zKm|m4QBwE`71=p}_6CrIYcByCIW#c9YBtl;sy?P7u5?RFE=jB1D9-UF!B|0rW-tc9QoO&bV8Si~%fKt7^YYiUw_fA==K zeRHl4$jHHE)h+?u{-e|?)N7ZNd0dr7A`~<{`+i}u%zxOvFsl~O)JJE$@FQXy8-#n z0${YiI>xg>f?V_(^5pgU+*sr3X#)Z|U^2sisTG3S3*AlJ+%NKwEC1QTk-E7F?uiX=Yj_T{jU+j>aJkk zdZ0_D=D$awneQih22hiNpYiaCAB+(uWoe@qRN<^>*D1O_ySlf?C^*(IN|hlYkOX!1 z$S5d)r#nvF@p>Y(S4^prMOo8{R2Q#BsDF)MR?h?n2M6=8kI)lGGmU;>MGQ~7E|sgv z(e?m@a5DtdPsRtEwEIGw`t!W3aMQ{G;s2r9n8<`2GpEFs)0Su@VUf)!ToN#kyjC2L zwvGjisiY}@I5_?LR>rNb)mUbz&N6pA;5G@6govzgm7re0zi+BQK>_Z%0B*nh^UZ($ z!2$}7#!gP=Hl~jBZq`v1KKO!cVh#};97QA>I>*F>=;60%7T z_p14*Fj9zBXe;;oUkDo{x;j@=sy%HvzdLX2Odznt616B>3CiOA2a4f|6JU&IY%@O; zeNw)E{zX6-2__3!^M?%M+?9uF4Kh8j?~^(|gdx)_6b2US5cY#~mslY?6RP7;^=NHx zKyK=)?+KM=Kvje4PMn-Nz9+cAejRm1i3U; z@yEQ(BVAjUCM_zSLArqIuoAC{pxdhpsmAB00EkDPHFL&#o&`oYs(LyRr*Bhw-Sx&f z3;EtipS&sJLus`Y#^78^L?~2IMYid7fERQNIDzo5k>?SlE8Y{WFVo$J<=K}MM464w zwsAkIO#E=)J>YLJBuM()dK#Fi=XP^vQ3y;;{CuWN-Je_*4!uUOl!uJO4moqIV4Jh` z2!$fNiVu%*>#B5)a<@XoIzQZs+cbU=5|#t+CvGZ4|CtEcJ_1pCn#@AaC558eZW+tquWQC&PY`9!>%Tx4W5~;3aJMy zSnHksOD#_xKC>X&K2y%kZ0ODEhR$`%f0Lz8GEg*`1K1rAn<>1DLJbml=K?*5C>V zZ5`3O`U{S=n3yJIF7f&t;D(aECI*^20?>Wv443c(CUe_djxTQmLhrSF9J*77*9X*3 z;Yvm6Re087efGnK`i^2WgXHe&kMsZ)df=2YNPMP~4`dL?I;TGmT2MixS*SDBFV=*N z#5K(iwBhauSG+zbNOL4T*Giyvz^-^%!X}me)h{L;iRoaV4yV^623mER(hzGw+q!WC zKel0LAtw=Il=+BmKF5aPve-Jh_&b_Oo5m>xDJPl|Hj!em8taBin;w&He;ApeJmC>d79W z{vptIy?^K@qzVc`I-RUyPN+AYTCF&38XFQV(IMHMuxOFmC=b>i6$j4A%~eSVvZ6@U z{&v`{-pEp)K4@%NV`n|7^~9}Y{aD@LVx8;T+-);;0iXSmUPNcYKGrDK58w2c*QM;N z?!M$$$EtJrvFU63;I*yl+=ju+`Jg*nO<1%(FWTcRUy@qNPFH@ozuZ8L#(~C{>}_&r z-p$RM1>Z&F-JbQ@=`-zeR4@y(YJPy_oN2l7Zn^A|%}eZ=pwerQ0AYR5Wf`Mjmo3h1 zezr5G{yrE}>Y}}CYJKswLuKAplm=^g{J!*7tP(gnw4g=|PuI!1+d^FW?Sw7Ru)Pg9x#Qz!y z7)QE^b>_a-E62;?%s*Gf?~)MjrOi~}FHw8fh~Ty6vbe7DQIYbHmjqdbA+2USBUM$Y z3iv=Ur#lhVa@i?6DV=cfxpH*&<^Gt5tT(rM@ZTV0Q4pfs?Z z%M-W$RoRWPV2HdAs09t4BW^rK^}9>*a|pKg+gIpJLgIeqx^ zV?=WVi#aTYqP5K8jmE#+(_AK~SgWw6+aGPzIFIf1ci-|-kWghU4bzd}KtQeJKtTW3 zC=LTaaYI`hr++Re{sZFLQjYta@m<%|dM$?JCI*ts1Riqj>=)F_PFCwYc!y#P zIo1`s6sI|~kN2c4%S@r2gRe%M$T3WF_`J;?roJ98yFX5%hmT_6MXwkeN>NyYt59nA z(4Lz15%&IKnC2bBYVBow^$@W?LiXD2OqJBTS;o@xgsz4A-UgaVy*!rK-Cg?mzzFLe z8LMrPA?(qK1tr+VaNm)>F*A(+VtajCLGymiuw@&fKX>*N1#y%Kw@p6f*2$C!)MMx5 z^Y!qs;Kh;c!%dW{52~txT#0)DBXOir) zOweo7_wqb$zR-WjSHeVh`~4mqNx$<*UP-f zY#0Z&F}m>{<}s{jDiTLm`on1mn$>0%!smU7JhEJKS8nNX$HW}zs$F+LH;4M&{0dx_ z0xYP#>5MJQS=t9uZT>O@4O>NSokV3&DgF9%S+K-fjW@f4w9w`%;q4Rki02bW?OBUz zTfwbIlqLGF2XB%Q>`*y^>DPLQW6t2c`()&es+>-3M0cx}uh+W}CX$DtR9JIE;gIC- zr(w+46h4~U?bZzp)0Aup+DmDDy;e&7jHUaJ-n6^Rx`7GUVA#xVhuIeLYqPf@qYg}}Vh1r?KA}*)__XtH=Sr=QeSMMk zkCG3M0shX&f?5I&$KbdII_OSR*g3#OdhK55=;LE$d|K%3Rdbt@&@l?x6J$ z76s98>70>;L)b)Q)7MA}Sam*QW4IM!koT-@{7Dk<$Te7}%`su@Qq1w!n!D-St6ltSDlo3B}*qro!96Evse+7cD7l zzJ^q}cqMl8hg^9@{q(^eRq59a+@;Kec( zqIZ`}wO;9BH*i^PAv=}DYuA@_ZaYD(2V4BZo+FbtWa)!rah{+m*F+qSnQ-o(o&JN* za|x<)I=;4qFP*UU<)aCnpwHJu6xQ0=8#o&Qoo`$k!YL$A5Fz>qwW~($jeI`GNuKjM zi#i^2=Qwv@A%@b8t7qf$i87vAp3w9PDuh(?Gpz2sW5tuTpW^jo3TivQl`NYy?&Q7Z zi`Vc2nlsAiYlnB;lq|7l%SuUmcSGmRT=Hdln6!4SmR z9qD}=(W%#!GL5vw2{w**5l zSJ-!?o2AMZ)!5NxRpHU3W96e5q>=1wH~!&gqmh-n#LVw5%I$+p^ESTrJS`U6!Su`%+~bok*~7lB4F&{VP(p5ro0RT2%Cwi1SH@!vPq5 ziSZg~Px@t+iS5%5ru$9dYk?(eSagSd=%{?*wq9hKeoIqysu=o1>;&@Y#ofko98s?r z%BZi)rL76-VJ$(cAoB!Q#>tJ)r%nUMx0iftzzG{2&r!O=jmz9O<6_KmlKFP zZ7Out2bGXpEv~RrgrQAeFAZM%JnjVPyAw$|EnKF!7TNS`~*pHMvp&^b(WW@vs_@PLj;fBd$_MB6mGY#cuI^HAQ{B=zRzPo0jOC zE)He-L-2<{{)K99%{CmDTboP-PZ(MlI#I|!L(msV8&TVcX`>kG8ks@vnhljqU26-q z-e*H)#qiNAI-91+D=MPmF~ekn19YZe2;urS{?-sGh@D-`Ip)dXC55YObh7CD>3F77l%HeAX%XV^< zn~@M)Nn*Of#T$`$E{4m~M zZW3DbHU|eQx}BJ7r&3_tEd$Rd@w0y$vqa~LC@(!eF*y{xTDbWDzq zq^1&ReRn_0qM_G5@m2oaEDc?xsTpXLECccFZZ81YOiYzR(XnQJ36ApzLmGl^R1V)1 z%bA$0zS^F-U1_j{XnND#GYH~%;+GH?8eF?{fi;|UqvL@W0b1rkWm9xQn}y8TK;-qv zxC|9ejI`8V1+AuE|J2y8kVxsR=x4N^(*kgD)vn`cF9=91c!1eVAC7t;@Ah7C#wP^I z9bp@krXGzfcjJ1wp9v=;afQg``U??pqKdW8?&_Vttai!Es9kW0ji=}EbOEJkTjOqL z$y(x}<$5*@?g~-y(}~^cl@Gi}5%+YW8?zg#x=D!BFbNmUg+ZGXPpSUxA&Dl4@OUwo zGO${_i@s!1!#Ov-CR6qcq)X3kuurigL}*ARr65t%R*P?Q%Vd7%G_G_Zmt`n2Rc|J@ zo6ggmVw*KEva>U-D6zOy&caIvX1qF-Th-{ZPdNa`wYq&!CdRP1Cf2(F@qmiw{-aZy z^x?ofXfBQ6S)`eLyiVJqMIi?apR@4%n*uupN_z+;vS`j9x>$a*(vMZN0;B)DO-!eQTh z_`}`X9cowFmK9pML0xxK&O=8BRyxFCQoyt5eAB7wbeHCRdW{goY zVpOd3xKa{L!0%6CJN>P#UZ=3+?)dO7SrMynd>`qsW(xFk*O^fjXJX4C_WjoD3*(8; zk}a_5P)?iSrEfcKiTJRAuAJ>iLB@=*oNdTyg3mK~IcXvXf7Bvs8kZm&^laQBRt7nz zj`wCp;`*TX^rq3j-};ob=`q|nmcA<3_};~#8qb| zOE-KCAmMd1iwk-}ffK&YkNJ8k`=QwYNhp6-4feT6x)iW-xtHHv(1oQA>+Cuis!@9~ z=c|U9t4>_APMS9Jo5J(jt$15Q@yKcKPPeexDw8`&fEGWm%0@o7Y`< z)quD*y++BJ9ye1XEGP?~wY4FaTWVf6XmE8Amh~d^)&9(Da%j|5^i@H2p7e!D+G;urZCJjD_71IAVK9g8uy z<)omeD2vX#nil*#lGo(Q!kSvw^*HZ}Qu5d*j^S(QZ9=(xM7T!Anr|iL{b#2d{~CxV zWgqTlDcpUtUN*plrj1;g#a<9p};Y_oC=I@z{5(-W(RM5TiK>=8*Y8soN4`46i(%TH{P1 z;WJ_DRTZ6~VXm$A1M)W${VFZX!Ac#{*0d9>e?K^z3LP~ z$fzem9!Q6=Jwd9&MGXV-Y7XMnI#fl3=Ix)giSu7#J&GfGv~UJ&VR{%MZvDPi`GfCa zNT!QPMU)hHp-7mf#O!aLci6aSs_Xbz!BXl<$Tnj9GRL zkCs4?Jpt?!k_Fqo7~a0F)Wm|*0a$tPRFEU{U$eW2EXmw>@E?l-ya5;YX_Eu35SLLM z32F{BJI3oxY^dBoNJHbyCEG9PWyK(fYaBHv6-Mff<}XT#ljOGTG~IHtnDek}z`y2d$Bf zFJHopJqV>JrSxeUqs`IZv5%DZrcVL!p9c(< zd{TOf0s)YrJmpB8uGG@k_D_6;&H#J-H0QB*f!{mG#PkfXVptBH$M9@9#oKz1(H$|= z^O@XupY#ec&GdX&Supz?1aWGO$cs*4kY&$Pb+5&$A0q4|?(CbhY)*TbxWWm&9soc7 zxCw!oQX!hL3HtE>)ZS>YjDZO>QyH;)jG4>fTw5IwN`r0<9qVQm*#EqOu>Iw!Lh~orM(%_l0M2We65Wfo(%6brn z5rwG)4MZdNhLJ*0w=7vi47dH?iWKywa zf5$wu$Hhj$AtuD0AGrA%a|nqUW5}}>$}C?1W4H_Al%w|O0qZ~6uL`hb> zOH01FEV^CocLd6f+xe5+B~Ie)IJ74VS0c0$aNJX6^YwLgtjoK-rQ@5}tNA!8Jx4=k z8^+dDmBp)k#z4wQT2qGjd(W=1qhPU)#aSh%yJYlFS{3Wh?|V5llNl9hvDVAm2`yh) zwA4BY((cjpPo{$HNqeUx=Qey^(4wdpkhAukL*GuKcU`}X!ZbI?QEjOxI3{`C-vdqN zPy0(d9A{v~MP{qh>k-EuPxn*&uU_AlPxV*)tqq~3Bt$~U4w=|>PLZ@8ZPA^4wNx5MYC#7S1{bQLDT49}(z}3KInm7_n$v|C{ZLgRM)zC})Mu(CIl~r~PXBF5n8tc8 z)RmO|+sEtG`^7BIE)pyfOiK;~g7=GFw1=~NBgY4Ut5o=x=r3MuJl$6Eda471gFO!i zrW-6DKnY-4DO-PQAKO!7!{frwg$Kn(1$Ht}!~}ThYxc{u&LjQcw6TFX0JpI_EMRG! zB7I_C3mOk9k-u<{6z3QD1 zq2x%kCY`44l{2Oy*@lp`0>e}5!kCW}81)ar_mhxH%U zO2|qvRd2zl)(^Rr5Q6Y zn8Uy94jcH@ycnOKkO4S$xJ~63DF$qAD@^L!OPs6(OfD0UooEdeV(wLPB^4YYyL=6( zO6cZ*g9FG#DNWk*06w$R5lPl>R1lb08QBOKKMDwO5OI)U3gDf7_0O!>co;OKR-{(4 zNl+UZU(On%$z;I6}Uu?2%HT3EF`_}lJ?-iY4Nqq#-cqP8bH%W=Plz3_%26TuL|CZcjvjx z05OZ9SVA9gO1$O*2Y7?$0q=1$3ks#>3h>#R%?u`k@kjfHO-=~p3RF-bnjt#11LXoA z1O2s{M05mdFljh?`|X&v=>nyzQHXR~r8KhFL^M+RJJW30Vo$7he66{> zu|A;uo&N9aqvyj}fF}HWZDm1?xUH#iRzRjNDuLh zm&c@%M>6c4&ZTUAq^grl9NCpR_(K<<{-ru}`Cm_BEl_>lWa5dE@>= zm%$J;I%TKAMjf8Nh?-nQ^XwYKKWO_`2WyABwpkXwl6(33AP(?l$bHpIT@{QME;=ov zl3YKuI{ux)(F!&B(Rx}PrODdavy&&wrM2AiXV#vtcJ+O85$f-(kuruv)pEgpip;+D zuTFT_M3&gfW(HqIpX}YXfe3G>6)99TDVHkXjv_iM8LC{anTNPYMOoiqbM3IXfLmM? zGPz4d@x)=z%hwkT@j69)V596{v)y1n7A&j)Za7$#&H^oqAzhBD6u{do|7y`D;1@-@ zMro6=bD9&GIbC^cT(1teKAoSzK+>94DIf|sA6~++!+NCFBX4=aB#z9e7Inia?}=$# z5PR|Y^ZW#NQ_a3(N{WVgPJKec&5O@Zu>09gy+hKm9ry-S5VKPc3Yv{3Pe8-P$JBF7 zQAs@^C*Mtass`f)F~9bS_W9)VtHs_?fYYI~lZ`H#nRF?ZpnTKi=?OCETj!&M!H-fX z;>G7DX|32{Y=5Km8CX&5;1dOZ+1zS6hopF_??(Zu!H0*ls|vJ$58w`nLC5me`8Dtz zgi}*7B_eW=Mq&m$P_|R^krNW~(EqCJE1=>^mcIvg2?Pl41eZW?pWwlr;7;(tArJ`e z?k>SCxD65@xJ+;l5+G=BhYxmNUb6eLd;VX|nRD))>8iffefu}JYO1O+p!V9Jqm0D) z0j%F_Wb+tlg0@qAzCq7#qm!Y^i=p{i0X~NHvD!g_p-uEA2u_{0TxSztx@~zDm}dD6OE#ilX~2-As70GxgF+rg!A!kiZcgS3SRALG(qe=)Ca)X6=f?~^N=zqL{i^V)9sttWmNH8kNe%G?_)GdY>HZPY8{*W0W#}1?5LYU$$P$z|9F(PxNE4x)1&EQQR_nZ`m}H;u9GrnNmB6_bJhn6!1^+ zP}6K^_Db^PmI{J7i94!3NrUx*%???N8A)-zk1XAOf@dITSbKN2vO6g)Q(o_--7tDcBvEGqP3PP? zFFXgVK^V%gjW#aX(D3K{1g5lMc(e`l-^#AE3+lnShJktsE9^d1KCYq zKq`WM`@%O>d+{O`tls8JK$v;{9b?1~*xq9S_pY0o_G5g%!eXLyoCCigEOdqB1MJ>4?h9VLK0^^47aK_76AscP|z@V@qLjTa!mE$za+kCXRHf#5MjJT`j9f?oE7y6Iph7oDj zBVYM0B@Lw{?er)&z7$|ER(r{JNc2C)Di7PzRB?~o5~*w@D>nlr#diTS93nrQS9}g zmV?B{wS0?b6#~MkiK{uVOYVAyROH}V$$4D@IhJCQS=#3r zLrTgU@O1MDuDmB026DNe=3}ybOK0s~ZE-G$)YIkAdK|*SzVs$IE&kZX9B9eumftI6 zEYN?Q49+qZx)_)p0iC&rxO}F#dFeiIe!Gh2h0!-vI%Ldrgp(1p12M{2xeO(Xa73S& zSDn$lC`Z<8E6@0pAHUYJ4LQY32h6`lYG-k|K3Z+zntEBD_*SlP-myH!C4Ux_o={iZ zcLJ^2*yp-7Y`Qi~JVy6zi`}h5wy5Q$7r|I~5c-$Lr20k-==qiNX+G2i1_7W>TIsjX zCDyY}>FcP}(SdCdgIn0i^THaqN$K)KeY%Qns$7nJ9=-7#$1BP73}%}E`wAK09a2|K zJLAGe@b}l!+g0_ckXZ(UUCdj)`r_%e0nwf4?5UJ_YQ4T+HdT?808VYx5 z(A&W9X=dOcH#1(JE;F=@BW#nt<7IHz8VgQeIBZNaD|Mnuzdf~*zq~u%$;lcMIn=pZ zgP)2ZfIBJ^k2IuhKz;>*0ESOaNc&soq1Xq}J$kIJmP#xHHB1)3_Z7~%k>*BE5^`Xy zglKc!DA_K&pd%$FE=cmg-X>0>-Patav32-e%~b{FBg{vKOyQbmUDd0O0#`vbZjjmn zJS|6^vP>LpDTCZP_gy&#OB3fnjg(^Fr&CAlEwYIcf9-7S5Lmkj?1T9%cL4xXC?N241 zIo!0}-mHVM7Ea!H;#~IgP2s1;o=Y7m5$-S^m6$SW;V0h?QjCOu==;88$?qr9-nzBI z_+7M#cGaE6X__k0lVxnD5CK~t;qv=Ywj0h}eN;i31@ zVN16{4{>h91_@ym_c3k*?J)lm=k`afJ`+cShak7`SVh}Z*2n%!XADtO>PA+Q1dLgq zIb=P}Yo&(rTE)7Yi`0!I>gZR^JLe_Hn}vKUhE1OsAD81T-d5w@!hepCjfW&q zV8NO~FF}3s3P~3%q~Lei8hORRStr6h;_%o8FRmKfWwR9dv6&<-8!xw?Q5dfC%k#Eu z@l*a7wsm8U73EERi5M#2m|HgCKw}eUdwagQq{bCNs|@5VJcR#t<|9&J!fpgxF@;~W zmb)fHZ)qX;!$fY4ElpG6=`p|3vYtEs{DVQnNrYF?ucH(#< zyvTN~-ImhNQcx}X)Tnyg5^&5rXjnP|VVitfs zC`XSzHnU+n(6@4I!Y9<_s9Qxl?g>_hel}*I2MwK1fi2DSJgo0EbLx$Gy*3p<6|Tuu z%W;>h`1XE&5fI^*SG}8{002Lje~W8;D3a*l=w@Z|M{N36oo$;rZrs~8dGf;cEI2ht zx6Nx0EQD@ngzD*h+F8dtb}S}K2`&W?(a4BrhG(&740Tbc6CSl<-Hz$Iu5NBk zg_;kd=t>5@D&?0IwYy7i>_^EKq3Q&1Qu)GFx##vHmB9ep=}EJPLe}=u%z~0+VMG-U zizD^Dr7D|X6RpCkJVEE~Y{`%l!^tGgCFrg&cImXh{z3iwckii_a6{R_zNlAM__1DO zW@LjX`nHB2rx`u5reJl-Bd5By4Y#7gJmBLU6>V9?b0ay z4)u_Whp?v88zCdLV)i~A52Do>xB!P`?Ps&%7M=yHm=4F>^gJEuv~H8XExM+-IAiU{6QqTpWI$QyCftrRN#M z_!-t});fMQDzt9n&bMYM4PF_P3bTbX5p%rr(wt zjL>@~e5@BG-blcsAb=7d7|mo#n=H!o-)~2w_dAC>*Zpqk!|cvoZcf^Uq$h+TL~=mH zaD6+X)puyj_>TA;Ca*6QrPm{`2Hf)EtncSw-8$%Hsk|%LJG9$cOJ}oyb*g6qK4lx; z$o8KDvU3NV+$g|Mkdz>(WYm4%Njc`Wdp(r8xAM{gy{5E9y&z)a0U zVGFU7d1kF16H}B97PN(SM_^^Fc)toZlulxm*}R>nVPc!gTej8fZ;^U$(m9o5q?}=K zHAxSWO}#zv=dJmuyxm-g9zFm`yP`;aqu2!KGA%K8d6VFH`L*RTA8iE{|sy*PK@MluQ$)2>sYd z^VIifX9lT)Uju6vRe$pCYUHhQ1RTwFNB}cD_V%c(h^2>X@PTQy;&*vPsUoeul4@IH z5`=RL*Mg z-)CCCN%|K-40F8wY|lzr)j(ROfE`*esjG`43=ONSY6U z%3M9y8;waLW!8!uCVNxSQ13onh=Q#%^*v0MBjuSilgMu(pC6$n>rcGe!`_*gN$i1@ z@!>Ilr-}!(>{;iDY^>{RqN{qlpBG((f0<~NTh!gXAKJ3Smul|jsjHXKke|sZoX`o# zDZbtGq#o52A-!7SKFDv21mx`K^W;%w(y6)2Cy*O=KYRpC@)B9|nJ(rGJDGqPWL znJfudx$Z)V(J1&PL8j-K46NL)tYza?9>(!~T=m8Ulrn98dfTFs&h zGcBj7^ii+S*SP+dHb*;FUUg40k3tW43Z7(QgdB9t8D399%`3Duc$00E?8oJ#Evd9} zze-{`_rG|joW!ElIZsv)ts0=B@|Dxc@XG!oddX+GVLyMJyQ5=x7CAYAxRQ_fjFe0m z-#>DejqcjO5cy2S2m%bp)@VKL)gWhirHtfH-c^N-;%}p=)@fi-`*pL z7Ibfdb_jfbvQqBh0)2Y>DJNrhztq&03sxV<!nD8qbJC`ck zW_pka|Mznp8pUs|ub;Ln75IX_%Np#iy_4I2b}-!4RD0 z`Vqk2VA$8Bta(r@xJzr}e0j-DIMwTfK=5L%SfHFUnq{pepzzF#ek=W;CBIKl)kF4a zwY+?C$teeOPk{jXWYA|-i4N@4k55MXiFwn}dn$2d% ztaeE9+^G3Bcj&XuBFuR*=ClRR5Z6;(N{tz2UrPt+#CimA=QN7M5cTog zpFd_}{g!on*R2vDP%~)l%3`>QuM?hoQYE)odE9?XC&=&ni=85})gFdiJBOl)cYBCwm%BB7Nb zU>sF(2eDa~AuW-?YWgmoEfm*|Abt#|+#jC99HT3I=lgQGJeul&t4Z`$YA80l9qt{H zj3ix=JCs67VaKdJ)6{xNLkE;dKLt0g_A&YLxC*8TWj4i-*hTO+Hal+9iWKQHe@ugCEv#tPGtptj>DUwA->_O5vA?Q44PMDYEX-XVjq!yM%4mR zvyBsB#;+QxTUudZdCgj;_RRX(MXE6_CA3pb-FMC$l(Ny`m=~E#@u<;+bZ0@I6bu|e z_hId7%Z5zUG3IQMKok~6YSs8&xIE+tio+7x50CxqZq&&iO7^IaNsUTDV&D49AeBizrZk=LnrLQkmSPn+j- z>EdMY{t>s;?%$q)A2Kwp4Qwn-O&lDVLB^&-u|qb#teAfL{Qf4x)50upa3I?L#@Ctc z&jU2zSPoOL7F#1?)fDrJw=&09%f;E3B5G214TyR}s|q_*IE?71`z6h5zcKJOGdI4U zK9j!5#fF|oFTtOQ3)O0*I)~OZ<%nOtg`#7E+g=j&Q%wXS5=pqI z#mU+m0-oU&BvW-o$L*{rw=*(<&;{P2tSV%KIwf#m9a*%Ga5&P-em_TFq9!?+ZuW#D zMV^lA-IX4F@R)B7zy5cIh>_{VAk_S?x?jMRd)mHBZ{p3}_l(?~#<~xdDC6|gp6$tR zHS@XMZQL@C+~Kd>C%V0`5+2SqyNueXIV4q;sCY0TYR=3*!`+(@zW+5Lew25=AF=-u z!Tk}?*2dJr%n9^IVRwgTERMFeR(1w9CRQweE#dxOruze;-|*RiY|TI>4i1I}pnu`~ zU5|FQc20Kp_2ZrXh3}zg{O_*x-+TKV*F#7D|6Hb4wg!$SKQ#MYvhdU2T%m!Hk%^Vb z{m|NiSd5%Np#P+xJy`Jw59T`Hp{)G_{qsE* z+76Bej!wVK((iP^x$jg~OhtrAN=}^Rzw7JXuTZ8UW7A27xo}^3Vy=JGR5hDhQ)LV3 zGmHYibCkaDASQJ^OGKQ!>ign}o%O3lBX|vK^bRhM-Zcv66*0k3_|Z>`%hSP;yB=5c zoZH>>PaI(|x2qxJf_b5H!7+*wzzB{MK;Fz&65z^Q24H*x*3C>}UJUnsufdYSu=It$ zrdEiwVgh*3DjVREu5cz?z6=1fGm&CDe#~1-f37_+PU7K)#c1m!Esg(Do)3WgIwEej z+)tikICiC)4m-jnuR&j2LD>rz10uTBB*ouJ`UOG%S + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "baseloop.h" +#include "logger.h" +#include "appl.h" +#include "network.h" +#include +#include +#include + +extern LogInstance& L; +extern Appl& A; + +void BaseLoop::start() +{ + for (;;) { + // recv new message from client + Message* message = m_queue.remove(); + std::string data = message->getData(); + + data.erase(std::remove(data.begin(), data.end(), '\r'), data.end()); + data.erase(std::remove(data.begin(), data.end(), '\n'), data.end()); + + L.log(bas, event, ">>> %s", data.c_str()); + + // decode message + std::string result(decodeMessage(data)); + + L.log(bas, event, "<<< %s", result.c_str()); + + // send result to client + result += '\n'; + Connection* connection = static_cast(message->getSource()); + connection->addResult(Message(result.c_str())); + + delete message; + } +} + +std::string BaseLoop::decodeMessage(const std::string& data) +{ + std::ostringstream result; + std::string value; + int index; + BusCommand* busCommand; + + // prepare data + std::string token; + std::istringstream stream(data); + std::vector cmd; + + // split stream + while (std::getline(stream, token, ' ') != 0) + cmd.push_back(token); + + if (cmd.size() == 0) + return "command missing"; + + switch (getCase(cmd[0])) { + case notfound: + result << "command not found"; + break; + + case get: + case set: + if (cmd.size() < 3) { + result << "format: type class cmd [sub]"; + break; + } + + index = m_commands->findCommand(data); + + if (index >= 0) { + + std::string type = m_commands->getType(index); + std::string cmd(A.getParam("p_address")); + cmd += m_commands->getCommand(index); + std::transform(cmd.begin(), cmd.end(), cmd.begin(), tolower); + + L.log(bas, trace, " type: %s msg: %s", type.c_str(), cmd.c_str()); + // send BusCommand + m_ebusloop->addBusCommand(new BusCommand(type, cmd)); + busCommand = m_ebusloop->getBusCommand(); + + // decode BusCommand + result << busCommand->getResult().c_str(); + delete busCommand; + + } else { + result << "ebus command not found"; + } + + break; + + case cyc: + if (cmd.size() < 3) { + result << "format: type class cmd [sub]"; + break; + } + + index = m_commands->findCommand(data); + + if (index >= 0) { + value = m_cycdata->getData(index); + if (value != "") { + // decode CYC Data + result << value.c_str(); + } else { + result << "no data stored"; + } + } else { + result << "ebus command not found"; + } + + break; + + case dump: + if (cmd[1] == "on") m_ebusloop->dump(true); + if (cmd[1] == "off") m_ebusloop->dump(false); + result << "done"; + break; + + case log: + if (cmd[1] == "error") L.getSink(0)->setLevel(error); + if (cmd[1] == "event") L.getSink(0)->setLevel(event); + if (cmd[1] == "trace") L.getSink(0)->setLevel(trace); + if (cmd[1] == "debug") L.getSink(0)->setLevel(debug); + result << "done"; + break; + + default: + break; + } + + return result.str(); +} + diff --git a/src/baseloop.h b/src/baseloop.h new file mode 100644 index 00000000..37549f63 --- /dev/null +++ b/src/baseloop.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef BASELOOP_H_ +#define BASELOOP_H_ + +#include "libebus.h" +#include "ebusloop.h" +#include "cycdata.h" +#include "wqueue.h" +#include + +using namespace libebus; + +class Connection; + +class Message +{ + +public: + Message(const std::string data, void* source = NULL) : m_data(data), m_source(source) {} + Message(const Message& src) : m_data(src.m_data), m_source(src.m_source) {} + + std::string getData() const { return m_data.c_str(); } + void* getSource() const { return m_source; } + +private: + std::string m_data; + void* m_source; + +}; + +class BaseLoop +{ + +public: + BaseLoop(EBusLoop* ebusloop, CYCData* cycdata, Commands* commands) + : m_ebusloop(ebusloop), m_cycdata(cycdata), m_commands(commands) {} + + void start(); + + WQueue* getQueue() { return &m_queue; } + void addMessage(Message* message) { m_queue.add(message); } + +private: + EBusLoop* m_ebusloop; + CYCData* m_cycdata; + Commands* m_commands; + WQueue m_queue; + + enum ClientCommand { + get, // get ebus data + set, // set ebus value + cyc, // fetch cycle data + dump, // change dump state + log, // change log level + + notfound + }; + + ClientCommand getCase(const std::string& item) + { + if (item == "get") return get; + if (item == "set") return set; + if (item == "cyc") return cyc; + if (item == "dump") return dump; + if (item == "log") return log; + + return notfound; + } + + std::string decodeMessage(const std::string& data); + +}; + +#endif // BASELOOP_H_ diff --git a/src/cycdata.cpp b/src/cycdata.cpp new file mode 100644 index 00000000..25a57d7d --- /dev/null +++ b/src/cycdata.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "cycdata.h" +#include "logger.h" + +extern LogInstance& L; + +CYCData::~CYCData() +{ + for (mapCI_t iter = m_cycDB.begin(); iter != m_cycDB.end(); ++iter) + delete iter->second; +} + +void* CYCData::run() +{ + bool skipfirst = false; + + for (;;) { + std::string data = m_ebusloop->getData(); + + if (skipfirst == true) { + L.log(cyc, trace, "%s", data.c_str()); + + int index = m_commands->findData(data); + + if (index >= 0) { + std::string tmp; + tmp += (*m_commands)[index][0]; + tmp += " "; + tmp += (*m_commands)[index][1]; + tmp += " "; + tmp += (*m_commands)[index][2]; + L.log(cyc, trace, " [%d] %s", index, tmp.c_str()); + storeData(index, data); + } + } + + skipfirst = true; + + if (m_stop == true) + return NULL; + } + + return NULL; +} + +void CYCData::storeData(int index, std::string data) +{ + mapCI_t iter = m_cycDB.find(index); + + if (iter != m_cycDB.end()) { + iter->second->setData(data); + L.log(cyc, debug, " [%d] %s -> replaced", index, data.c_str()); + } else { + Command* cmd = new Command(index, (*m_commands)[index], data); + m_cycDB.insert(pair_t(index, cmd)); + L.log(cyc, debug, " [%d] %s -> inserted", index, data.c_str()); + } + + L.log(cyc, debug, " cycDB entries: %d", m_cycDB.size()); +} + +std::string CYCData::getData(int index) +{ + mapCI_t iter = m_cycDB.find(index); + if (iter != m_cycDB.end()) + return iter->second->getData(); + else + return ""; +} + diff --git a/src/cycdata.h b/src/cycdata.h new file mode 100644 index 00000000..2596b7e2 --- /dev/null +++ b/src/cycdata.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef CYCDATA_H_ +#define CYCDATA_H_ + +#include "libebus.h" +#include "ebusloop.h" +#include "thread.h" +#include + +using namespace libebus; + +typedef std::map map_t; +typedef map_t::const_iterator mapCI_t; +typedef std::pair pair_t; + +class CYCData : public Thread +{ + +public: + CYCData(EBusLoop* ebusloop, Commands* commands) + : m_ebusloop(ebusloop), m_commands(commands), m_stop(false) {} + ~CYCData(); + + void* run(); + void stop() { m_stop = true; } + + std::string getData(int index); + +private: + EBusLoop* m_ebusloop; + Commands* m_commands; + map_t m_cycDB; + bool m_stop; + + void storeData(int index, std::string data); +}; + +#endif // CYCDATA_H_ diff --git a/src/ebusloop.cpp b/src/ebusloop.cpp new file mode 100644 index 00000000..e54b2282 --- /dev/null +++ b/src/ebusloop.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "ebusloop.h" +#include "logger.h" +#include "appl.h" +#include + +extern LogInstance& L; +extern Appl& A; + +EBusLoop::EBusLoop() : m_stop(false) +{ + m_deviceName = A.getParam("p_device"); + + m_bus = new Bus(m_deviceName, + A.getParam("p_nodevicecheck"), + A.getParam("p_dumpfile"), + A.getParam("p_dumpsize"), + A.getParam("p_dump")); + + m_bus->connect(); + + if (m_bus->isConnected() == false) + L.log(bus, error, "can't open %s", m_deviceName.c_str()); +} + +EBusLoop::~EBusLoop() +{ + m_bus->disconnect(); + + if (m_bus->isConnected() == true) + L.log(bus, error, "error during disconnect."); + + delete m_bus; +} + +void* EBusLoop::run() +{ + int busResult; + bool busCommandActive = false; + + for (;;) { + if (m_bus->isConnected() == true) { + + // work on bus + busResult = m_bus->proceed(); + + // new cyc message arrived + if (busResult == 2) { + std::string data = m_bus->getCycData(); + //~ L.log(bus, trace, "%s", data.c_str()); + m_cycBuffer.add(data); + } + + // add new bus command to send + if (busResult == 4 && busCommandActive == false && m_sendBuffer.size() != 0) { + BusCommand* busCommand = m_sendBuffer.remove(); + m_bus->addCommand(busCommand); + busCommandActive = true; + } + + // send bus command + if (busResult == 1 && busCommandActive == true) { + L.log(bus, trace, " getBus success"); + m_bus->sendCommand(); + BusCommand* busCommand = m_bus->recvCommand(); + m_recvBuffer.add(busCommand); + busCommandActive = false; + } + + if (busResult == 0) + L.log(bus, trace, " getBus failure"); + + if (busResult == -1) + L.log(bus, event, " getBus error"); + + } else { + sleep(10); + m_bus->connect(); + + if (m_bus->isConnected() == false) + L.log(bus, error, "can't open %s", m_deviceName.c_str()); + } + + if (m_stop == true) { + m_bus->disconnect(); + return NULL; + } + } + + return NULL; +} + diff --git a/src/ebusloop.h b/src/ebusloop.h new file mode 100644 index 00000000..53b9fd5c --- /dev/null +++ b/src/ebusloop.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef EBUSLOOP_H_ +#define EBUSLOOP_H_ + +#include "libebus.h" +#include "wqueue.h" +#include "thread.h" + +using namespace libebus; + + +class EBusLoop : public Thread +{ + +public: + EBusLoop(); + ~EBusLoop(); + + void* run(); + void stop() { m_stop = true; } + + std::string getData() { return m_cycBuffer.remove(); } + + void addBusCommand(BusCommand* busCommand) { m_sendBuffer.add(busCommand); } + BusCommand* getBusCommand() { return m_recvBuffer.remove(); } + + void dump(const bool dumpState) { m_bus->setDumpState(dumpState); } + +private: + std::string m_deviceName; + Bus* m_bus; + WQueue m_cycBuffer; + bool m_stop; + WQueue m_sendBuffer; + WQueue m_recvBuffer; + +}; + +#endif // EBUSLOOP_H_ diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 00000000..eb6e6874 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,222 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ +#include "libebus.h" +#include "logger.h" +#include "daemon.h" +#include "appl.h" +#include "network.h" +#include "ebusloop.h" +#include "cycdata.h" +#include "baseloop.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace libebus; + +Appl& A = Appl::Instance(); +Daemon& D = Daemon::Instance(); +LogInstance& L = LogInstance::Instance(); + +Network* network; +Commands* commands; +EBusLoop* ebusloop; +CYCData* cycdata; + +void define_args() +{ + A.addItem("p_address", Appl::Param("FF"), "a", "address", + "\tebus device address (FF)", + Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_device", Appl::Param("/dev/ttyUSB0"), "d", "device", + "\tebus device (serial or network) (/dev/ttyUSB0)", + Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_nodevicecheck", Appl::Param(false), "n", "nodevicecheck", + "disable valid ebus device test\n", Appl::type_bool, Appl::opt_none); + + A.addItem("p_ebusconfdir", Appl::Param("contrib/csv/vaillant"), "e", "ebusconfdir", + "directory for ebus configuration (contrib/csv/vaillant)\n", + Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_foreground", Appl::Param(false), "f", "foreground", + "run in foreground\n", Appl::type_bool, Appl::opt_none); + + A.addItem("p_port", Appl::Param(8888), "p", "port", + "\tlisten port (8888)", Appl::type_int, Appl::opt_mandatory); + + A.addItem("p_localhost", Appl::Param(false), "", "localhost", + "listen localhost only\n", Appl::type_bool, Appl::opt_none); + + A.addItem("p_area", Appl::Param(all), "", "logarea", + "\tlogging area (bas=1, net=2, bus=4, cyc=8, all=15)", + Appl::type_int, Appl::opt_mandatory); + + A.addItem("p_level", Appl::Param(trace), "", "loglevel", + "\tlogging level (error=1, event=2, trace=3, debug=4)\n", + Appl::type_int, Appl::opt_mandatory); + + A.addItem("p_dump", Appl::Param(false), "D", "dump", + "\tenable dump", Appl::type_bool, Appl::opt_none); + + A.addItem("p_dumpfile", Appl::Param("/tmp/dump_ebusd.bin"), "", "dumpfile", + "\tdump file name (/tmp/dump_ebusd.bin)", Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_dumpsize", Appl::Param(100), "", "dumpsize", + "\tmax size for dump file in kB (100)\n", Appl::type_long, Appl::opt_mandatory); + + A.addItem("p_help", Appl::Param(false), "h", "help", + "\tprint this message", Appl::type_bool, Appl::opt_none); +} + +void shutdown() +{ + // free Network + if (network != NULL) + delete network; + + // free CYCData + if (cycdata != NULL) { + cycdata->stop(); + delete cycdata; + } + + // free EBusLoop + if (ebusloop != NULL) { + ebusloop->stop(); + ebusloop->join(); + delete ebusloop; + } + + // free Commands DB + if (commands != NULL) + delete commands; + + // reset all signal handlers to default + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + + // delete Daemon pid file + if (D.status() == true) + D.stop(); + + // stop Logger + L.log(bas, event, "ebusd stopped"); + L.stop(); + L.join(); + + exit(EXIT_SUCCESS); +} + +void signal_handler(int sig) +{ + switch (sig) { + case SIGHUP: + L.log(bas, event, "SIGHUP received"); + break; + case SIGINT: + L.log(bas, event, "SIGINT received"); + shutdown(); + break; + case SIGTERM: + L.log(bas, event, "SIGTERM received"); + shutdown(); + break; + default: + L.log(bas, event, "undefined signal %s", strsignal(sig)); + break; + } +} + +int main(int argc, char* argv[]) +{ + // define Arguments and Application variables + define_args(); + + // parse Arguments + if (A.parse(argc, argv) == false) { + A.printArgs(); + exit(EXIT_FAILURE); + } + + // print Help + if (A.getParam("p_help") == true) { + A.printArgs(); + exit(EXIT_SUCCESS); + } + + // make me Daemon + if (A.getParam("p_foreground") == true) { + L += new LogConsole(A.getParam("p_area"), + static_cast(A.getParam("p_level")), "logConsole"); + } else { + D.run("/var/run/ebusd.pid"); + L += new LogFile(A.getParam("p_area"), + static_cast(A.getParam("p_level")), "logFile", "/var/log/ebusd.log"); + } + + // trap Signals that we expect to receive + signal(SIGHUP, signal_handler); + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + + // start Logger + L.start("logInstance"); + L.log(bas, event, "ebusd started"); + + // print Daemon status + if (D.status() == true) + L.log(bas, event, "change to daemon"); + + // create Commands DB + commands = ConfigCommands(A.getParam("p_ebusconfdir"), CSV).getCommands(); + L.log(bas, event, "commands DB with %d entries created", commands->size()); + + // create EBusLoop + ebusloop = new EBusLoop(); + ebusloop->start("ebusloop"); + + // create CYCData + cycdata = new CYCData(ebusloop, commands); + cycdata->start("cycdata"); + + // create Network + network = new Network(A.getParam("p_localhost")); + + // create BaseLoop + BaseLoop baseloop(ebusloop, cycdata, commands); + + // start Network + network->addQueue(baseloop.getQueue()); + network->start("netListener"); + + // start Baseloop + baseloop.start(); + + shutdown(); +} + diff --git a/src/network.cpp b/src/network.cpp new file mode 100644 index 00000000..c4b74487 --- /dev/null +++ b/src/network.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "network.h" +#include "logger.h" +#include "appl.h" +#include +#include +#include + +extern LogInstance& L; +extern Appl& A; + +int Connection::m_count = -1; + +void Connection::addResult(Message message) +{ + Message* tmp = new Message(Message(message)); + m_result.add(tmp); +} + +void* Connection::run() +{ + m_running = true; + + int maxfd; + fd_set checkfds; + struct timeval timeout; + + FD_ZERO(&checkfds); + FD_SET(m_notify.notifyFD(), &checkfds); + FD_SET(m_socket->getFD(), &checkfds); + + (m_notify.notifyFD() > m_socket->getFD()) ? + (maxfd = m_notify.notifyFD()) : (maxfd = m_socket->getFD()); + + for (;;) { + fd_set readfds; + int ret; + + // set select timeout 10 secs + timeout.tv_sec = 10; + timeout.tv_usec = 0; + + // set readfds to inital checkfds + readfds = checkfds; + + ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout); + if (ret == 0) { + continue; + } + + // new data from notify + if (FD_ISSET(m_notify.notifyFD(), &readfds)) + break; + + // new data from socket + if (FD_ISSET(m_socket->getFD(), &readfds)) { + char data[256]; + size_t datalen; + + if (m_socket->isValid() == true) + datalen = m_socket->recv(data, sizeof(data)-1); + else + break; + + // removed closed socket + if (datalen <= 0 || strncasecmp(data, "quit", 4) == 0) + break; + + // send data + data[datalen] = '\0'; + m_data->add(new Message(data, this)); + + // wait for result + L.log(net, debug, "[%08x] wait for result", getID()); + Message* message = m_result.remove(); + + L.log(net, debug, "[%08x] result added", getID()); + std::string result(message->getData()); + + if (m_socket->isValid() == true) + m_socket->send(result.c_str(), result.size()); + else + break; + + delete message; + + } + + } + + delete m_socket; + m_running = false; + L.log(net, event, "[%08x] connection closed - active connections: %d", getID(), m_count); + + return NULL; +} + + + +Network::Network(const bool localhost) : m_listening(false), m_running(false) +{ + // Start Listener + if (localhost == true) + m_Listener = new TCPListener(A.getParam("p_port"), "127.0.0.1"); + else + m_Listener = new TCPListener(A.getParam("p_port"), "0.0.0.0"); + + if (m_Listener && m_Listener->start() == 0) + m_listening = true; + +} + +Network::~Network() +{ + while (m_connections.empty() == false) { + Connection* connection = m_connections.back(); + m_connections.pop_back(); + connection->stop(); + connection->join(); + delete connection; + } + + if (m_running == true) + stop(); + + delete m_Listener; +} + +void* Network::run() +{ + if (m_listening == false) + return NULL; + + m_running = true; + + int maxfd; + fd_set checkfds; + struct timeval timeout; + + FD_ZERO(&checkfds); + FD_SET(m_notify.notifyFD(), &checkfds); + FD_SET(m_Listener->getFD(), &checkfds); + + (m_notify.notifyFD() > m_Listener->getFD()) ? + (maxfd = m_notify.notifyFD()) : (maxfd = m_Listener->getFD()); + + for (;;) { + fd_set readfds; + int ret; + + // set select timeout 1 secs + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + // set readfds to inital checkfds + readfds = checkfds; + + ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout); + if (ret == 0) { + cleanConnections(); + continue; + } + + // new data from notify + if (FD_ISSET(m_notify.notifyFD(), &readfds)) { + m_running = false; + break; + } + + // new data from socket + if (FD_ISSET(m_Listener->getFD(), &readfds)) { + TCPSocket* socket = m_Listener->newSocket(); + if (socket == NULL) + continue; + + Connection* connection = new Connection(socket, m_queue); + if (connection == NULL) + continue; + + connection->start("netConnection"); + m_connections.push_back(connection); + L.log(net, event, "[%08x] connection opened %s", connection->getID(), socket->getIP().c_str()); + } + + } + + return NULL; +} + +void Network::cleanConnections() +{ + std::list::iterator c_it; + for (c_it = m_connections.begin(); c_it != m_connections.end(); c_it++) { + if ((*c_it)->isRunning() == false) { + Connection* connection = *c_it; + c_it = m_connections.erase(c_it); + delete connection; + L.log(net, debug, "dead connection removed - %d", m_connections.size()); + } + } +} + diff --git a/src/network.h b/src/network.h new file mode 100644 index 00000000..8642857f --- /dev/null +++ b/src/network.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef NETWORK_H_ +#define NETWORK_H_ + +#include "tcpsocket.h" +#include "wqueue.h" +#include "thread.h" +#include "notify.h" +#include "baseloop.h" +#include +#include + +class Connection : public Thread +{ + +public: + Connection(TCPSocket* socket, WQueue* data) + : m_socket(socket), m_data(data), m_running(false) { m_count++; } + + ~Connection() { m_count--; } + + void addResult(Message message); + + void* run(); + void stop() const { m_notify.notify(); } + bool isRunning() const { return m_running; } + + pthread_t getID() { return this->self(); } + int numConnections() const { return m_count; } + +private: + TCPSocket* m_socket; + WQueue* m_data; + WQueue m_result; + Notify m_notify; + bool m_running; + + static int m_count; + +}; + +class Network : public Thread +{ + +public: + Network(const bool localhost); + ~Network(); + + void addQueue(WQueue* queue) { m_queue = queue; } + + void* run(); + void stop() const { m_notify.notify(); usleep(100000); } + +private: + std::list m_connections; + WQueue* m_queue; + TCPListener* m_Listener; + Notify m_notify; + bool m_listening; + bool m_running; + + void cleanConnections(); + +}; + +#endif // NETWORK_H_ diff --git a/test/feed.cpp b/test/feed.cpp new file mode 100644 index 00000000..b01f8344 --- /dev/null +++ b/test/feed.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "libebus.h" +#include "appl.h" +#include +#include +#include +#include +#include +#include + +using namespace libebus; + +Appl& A = Appl::Instance(); + +void define_args() +{ + A.addItem("p_device", Appl::Param("/dev/ttyUSB60"), "d", "device", + "dummy serial device (/dev/ttyUSB60)\n\t\t(socat -d -d pty,raw,echo=0 pty,raw,echo=0)", + Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_file", Appl::Param("test/scan_ebusd.bin"), "f", "file", + "dump file with raw data (test/scan_ebusd.bin)", + Appl::type_string, Appl::opt_mandatory); + + A.addItem("p_time", Appl::Param(10000), "t", "time", + "wait time [ms] (10000)", Appl::type_long, Appl::opt_mandatory); + + A.addItem("p_help", Appl::Param(false), "h", "help", + "print this message", Appl::type_bool, Appl::opt_none); +} + +int main(int argc, char* argv[]) +{ + // define Arguments and Application variables + define_args(); + + // parse Arguments + if (A.parse(argc, argv) == false) { + A.printArgs(); + exit(EXIT_FAILURE); + } + + // print Help + if (A.getParam("p_help") == true) { + A.printArgs(); + exit(EXIT_SUCCESS); + } + + + std::string dev(A.getParam("p_device")); + Port port(dev, true); + + port.open(); + if(port.isOpen() == true) + std::cout << "openPort successful." << std::endl; + + + std::fstream file(A.getParam("p_file"), std::ios::in | std::ios::binary); + + if(file.is_open() == true) { + + while (file.eof() == false) { + unsigned char byte = file.get(); + std::cout << std::hex << std::setw(2) << std::setfill('0') + << static_cast(byte) << std::endl; + + port.send(&byte, 1); + usleep(A.getParam("p_time")); + } + + file.close(); + } + + + port.close(); + if(port.isOpen() == false) + std::cout << "closePort successful." << std::endl; + + return 0; + +} diff --git a/test/scan_ebusd.bin b/test/scan_ebusd.bin new file mode 100644 index 0000000000000000000000000000000000000000..64299892bf4227f5e057b9c6df5631c4e2ec5d00 GIT binary patch literal 18 YcmZ3r>i;T%e_L5u)EN{QzOMoT09B0$umAu6 literal 0 HcmV?d00001 diff --git a/utils/appl.cpp b/utils/appl.cpp new file mode 100644 index 00000000..63c3ce5c --- /dev/null +++ b/utils/appl.cpp @@ -0,0 +1,161 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "appl.h" +#include +#include +#include + +Appl& Appl::Instance() +{ + static Appl instance; + return instance; +} + +Appl::~Appl() +{ + m_args.clear(); + m_params.clear(); +} + +void Appl::addItem(const char* name, Param param, const char* shortname, + const char* longname, const char* description, + Datatype datatype, Optiontype optiontype) +{ + if (strlen(name) != 0) + m_params[name] = param; + + if (strlen(longname) != 0) { + Arg arg; + arg.name = name; + arg.shortname = shortname; + arg.longname = longname; + arg.description = description; + arg.datatype = datatype; + arg.optiontype = optiontype; + m_args.push_back(arg); + } +} + +void Appl::printArgs() +{ + std::cerr << std::endl << "Usage:" << std::endl << " " + << m_argv[0].substr(2) << " [Options]" << std::endl + << std::endl << "Options:" << std::endl; + + for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) { + const char* c = (strlen(a_it->shortname) == 1) ? a_it->shortname : " "; + std::cerr << ((strcmp(c, " ") == 0) ? " " : "-") << c + << " | --" << a_it->longname + << "\t" << a_it->description + << std::endl; + } + + std::cerr << std::endl; +} + +bool Appl::parse(int argc, char* argv[]) +{ + std::vector _argv(argv, argv + argc); + m_argc = argc; + m_argv = _argv; + + for (int i = 1; i < m_argc; i++) { + + // find option with long format '--' + if (m_argv[i].rfind("--") == 0 && m_argv[i].size() > 2) { + + // is next item an added argument? + if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos) { + if (checkArg(m_argv[i].substr(2), m_argv[i+1]) == false) + return false; + } else { + if (checkArg(m_argv[i].substr(2), "") == false) + return false; + } + + // find option with short format '-' + } else if (m_argv[i].rfind("-") == 0 && m_argv[i].size() > 1) { + + // walk through all characters + for (size_t j = 1; j < m_argv[i].size(); j++) { + + // only last charater could have an argument + if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos + && j+1 == m_argv[i].size()) { + if (checkArg(m_argv[i].substr(j,1), m_argv[i+1]) == false) + return false; + } else { + if (checkArg(m_argv[i].substr(j,1), "") == false) + return false; + } + } + } + + } + return true; +} + +bool Appl::checkArg(const std::string name, const std::string arg) +{ + for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) { + if (a_it->shortname == name || a_it->longname == name) { + + if (a_it->optiontype == opt_mandatory && arg.size() == 0) { + std::cerr << std::endl << "option requires an argument '" + << name << "'" << std::endl; + return false; + } + + if ((a_it->optiontype == opt_optional && arg.size() != 0) + || a_it->optiontype != opt_optional) + addParam(a_it->name, arg, a_it->datatype); + + return true; + } + } + + std::cerr << m_argv[0].substr(2) << ": Unknown Option -- " << name << std::endl; + return false; +} + +void Appl::addParam(const char* name, const std::string arg, Datatype datatype) +{ + switch (datatype) { + case type_bool: + m_params[name] = true; + break; + case type_int: + m_params[name] = atoi(arg.c_str()); + break; + case type_long: + m_params[name] = atol(arg.c_str()); + break; + case type_float: + m_params[name] = (float) atof(arg.c_str()); + break; + case type_string: + m_params[name] = arg.c_str(); + break; + default: + break; + } +} + + diff --git a/utils/appl.h b/utils/appl.h new file mode 100644 index 00000000..a7d8a92b --- /dev/null +++ b/utils/appl.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef APPL_H_ +#define APPL_H_ + +#include +#include +#include +#include + +class Appl +{ + +private: + struct Option; + +public: + enum Datatype { type_none, type_bool, type_int, type_long, type_float, type_string }; + enum Optiontype { opt_none, opt_optional, opt_mandatory }; + + union Param { + bool b; + int i; + long l; + float f; + const char* c; + + Param() { memset(this, 0, sizeof(Param)); } + Param(bool _b) : b(_b) {} + Param(int _i) : i(_i) {} + Param(long _l) : l(_l) {} + Param(float _f) : f(_f) {} + Param(const char* _c) : c(_c) {} + }; + + template + T getParam(const char* name) + { + p_it = m_params.find(name); + return (reinterpret_cast(p_it->second)); + } + + static Appl& Instance(); + + ~Appl(); + + void addItem(const char* name, Param param, const char* shortname, + const char* longname, const char* description, + Datatype datatype, Optiontype optiontype); + + void printArgs(); + + bool parse(int argc, char* argv[]); + +private: + Appl() {} + Appl(const Appl&); + Appl& operator= (const Appl&); + + struct Arg { + const char* name; + const char* shortname; + const char* longname; + const char* description; + Datatype datatype; + Optiontype optiontype; + }; + + int m_argc; + std::vector m_argv; + + std::vector m_args; + std::vector::const_iterator a_it; + + std::map m_params; + std::map::iterator p_it; + + bool checkArg(const std::string name, const std::string arg); + + void addParam(const char* name, Param param) { m_params[name] = param; } + + void addParam(const char* name, const std::string arg, Datatype datatype); +}; + +#endif // APPL_H_ diff --git a/utils/daemon.cpp b/utils/daemon.cpp new file mode 100644 index 00000000..5f276d29 --- /dev/null +++ b/utils/daemon.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "daemon.h" +#include +#include +#include +#include +#include +#include +#include + +Daemon& Daemon::Instance() +{ + static Daemon instance; + return instance; +} + +void Daemon::run(const char* file) +{ + m_status = false; + m_pidfile = file; + m_pidfd = 0; + + pid_t pid; + + // fork off the parent process + pid = fork(); + + if (pid < 0) { + std::cerr << "ebusd fork() failed." << std::endl; + exit(EXIT_FAILURE); + } + + // If we got a good PID, then we can exit the parent process + if (pid > 0) { + // printf("Child process created: %d\n", pid); + exit(EXIT_SUCCESS); + } + + // At this point we are executing as the child process + + // Set file permissions 750 + umask(027); + + // Create a new SID for the child process and + // detach the process from the parent (normally a shell) + if (setsid() < 0) { + std::cerr << "ebusd setsid() failed." << std::endl; + exit(EXIT_FAILURE); + } + + // Change the current working directory. This prevents the current + // directory from being locked; hence not being able to remove it. + if (chdir("/tmp") < 0) { //DAEMON_WORKDIR + std::cerr << "ebusd chdir() failed." << std::endl; + exit(EXIT_FAILURE); + } + + // Close stdin, stdout and stderr + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + // write pidfile and try to lock it + if (pidfile_open() == false) { + std::cerr << "can't open pidfile: %s" << m_pidfile << std::endl; + exit(EXIT_FAILURE); + } + + m_status = true; +} + +bool Daemon::pidfile_open() +{ + char pid[10]; + + m_pidfd = open(m_pidfile, O_RDWR|O_CREAT, 0600); + if (m_pidfd < 0) + return false; + + if (lockf(m_pidfd, F_TLOCK, 0) < 0) + return false; + + sprintf(pid, "%d\n", getpid()); + if (write(m_pidfd, pid, strlen(pid)) < 0) + return false; + + return true; +} + +bool Daemon::pidfile_close() +{ + if (close(m_pidfd) < 0) + return false; + + if (remove(m_pidfile) < 0) + return false; + + return true; +} diff --git a/utils/daemon.h b/utils/daemon.h new file mode 100644 index 00000000..f6a259a0 --- /dev/null +++ b/utils/daemon.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef DAEMON_H_ +#define DAEMON_H_ + +class Daemon +{ + +public: + static Daemon& Instance(); + ~Daemon() {} + + void run(const char* file); + void stop() { pidfile_close(); } + bool status() { return m_status; } + +private: + bool m_status; + const char* m_pidfile; + int m_pidfd; + + Daemon() {} + Daemon(const Daemon&); + Daemon& operator= (const Daemon&); + + bool pidfile_open(); + bool pidfile_close(); + +}; + +#endif // DAEMON_H_ diff --git a/utils/logger.cpp b/utils/logger.cpp new file mode 100644 index 00000000..9e7f04f3 --- /dev/null +++ b/utils/logger.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "logger.h" +#include +#include +#include +#include +#include +#include +#include +#include + +static const char* AreaNames[Size_of_Area] = { "bas", "net", "bus" , "cyc" }; +static const char* LevelNames[Size_of_Level] = { "error", "event", "trace", "debug" }; + +LogMessage::LogMessage(const Area area, const Level level, const std::string text, const Status status) + : m_area(area), m_level(level), m_text(text), m_status(status) +{ + char time[24]; + struct timeval tv; + struct timezone tz; + struct tm* tm; + + gettimeofday(&tv, &tz); + tm = localtime(&tv.tv_sec); + + sprintf(&time[0], "%04d-%02d-%02d %02d:%02d:%02d.%03ld", + tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec/1000); + + m_time = std::string(time); +} + + + +void LogSink::addMessage(const LogMessage& message) +{ + LogMessage* tmp = new LogMessage(LogMessage(message)); + m_queue.add((tmp)); +} + +void* LogSink::run() +{ + while (1) { + LogMessage* message = m_queue.remove(); + if (message->getStatus() == LogMessage::End) { + delete message; + while (m_queue.size() == true) { + LogMessage* message = m_queue.remove(); + write(*message); + delete message; + } + return NULL; + } + + write(*message); + delete message; + } + return NULL; +} + + + +int LogConsole::m_numInstance = 0; + +void LogConsole::write(const LogMessage& message) const +{ + std::cout << message.getTime() << " [" + << AreaNames[(int)log2(message.getArea())] << " " + << LevelNames[message.getLevel()] << "] " + << message.getText() << std::endl; +} + + + +int LogFile::m_numInstance = 0; + +void LogFile::write(const LogMessage& message) const +{ + std::fstream file(m_filename.c_str(), std::ios::out | std::ios::app); + + if (file.is_open() == true) { + file << message.getTime() << " [" + << AreaNames[(int)log2(message.getArea())] << " " + << LevelNames[message.getLevel()] << "] " + << message.getText() << std::endl; + file.close(); + } +} + + + +LogInstance& LogInstance::Instance() +{ + static LogInstance instance; + return (instance); +} + +LogInstance::~LogInstance() +{ + while (m_sinks.empty() == false) + *this -= *(m_sinks.begin()); +} + +LogInstance& LogInstance::operator+= (LogSink* sink) +{ + sinkCI_t itEnd = m_sinks.end(); + sinkCI_t it = std::find(m_sinks.begin(), itEnd, sink); + + if (it == itEnd) + m_sinks.push_back(sink); + + return (*this); +} + +LogInstance& LogInstance::operator-= (const LogSink* sink) +{ + sinkCI_t itEnd = m_sinks.end(); + sinkCI_t it = std::find(m_sinks.begin(), itEnd, sink); + + if (it == itEnd) + return (*this); + + m_sinks.erase(it); + + delete (sink); + + return (*this); +} + +void LogInstance::log(const Area area, const Level level, const std::string& data, ...) +{ + if (m_running == true) { + char* tmp; + va_list ap; + va_start(ap, data); + + if (vasprintf(&tmp, data.c_str(), ap) != -1) { + std::string buffer(tmp); + m_messages.add(new LogMessage(LogMessage(area, level, buffer.c_str(), LogMessage::Run))); + } + + va_end(ap); + free(tmp); + } + +} + +void* LogInstance::run() +{ + m_running = true; + + while (m_running == true) { + LogMessage* message = m_messages.remove(); + + sinkCI_t iter = m_sinks.begin(); + + for (; iter != m_sinks.end(); ++iter) { + if (*iter != 0) { + + if (((*iter)->getAreas() & message->getArea() + && (*iter)->getLevel() >= message->getLevel()) + && message->getStatus() == LogMessage::Run) { + (*iter)->addMessage(*message); + } else if (message->getStatus() == LogMessage::End) { + (*iter)->addMessage(*message); + m_running = false; + } + + } + } + + delete message; + + } + return NULL; +} + +void LogInstance::stop() +{ + m_messages.add(new LogMessage(LogMessage(bas, error, "", LogMessage::End))); + // TODO: Improve this method + usleep(100000); +} diff --git a/utils/logger.h b/utils/logger.h new file mode 100644 index 00000000..c92cf49d --- /dev/null +++ b/utils/logger.h @@ -0,0 +1,177 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef LOGGER_H_ +#define LOGGER_H_ + +#include "wqueue.h" +#include "thread.h" +#include +#include +#include +#include +#include + +enum Area { bas=1, net=2, bus=4, cyc=8, all=15, Size_of_Area=4 }; +enum Level { error=0, event, trace, debug, Size_of_Level }; + +class LogMessage +{ + +public: + enum Status { Run, End }; + + LogMessage(const Area area, const Level level, const std::string text, const Status status); + + ~LogMessage() {} + + LogMessage(const LogMessage& src) + : m_area(src.m_area), m_level(src.m_level), m_text(src.m_text), + m_status(src.m_status), m_time(src.m_time) {} + + void operator= (const LogMessage& src) + { m_area = src.m_area; m_level = src.m_level; m_text = src.m_text; + m_status = src.m_status; m_time = src.m_time; } + + Area getArea() const { return (m_area); } + Level getLevel() const { return(m_level); } + std::string getText() const { return (m_text.c_str()); } + Status getStatus() const { return (m_status); } + std::string getTime() const { return (m_time.c_str()); } + +private: + Area m_area; + Level m_level; + std::string m_text; + Status m_status; + std::string m_time; + +}; + +enum Type { Console, Logfile }; + +class LogSink : public Thread +{ + +public: + LogSink(const unsigned char areas, const Level level, const Type type, const char* name) + : m_areas(areas), m_level(level), m_type(type), m_name(name) {} + + virtual ~LogSink() {} + + void addMessage(const LogMessage& message); + + void* run(); + + unsigned char getAreas() const { return (m_areas); } + void setAreas(const unsigned char areas) { m_areas = areas; } + + Level getLevel() const { return (m_level); } + void setLevel(const Level level) { m_level = level; } + + Type getType() const { return (m_type); } + const char* getName() const { return (m_name.c_str()); } + +protected: + WQueue m_queue; + +private: + unsigned char m_areas; + Level m_level; + Type m_type; + std::string m_name; + + virtual void write(const LogMessage& message) const = 0; + +}; + +class LogConsole : public LogSink +{ + +public: + LogConsole(const unsigned char areas, const Level level, const char* name) + : LogSink(areas, level, Console, name), m_instance(++m_numInstance) + { this->start(name); } + + ~LogConsole() {} + +private: + const int m_instance; + static int m_numInstance; + + void write(const LogMessage& message) const; + +}; + +class LogFile : public LogSink +{ + +public: + LogFile(const unsigned char areas, const Level level, const char* name, const char* filename) + : LogSink(areas, level, Logfile, name), m_filename(filename), m_instance(++m_numInstance) + { this->start(name); } + + ~LogFile() {} + +private: + std::string m_filename; + const int m_instance; + static int m_numInstance; + + void write(const LogMessage& message) const; + +}; + +class LogInstance : public Thread +{ + +public: + static LogInstance& Instance(); + + ~LogInstance(); + + LogInstance& operator+= (LogSink* sink); + LogInstance& operator-= (const LogSink* sink); + + void log(const Area area, const Level level, const std::string& text, ...); + + int getNumberOfSinks() const { return(m_sinks.size()); } + LogSink* getSink(const int Index) const { return(m_sinks[Index]); } + + void* run(); + + void stop(); + +private: + LogInstance() {} + LogInstance(const LogInstance&); + LogInstance& operator= (const LogInstance&); + + typedef std::vector sink_t; + typedef std::vector::iterator sinkCI_t; + + sink_t m_sinks; + + WQueue m_messages; + + bool m_running; + +}; + +#endif // LOGGER_H_ diff --git a/utils/notify.h b/utils/notify.h new file mode 100644 index 00000000..93805f9d --- /dev/null +++ b/utils/notify.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef NOTIFY_H_ +#define NOTIFY_H_ + +#include +#include + +class Notify +{ + +public: + Notify() + { + int pipefd[2]; + int ret = pipe(pipefd); + + if (ret == 0) { + m_recvfd = pipefd[0]; + m_sendfd = pipefd[1]; + + fcntl(m_sendfd, F_SETFL, O_NONBLOCK); + } + + } + virtual ~Notify() { close(m_sendfd); close(m_recvfd); } + + int notifyFD() const { return m_recvfd; } + int notify() const { return write(m_sendfd,"1",1); } + +private: + int m_recvfd; + int m_sendfd; + +}; + +#endif // NOTIFY_H_ + + diff --git a/utils/tcpsocket.cpp b/utils/tcpsocket.cpp new file mode 100644 index 00000000..466ec60b --- /dev/null +++ b/utils/tcpsocket.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "tcpsocket.h" +#include +#include +#include + +TCPSocket::TCPSocket(int sfd, struct sockaddr_in* address) : m_sfd(sfd) +{ + char ip[17]; + inet_ntop(AF_INET, (struct in_addr*)&(address->sin_addr.s_addr), ip, sizeof(ip)-1); + m_ip = ip; + m_port = ntohs(address->sin_port); +} + +bool TCPSocket::isValid() +{ + if (fcntl(m_sfd, F_GETFL) == -1) + return false; + else + return true; +} + + +int TCPListener::start() +{ + if (m_listening == true) + return 0; + + m_lfd = socket(AF_INET, SOCK_STREAM, 0); + struct sockaddr_in address; + + memset(&address, 0, sizeof(address)); + + address.sin_family = AF_INET; + address.sin_port = htons(m_port); + + if (m_address.size() > 0) + inet_pton(AF_INET, m_address.c_str(), &(address.sin_addr)); + else + address.sin_addr.s_addr = INADDR_ANY; + + int optval = 1; + setsockopt(m_lfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); + + int result = bind(m_lfd, (struct sockaddr*) &address, sizeof(address)); + if (result != 0) + return result; + + result = listen(m_lfd, 5); + if (result != 0) + return result; + + m_listening = true; + return result; +} + +TCPSocket* TCPListener::newSocket() +{ + if (m_listening == false) + return NULL; + + struct sockaddr_in address; + socklen_t len = sizeof(address); + + memset(&address, 0, sizeof(address)); + + int sfd = accept(m_lfd, (struct sockaddr*) &address, &len); + + if (sfd < 0) + return NULL; + + return new TCPSocket(sfd, &address); +} + diff --git a/utils/tcpsocket.h b/utils/tcpsocket.h new file mode 100644 index 00000000..a8e9d80c --- /dev/null +++ b/utils/tcpsocket.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef TCPSOCKET_H_ +#define TCPSOCKET_H_ + +#include +#include +#include +#include + +class TCPSocket +{ + +public: + friend class TCPListener; + + ~TCPSocket() { close(m_sfd); } + + ssize_t recv(char* buffer, size_t len) { return read(m_sfd, buffer, len); } + ssize_t send(const char* buffer, size_t len) { return write(m_sfd, buffer, len); } + + int getPort() const { return m_port; } + std::string getIP() const { return m_ip; } + + int getFD() const { return m_sfd; } + bool isValid(); + +private: + int m_sfd; + int m_port; + std::string m_ip; + + TCPSocket(int sd, struct sockaddr_in* address); + +}; + +class TCPListener +{ + +public: + TCPListener(int port, std::string address) + : m_lfd(0), m_port(port), m_address(address), m_listening(false) {} + + ~TCPListener() { if (m_lfd > 0) {close(m_lfd);} } + + int start(); + TCPSocket* newSocket(); + + int getFD() const { return m_lfd; } + +private: + int m_lfd; + int m_port; + std::string m_address; + bool m_listening; + +}; + +#endif // TCPSOCKET_H_ + diff --git a/utils/thread.cpp b/utils/thread.cpp new file mode 100644 index 00000000..b1a2c908 --- /dev/null +++ b/utils/thread.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#include "thread.h" + +static void* runThread(void* arg) +{ + return ((Thread *)arg)->run(); +} + +Thread::Thread() : m_threadid(0), m_running(false), m_detached(false) {} + +Thread::~Thread() +{ + if (m_running == true && m_detached == false) + pthread_detach(m_threadid); + + if (m_running == true) + pthread_cancel(m_threadid); +} + +int Thread::start(const char* name) +{ + + int result = pthread_create(&m_threadid, NULL, runThread, this); + + if (result == 0) { + pthread_setname_np(m_threadid, name); + m_running = true; + } + + return result; +} + +int Thread::join() +{ + int result = -1; + + if (m_running == true) { + result = pthread_join(m_threadid, NULL); + + if (result == 0) + m_detached = false; + + } + + return result; +} + +int Thread::detach() +{ + int result = -1; + + if (m_running == true && m_detached == false) { + result = pthread_detach(m_threadid); + + if (result == 0) + m_detached = true; + + } + + return result; +} + +pthread_t Thread::self() +{ + return m_threadid; +} diff --git a/utils/thread.h b/utils/thread.h new file mode 100644 index 00000000..0abc32da --- /dev/null +++ b/utils/thread.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef THREAD_H_ +#define THREAD_H_ + +#include + +class Thread +{ + +public: + Thread(); + virtual ~Thread(); + + int start(const char* name); + int join(); + int detach(); + pthread_t self(); + + virtual void* run() = 0; + +private: + pthread_t m_threadid; + bool m_running; + bool m_detached; + +}; + +#endif // THREAD_H_ diff --git a/utils/wqueue.h b/utils/wqueue.h new file mode 100644 index 00000000..a3af1867 --- /dev/null +++ b/utils/wqueue.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) Roland Jax 2014 + * + * This file is part of ebus-daemon. + * + * ebus-daemon is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ebus-daemon is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. + */ + +#ifndef WQUEUE_H_ +#define WQUEUE_H_ + +#include +#include + +template class WQueue +{ + +public: + WQueue() + { + pthread_mutex_init(&m_mutex, NULL); + pthread_cond_init(&m_condv, NULL); + } + + ~WQueue() + { + pthread_mutex_destroy(&m_mutex); + pthread_cond_destroy(&m_condv); + } + + void add(T item) + { + pthread_mutex_lock(&m_mutex); + + m_queue.push_back(item); + + pthread_cond_signal(&m_condv); + pthread_mutex_unlock(&m_mutex); + } + + T remove() + { + pthread_mutex_lock(&m_mutex); + + while (m_queue.size() == 0) + pthread_cond_wait(&m_condv, &m_mutex); + + T item = m_queue.front(); + m_queue.pop_front(); + + pthread_mutex_unlock(&m_mutex); + + return item; + } + + int size() + { + pthread_mutex_lock(&m_mutex); + + int size = m_queue.size(); + + pthread_mutex_unlock(&m_mutex); + + return size; + } + +private: + std::list m_queue; + pthread_mutex_t m_mutex; + pthread_cond_t m_condv; + +}; + +#endif // WQUEUE_H_ From e9a4721c8f06c253bbca95e2a37c2f151a367ffd Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 18 Apr 2014 19:45:05 +0200 Subject: [PATCH 02/30] class CYCData: findData() added; various cleanup --- src/baseloop.cpp | 2 +- src/cycdata.cpp | 84 +++++++++++++++++++++++++++++++++++++----------- src/cycdata.h | 5 +-- src/ebusloop.cpp | 2 +- src/main.cpp | 2 +- utils/thread.cpp | 6 ---- utils/thread.h | 4 +-- 7 files changed, 74 insertions(+), 31 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 8bc88b42..53762b98 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -91,7 +91,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) std::string type = m_commands->getType(index); std::string cmd(A.getParam("p_address")); - cmd += m_commands->getCommand(index); + cmd += m_commands->getEbusCommand(index); std::transform(cmd.begin(), cmd.end(), cmd.begin(), tolower); L.log(bas, trace, " type: %s msg: %s", type.c_str(), cmd.c_str()); diff --git a/src/cycdata.cpp b/src/cycdata.cpp index 25a57d7d..e240f29d 100644 --- a/src/cycdata.cpp +++ b/src/cycdata.cpp @@ -19,9 +19,23 @@ #include "cycdata.h" #include "logger.h" +#include +#include extern LogInstance& L; +CYCData::CYCData(EBusLoop* ebusloop, Commands* commands) + : m_ebusloop(ebusloop), m_commands(commands), m_stop(false) +{ + for (size_t index = 0; index < commands->size(); index++) { + if (strcasecmp((*m_commands)[index][0].c_str(),"cyc") == 0) { + Command* cmd = new Command(index, (*m_commands)[index]); + m_cycDB.insert(pair_t(index, cmd)); + } + } + +} + CYCData::~CYCData() { for (mapCI_t iter = m_cycDB.begin(); iter != m_cycDB.end(); ++iter) @@ -37,8 +51,8 @@ void* CYCData::run() if (skipfirst == true) { L.log(cyc, trace, "%s", data.c_str()); - - int index = m_commands->findData(data); + + int index = findData(data); if (index >= 0) { std::string tmp; @@ -61,22 +75,6 @@ void* CYCData::run() return NULL; } -void CYCData::storeData(int index, std::string data) -{ - mapCI_t iter = m_cycDB.find(index); - - if (iter != m_cycDB.end()) { - iter->second->setData(data); - L.log(cyc, debug, " [%d] %s -> replaced", index, data.c_str()); - } else { - Command* cmd = new Command(index, (*m_commands)[index], data); - m_cycDB.insert(pair_t(index, cmd)); - L.log(cyc, debug, " [%d] %s -> inserted", index, data.c_str()); - } - - L.log(cyc, debug, " cycDB entries: %d", m_cycDB.size()); -} - std::string CYCData::getData(int index) { mapCI_t iter = m_cycDB.find(index); @@ -86,3 +84,53 @@ std::string CYCData::getData(int index) return ""; } +int CYCData::findData(const std::string& data) const +{ + // no commands definend + if (m_cycDB.size() == 0) + return -2; + + // skip to small search string length + if (data.length() < 10) + return -3; + + // preapre string for searching command + std::string search(data.substr(2, 8 + atoi(data.substr(8,2).c_str()) * 2)); + + std::size_t index; + mapCI_t i = m_cycDB.begin(); + + // walk through commands + for (index = 0; i != m_cycDB.end(); i++, index++) { + cmd_t cmd = i->second->getCommand(); + // prepare string for defined command + std::string command(cmd[5]); + command += cmd[6]; + std::stringstream sstr; + sstr << std::setw(2) << std::hex << std::setfill('0') << cmd[7]; + command += sstr.str(); + command += cmd[8]; + + // skip wrong search string length + if (command.length() > search.length()) + continue; + + if (strcasecmp(command.c_str(), search.substr(0,command.length()).c_str()) == 0) + return i->first; + + } + + // command not found + return -1; +} + +void CYCData::storeData(int index, std::string data) +{ + mapCI_t iter = m_cycDB.find(index); + + if (iter != m_cycDB.end()) { + iter->second->setData(data); + L.log(cyc, debug, " [%d] data saved", index); + } +} + diff --git a/src/cycdata.h b/src/cycdata.h index 2596b7e2..98e9d1b0 100644 --- a/src/cycdata.h +++ b/src/cycdata.h @@ -35,8 +35,7 @@ class CYCData : public Thread { public: - CYCData(EBusLoop* ebusloop, Commands* commands) - : m_ebusloop(ebusloop), m_commands(commands), m_stop(false) {} + CYCData(EBusLoop* ebusloop, Commands* commands); ~CYCData(); void* run(); @@ -50,7 +49,9 @@ private: map_t m_cycDB; bool m_stop; + int findData(const std::string& data) const; void storeData(int index, std::string data); + }; #endif // CYCDATA_H_ diff --git a/src/ebusloop.cpp b/src/ebusloop.cpp index e54b2282..323f3fd3 100644 --- a/src/ebusloop.cpp +++ b/src/ebusloop.cpp @@ -65,7 +65,7 @@ void* EBusLoop::run() // new cyc message arrived if (busResult == 2) { std::string data = m_bus->getCycData(); - //~ L.log(bus, trace, "%s", data.c_str()); + L.log(bus, debug, "%s", data.c_str()); m_cycBuffer.add(data); } diff --git a/src/main.cpp b/src/main.cpp index eb6e6874..db87c3b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -82,7 +82,7 @@ void define_args() A.addItem("p_dump", Appl::Param(false), "D", "dump", "\tenable dump", Appl::type_bool, Appl::opt_none); - A.addItem("p_dumpfile", Appl::Param("/tmp/dump_ebusd.bin"), "", "dumpfile", + A.addItem("p_dumpfile", Appl::Param("/tmp/dump_ebus.bin"), "", "dumpfile", "\tdump file name (/tmp/dump_ebusd.bin)", Appl::type_string, Appl::opt_mandatory); A.addItem("p_dumpsize", Appl::Param(100), "", "dumpsize", diff --git a/utils/thread.cpp b/utils/thread.cpp index b1a2c908..34a02d98 100644 --- a/utils/thread.cpp +++ b/utils/thread.cpp @@ -24,8 +24,6 @@ static void* runThread(void* arg) return ((Thread *)arg)->run(); } -Thread::Thread() : m_threadid(0), m_running(false), m_detached(false) {} - Thread::~Thread() { if (m_running == true && m_detached == false) @@ -78,7 +76,3 @@ int Thread::detach() return result; } -pthread_t Thread::self() -{ - return m_threadid; -} diff --git a/utils/thread.h b/utils/thread.h index 0abc32da..3ec70d65 100644 --- a/utils/thread.h +++ b/utils/thread.h @@ -26,13 +26,13 @@ class Thread { public: - Thread(); + Thread() : m_threadid(0), m_running(false), m_detached(false) {} virtual ~Thread(); int start(const char* name); int join(); int detach(); - pthread_t self(); + pthread_t self() {return m_threadid; } virtual void* run() = 0; From c3321d91303c3857781a48865792e295cbd2a2b3 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 21 Apr 2014 21:08:00 +0200 Subject: [PATCH 03/30] class BaseLoop: adapted for Command::calcResult --- src/baseloop.cpp | 37 ++++++++++++++++++++++++------------- src/ebusloop.cpp | 5 +++-- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 53762b98..2ee98165 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -57,7 +57,7 @@ void BaseLoop::start() std::string BaseLoop::decodeMessage(const std::string& data) { std::ostringstream result; - std::string value; + std::string cycdata; int index; BusCommand* busCommand; @@ -90,17 +90,22 @@ std::string BaseLoop::decodeMessage(const std::string& data) if (index >= 0) { std::string type = m_commands->getType(index); - std::string cmd(A.getParam("p_address")); - cmd += m_commands->getEbusCommand(index); - std::transform(cmd.begin(), cmd.end(), cmd.begin(), tolower); + std::string ebusCommand(A.getParam("p_address")); + ebusCommand += m_commands->getEbusCommand(index); + std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower); - L.log(bas, trace, " type: %s msg: %s", type.c_str(), cmd.c_str()); - // send BusCommand - m_ebusloop->addBusCommand(new BusCommand(type, cmd)); + L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); + // send busCommand + m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); busCommand = m_ebusloop->getBusCommand(); + + // decode data + Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); - // decode BusCommand - result << busCommand->getResult().c_str(); + // return result + result << command->calcResult(cmd); + + delete command; delete busCommand; } else { @@ -118,10 +123,16 @@ std::string BaseLoop::decodeMessage(const std::string& data) index = m_commands->findCommand(data); if (index >= 0) { - value = m_cycdata->getData(index); - if (value != "") { - // decode CYC Data - result << value.c_str(); + // get cycdata + cycdata = m_cycdata->getData(index); + if (cycdata != "") { + // decode data + Command* command = new Command(index, (*m_commands)[index], cycdata.c_str()); + + // return result + result << command->calcResult(cmd); + + delete command; } else { result << "no data stored"; } diff --git a/src/ebusloop.cpp b/src/ebusloop.cpp index 323f3fd3..d1373f2a 100644 --- a/src/ebusloop.cpp +++ b/src/ebusloop.cpp @@ -78,15 +78,16 @@ void* EBusLoop::run() // send bus command if (busResult == 1 && busCommandActive == true) { - L.log(bus, trace, " getBus success"); + L.log(bus, event, " getBus success"); m_bus->sendCommand(); BusCommand* busCommand = m_bus->recvCommand(); + L.log(bus, trace, " %s", busCommand->getResult().c_str()); m_recvBuffer.add(busCommand); busCommandActive = false; } if (busResult == 0) - L.log(bus, trace, " getBus failure"); + L.log(bus, event, " getBus failure"); if (busResult == -1) L.log(bus, event, " getBus error"); From d38c30339b78ba91fe692ce887273f5b7f44f73b Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Wed, 23 Apr 2014 14:37:37 +0200 Subject: [PATCH 04/30] BUG: .gitignore changed - missing configure.ac added --- .gitignore | 3 ++- configure.ac | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 configure.ac diff --git a/.gitignore b/.gitignore index 6e9b6338..cb38b040 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ /Makefile.in /aclocal.m4 /autom4te.cache/ -/config* +/config.* +/configure /depcomp /ebus-daemon /ebus-daemon*.tar.* diff --git a/configure.ac b/configure.ac new file mode 100644 index 00000000..c6861ebb --- /dev/null +++ b/configure.ac @@ -0,0 +1,15 @@ +AC_PREREQ([2.69]) +AC_INIT([ebus-daemon], [0.1], [roland.jax@liwest.at], [ebus-daemon], [https://github.com/yuhu-/ebus-daemon]) + +AM_INIT_AUTOMAKE([1.11 -Wall no-define]) + +AC_CONFIG_MACRO_DIR([m4]) + +AC_CONFIG_HEADERS([config.h]) + +AC_PROG_CXX + +PKG_CHECK_MODULES([LIBEBUS], [libebus-0.1 >= 0.1]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT From ec1ce841d07ad8f3b4408ef86b04e032110e20e9 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Wed, 23 Apr 2014 21:49:21 +0200 Subject: [PATCH 05/30] class BaseLoop: ignore daemon socket commands case insensitive --- src/baseloop.cpp | 5 ++--- src/baseloop.h | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 2ee98165..9e46b225 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -66,7 +66,6 @@ std::string BaseLoop::decodeMessage(const std::string& data) std::istringstream stream(data); std::vector cmd; - // split stream while (std::getline(stream, token, ' ') != 0) cmd.push_back(token); @@ -103,7 +102,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); // return result - result << command->calcResult(cmd); + result << command->getResult(cmd); delete command; delete busCommand; @@ -130,7 +129,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) Command* command = new Command(index, (*m_commands)[index], cycdata.c_str()); // return result - result << command->calcResult(cmd); + result << command->getResult(cmd); delete command; } else { diff --git a/src/baseloop.h b/src/baseloop.h index 37549f63..0ca9e217 100644 --- a/src/baseloop.h +++ b/src/baseloop.h @@ -76,11 +76,11 @@ private: ClientCommand getCase(const std::string& item) { - if (item == "get") return get; - if (item == "set") return set; - if (item == "cyc") return cyc; - if (item == "dump") return dump; - if (item == "log") return log; + if (strcasecmp(item.c_str(), "get") == 0) return get; + if (strcasecmp(item.c_str(), "set") == 0) return set; + if (strcasecmp(item.c_str(), "cyc") == 0) return cyc; + if (strcasecmp(item.c_str(), "dump") == 0) return dump; + if (strcasecmp(item.c_str(), "log") == 0) return log; return notfound; } From a8c8c3bd1b06b34a00c62967cc3026b6017f71d5 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sun, 27 Apr 2014 20:40:27 +0200 Subject: [PATCH 06/30] atoX functions replaced with strtoX implementation. --- src/baseloop.cpp | 4 ++-- src/cycdata.cpp | 2 +- utils/appl.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 9e46b225..02a62241 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -102,7 +102,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); // return result - result << command->getResult(cmd); + result << command->calcResult(cmd); delete command; delete busCommand; @@ -129,7 +129,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) Command* command = new Command(index, (*m_commands)[index], cycdata.c_str()); // return result - result << command->getResult(cmd); + result << command->calcResult(cmd); delete command; } else { diff --git a/src/cycdata.cpp b/src/cycdata.cpp index e240f29d..dda75a63 100644 --- a/src/cycdata.cpp +++ b/src/cycdata.cpp @@ -95,7 +95,7 @@ int CYCData::findData(const std::string& data) const return -3; // preapre string for searching command - std::string search(data.substr(2, 8 + atoi(data.substr(8,2).c_str()) * 2)); + std::string search(data.substr(2, 8 + strtol(data.substr(8,2).c_str(), NULL, 16) * 2)); std::size_t index; mapCI_t i = m_cycDB.begin(); diff --git a/utils/appl.cpp b/utils/appl.cpp index 63c3ce5c..6bccd76e 100644 --- a/utils/appl.cpp +++ b/utils/appl.cpp @@ -142,13 +142,13 @@ void Appl::addParam(const char* name, const std::string arg, Datatype datatype) m_params[name] = true; break; case type_int: - m_params[name] = atoi(arg.c_str()); + m_params[name] = strtol(arg.c_str(), NULL, 10); break; case type_long: - m_params[name] = atol(arg.c_str()); + m_params[name] = strtol(arg.c_str(), NULL, 10); break; case type_float: - m_params[name] = (float) atof(arg.c_str()); + m_params[name] = static_cast(strtod(arg.c_str(), NULL)); break; case type_string: m_params[name] = arg.c_str(); From 65df7a998a270a46078309094a482d5128d16669 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Thu, 1 May 2014 11:16:00 +0200 Subject: [PATCH 07/30] config: byte order for ULG corrected. --- contrib/csv/vaillant/ci.csv | 4 ++-- contrib/csv/vaillant/ci.ods | Bin 19166 -> 20106 bytes contrib/csv/vaillant/vpm20s.csv | 2 +- contrib/csv/vaillant/vpm20s.ods | Bin 14451 -> 15407 bytes contrib/csv/vaillant/vwx.csv | 26 +++++++++++++------------- contrib/csv/vaillant/vwx.ods | Bin 20557 -> 21837 bytes 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/contrib/csv/vaillant/ci.csv b/contrib/csv/vaillant/ci.csv index d3137d6b..2a38c176 100644 --- a/contrib/csv/vaillant/ci.csv +++ b/contrib/csv/vaillant/ci.csv @@ -53,6 +53,6 @@ get;ci;EnergyYieldLastYear9;Energieertrag letztes Jahr Monat 9;MS;15;B509;3;0D85 get;ci;EnergyYieldLastYear10;Energieertrag letztes Jahr Monat 10;MS;15;B509;3;0D8548;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;EnergyYieldLastYear11;Energieertrag letztes Jahr Monat 11;MS;15;B509;3;0D8550;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;EnergyYieldLastYear12;Energieertrag letztes Jahr Monat 12;MS;15;B509;3;0D8558;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldDayTransfer;Energieertrag Tagesübertrag;MS;15;B509;3;0D8600;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldSum;Energieertrag Gesamt;MS;15;B509;3;0D8700;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldDayTransfer;Energieertrag Tagesübertrag;MS;15;B509;3;0D8600;1;-;sd;4,3,2,1;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldSum;Energieertrag Gesamt;MS;15;B509;3;0D8700;1;-;sd;4,3,2,1;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;SystemMode;Modus (Heizen/Kühlen/Warmwasser);MS;15;B509;3;0D9700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/ci.ods b/contrib/csv/vaillant/ci.ods index 69613923c51f7ee21e7aa469e45c15bd4f5ad4d3..5810961d935dcf87ae8669250db5ca4e05531f71 100644 GIT binary patch delta 11056 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 delta 10030 zcmZvC1ymeM*X>}zHF(fKfZ*=#?gY2sHn>Y8!3hxD-Gc^q4?%)^fZ*;nIFH=>-S6H1 zf3Mf7>8i79?{jKub%8qjE*iJv>(hDOv9^7`*sDqRgFCMv4_mNw z2#1o>6+>G+VX!IjzR0KQ$yqErD;9MatsVv)>&u2R0#C5v;MS+)jkO3YX4N8p3InRH zpf>tL)+_P_2D+0mM*HA?rCIzhW)hCUr^CRl4}M5?&pP!G?yYF4`jEYpyPBPB*7&-* z%Gsf>O2TAzU>+PxY6Y``hS1K2_tt*mW|lR3VartS@rkCr0bE})5!QI5i}TeTcisn; zf*Jm@z(;zUg$qq+3>B#o19pD&pjc!F6__(q`=7*kxJ z3JH0{*Tm#0#$mEd$T-ePCK}~zT>>F9FyG(5QI7uP^0ddIfLC`ha)ayThJAP8Io_C% zizf@)ML|k2k&ni&-XXUDhlZ9aeBBD{TF`F$KPrk@z1kIg{=Jrcm~4OMs+)tel=sG; zeo|vB+I~pJ2Hu9!ECJbZN@0a>nh+<@>wOwnv6L%`ru4fUtTi+dQQmj)8E01zF7r@% zr$ndVYoE=@>YwArlMOWe7#M}LTA&yTQqQJNO-fYz_`A~FdIbpLefVcaMLtd-A79u1 z-SNue95VkJ0Et+p!%~iy7;)+{Qir8%UVPof-#w>@$rc&~zP*UKKYxGYOZzQQkO}l# zEL!;hTg?sh*$P__?x>~2%CJ(c+UAu`Gn}3(I{(Mh}Ke|YH zTy|Ag@mbrI1G%(q<&5Bd-tcb)OtWlh_bG*P8N~QYG8zqDw@UX3n2PTJ2(co;0_@jn`Ohwa}$z12wYi$0o%$RpmQ9ioj(KQ8F!X{+4ZJ3DxmUT zpBXJJr3*nU77M1Q9@h%2q>05dmbY!Kn_TsrchY!XsgVlNr;_k{*xsN!F+@-2aNP&hXn#$uP@Q785$JWv{vNM7g|E77ncC|(m7y@B`b$fl z7O(lE;R+?Y%C9?sc`ng!@Hpp()!csag}8zbJi`3PZ$|-HFy_)E-6)?8&3te0S z$h-^-1XQ>|fGhD;sBCwXY^IPZ!vX$q!#ku1KI<8%8gfNL>F-yz4GMC2U(ASx1_#kZ-23Tz1+Odzk6<+G zt3?0@0^O5Ii1 zUFJDt?D>*@_lhVodm#YFa|xa9!)oaMbKKC;aP8p2g%jmNt-p*^*6ql~IXzG}8b}VY zXdYcJ9sBO85dGtHMIqBSgFB0F)7^M+g!f3*z%9OG+i~3ktXr+}VyLj5_P92P<-Evr zp=%eeZ{ae{t<75>b$w9U*%HA=8!MZcuyo6>^m$Avey4M2df3VS@?ldWtdJ`Y>>9rH49N11C%rckO2zac%<4BX$tSZCC z@%yUaCm7};_Jf0faAt7N^P^Q2!`<9)qvou?x9yjCPj1KlGqWEL62l0~h&EMq`ZzxL zVGb+I?U$pPS079&?J&HKz2opUQ{p{NbG5;=#zQMDi_OZm(G>UdA%QsGtV8i7>&7 zsHDu|onm|pk*?D0)rNVkv8Tx+3r~6-hg;#%W|QmUNKr*Ion7(3GMFyCVfOg0PHlJ| ze6(z3!=?Dmif(uPfA^=_{ZqSvqx>~HPA{ z5r`m3*E9X4sci7QuR~Yn6WKJX^Q6_+Aui--$|~62@v{`&@EtUXzS>;_HVb}HcLf4n zcZ-&}5$c#J-*0@&Hrr_fdn9~W`nzb_-+af=yyP8IN>H@3HORe_mjpWy1X-V%U4JfohbA%Dx$4ixI}r z;Hi@Hsj=_39K@Y=?( zVsnA3xn(0_>4O7S^PjCm&$;`#j;I%C^I8L(_m0ayEnECDits~oHg<}M0v7y#%vH29 z0M=9Ik-qMIE%>k@kuvRdjD#i*Ol#ja1AYyKBn~KAF@rH zisgc5sI5n;rylvTeR4m+91FtS4~_T-hWpk7japqPFubg#6p{Ez%+(Z-V}UoVF%tMe z3rmgYnBU&qzQqh>=B$O32P~&BDF=Yr`?|r;d!fC%rH|-Mc7nk*VA|;#5tyQ$pw9p| zM*~3^OPd;cqJ5UQ!#3HrAe$JQ(jeQ1xsFv%0ms+#kVr1x&_Fg_G;Z{lXO}-q;EB&y z-FvZ0(esXP#p>?%bUretXX+`tLTG4faa|EoL3r9Mhq{xa=b)%xdQR6J8fju!82#5vw z6oZms6LN9v1{Gg^gS|(PV2lCrR`Cv#kopp5w0`vrL&OEW^0{ky2U=KO%M7Go4Ax>% zvXJr8y3dZZut%aB>Ik1OcyOTKx%i{2LY4Zf3)7O}#3D)eBNRic%1k?@(Iyz^mx{pV zy98WFs;=_y^g}$qBai)>SA23C6^dzVZiI`}8)z{Vi@)?CY>DauvNi!+7f-Xm2rs_Q zh^Zx7g9e-B2VUN0S5p*`o$?B|iQQT2=C6m%P{_$lk8OHNNz5{>yS~tyBSL)Y2;0FA zrq>um2xu=|nC^hp262a5`0wdmuC{K^S;*96 z4)M1eS5=8v$H{&>iZoiAsUX!Zo>jfCsW>}W7T-)$Wcu1Z(2m$(h7Ac>4pd>NVOTsF zi$Z(D=3kXKik~ex`MrZl$MiSyLn;P!KUAoQV=Sqv>FtT=<^lNi;%EiNA=qq0()YWY zVLi?1>%!OUE~I{Z2#TdLDWD_1&->+>+$Y*Q$AzbxTBfg= zpb#ux-Kn%YsuwqD_U-!h(huC7k&z%w>_hWk0J)Im&)E z{bDv%PoKcYpOGM*iTOra9-B@q*1kH4xm2W0NbONfWV4P?M2II}QC~w9&EZ%cZldsF z(t6F6wqwxRE#13>19{i4sdYhj_YQ+G(hIqa?vbWO9_<@j&|$-Moe2fbf=XZK#aJ=< z;4W5gR~q=3<#u_Z*gWF|j`WryO+ z07Uz~0`-fW-^ibSN^C+Dnq+z_-hy#-@w8yO-U3~d9ANMVeKt4A@)ZQ5SVLLHn|hrTz0P?BDO=AjN%+nlIxTqz%bYcJk7 z3m`Dh5V{*&z+nU~5%ZuL$4)_$pX=(OPeIG&6$^X$z#tA|ROz?D{BhcjAPNpvTs3q^ zUQX|EGqH;}$~(Paz{~D@niz1R#~&m5?hW@HW+UKi#E3tz0kjryiWYNvxxPb34(-^@ zv6%|(9?7vlGG~wOcou#yc#7s>fv~~>u-RXuwZW`Fo%p+V@vSb8+MZ|9%5*B71yPj$ zKtvQ=5zV)H!0M;&CYCu9aU~;;jb4R|@T!0*fSK&it{ZNVb6+_?doO6@Orx&Z7gKV0 zA1C6f6tj=eAVXHn3$2jDt4s_xGb7^qr&EHa4qrxxHiM}Q!!v_v2|W|APXm-x25f2m z2ZNcx3EfwepTN%l4;68S`~!R$%*#Y!*PNDh<>k`%X&=?4au8pH@^f0KKK>6~vnYwf zPx}b$e`Zsvhid)p@DDpe%oVnlgzv_)3_U8AyGu1QtWf z4*%sTVpRRH|0Sy*&@|eoKt=Py1O7imDlnS}Ins+z{%VU_-#?L{>1mQxvN`4>BB}g| z3~`R!;BQxdB!ildAIVN{TOFwh&S(!g+&!626Bj)65>DUJ`;VgJ*i2)Tz>G6M>3J6;l4-|8hFWtKs69RqyI_}xrQBinhoZP zmm!Bl*`6mM*)fxx>5vB&(hd*foh^uw!{mV81fg^o3zJyHZVFA*UCny`*Nx=G4!;C* zjDrG+y76&DTI$979N-~#{_3J z8!x&iq%aVa?)F#zMgIe$ZoYtHZ($(v-2&ne|9`le%u9S6l5^%u6yu05F{rE>yq@^K zK3_s&m8886@rLCMcwt~IiMjk8E7XeuT(3ajdvEF{Dg2z*FAK=;YRCPbPR-&&*xo^5 z#Fw+t17@u3E<1Y3q1j@G>B#eJnAeN*TzJ*+^Du`{*C20+AOV;lZ^Y`*A0$R&*z;nh z=>LV_ULg0M3jP9zsV_X(>uL)|qkqtdSKhCVQ`14-^DKDP7D$KW-~JKwZx8Iw3gFwO z>LR%whC3txpuOjr{-;04@E_5n7g4xtjD^4B@Nc*4GI(9xC@|0F(6|IU-)qq9FCb=w z?!5*55~aUD7l~1oWwphsLGw$jnNCpNMO`Fs|F-{$i4Omeph*o3eQ2Dm*Of(H9qRis z-3K@gO9C=LR^!~y-^`v41J zoPVr0>Ns>Xj{3%PqF*bRY}mOZ@0aGU1rqQ#*nw@`fWG`7d{W|>aMpU_X*~AMA?z>5 zCxcxp8k+?9mS~>9PMjwJ-zx|Bre9b~nb5}|cYnSv;#D*U3;rejKZ#~?z)uC`d>8R= zm&pLv((TCOzS5sxtgB~usy58{xX8}5F3lW%Wdpnf_#s`AnAR=6NPkPTkP`%T|6}>Q z)~$7o7LSGE@Jon)&TPon8*^*FoN`H3?Y&4q+?i^&3Cv!okd`~Hm__#iOcmtSQe-JO z%KV#SCxPxHn@z(Z_koamBDJ26WVYum}Ha;jOMLw$txF9`UM38om&$zYaV* z8Le+H)(5!&)bawJipc7-XfGj2B_TVLI!OQH#M9#GqK@<=+w8gBMq*fhZI1W z8+cc2j}YHRoT*2JtC_u{7IoEB2G`rjAg%!4&KooM51Woc>J=L=heA8ge;raeB(UI3 zVu3)0-O&I0kP3~95EuskV#bhwJR$`Qepna#WP|w)8e2jWYEc5o#p1_ipPAg3S27aE zzmvUq6b~el(s+^~qp@YAqnU#SUGPVTXcK`sDCI7)zc$c(fx9^S39*Y@x3MvuKxM^i z;`tPJj9>IJb{Nh!pOPV2`VDmDrXE|EeC~WJ^IZxm3fOI$23lgYt!sEFPt8LibkYc zDMAF)=TL(oHg8yDnM0q85_FOdMKKeD0%Gi~$NYvz&u5d?1$z%SxI?9tM`!|;;sOdt zwwIl{0i$4*)F^H;gy5qrL0-~=ddyL`Fr&V`$s$i$Bo|gx^EAzd+yb#=YrO~t*!p2R z@U$X3_ZIoj0VDTLCO8EO1d@gMe-0S8xHSRCmPxxkY2M@$B4To=n3F64_qt%?O)`Mo z%Ds#|up^v)pb>BK#PIpOQla~BCx70|5X;(<==S#@KYFRNNaTD>@S)U2ffKo%C=e~Y zDeg?_!JIa*O$0YSM))&w+L>2fRg`bTPBA>P!sLeNf|IJQuwgYEFqPG_wF@>H_ywel zf6T;9ufnk3*!hvDDb4u>&wrk0b$!A0!5-O)c%WNP#jSODd9+C^x5Bb^K|Z&hr`KE& z&sH>9Rl5jUU;0%f_K~6*s}A~i|70OiUDLte9!kucA5g=(zi0$uNT$F>$~g?qsnjSS z8tSIM(brASHFri81!t(Nv#O&+lF|Yp8ny=k9zUy3)NjM+_5f0$Lq{C1HWSRnxU!LP z#HN1vlE@=WQJ${_BI}0<`uZ9Jvghr>?O)&h4pv0zg>KfC14GY^a74G!78>&^bYrtF zVg0a}CdW)$xDZD)_V3}gFzqKjtaiIx(wM8+`KF&ZZC>DJshwDmLM+w|j?4rkS9l#D zW!S^}S3+tuDlC38oa5@jC&tDMp5WFj8vJy=O@jIv1uo ztLCc(Y}Q7{;c%pa%x7CMQn?@?7w;&8CNAOb7%+BuMz(-RM0ABK9Nz2p5VGj?j*}7* zxs?)28v2uJFrU3fP`|3Zht7>qMRLZmwU=H_Zmtb@g?ShQj_fEbL`8B_a&~EPZ6- zuj0S>7+P>xg=+Wz79w_+Gq=POoO923U6I*ac~NF4r1D0C2DnY3WU*pY`zD>2sZ{17 z%r4vM8O_A!hhn!h>SPO0M^~Tk3FG)~`=+Eb_mx8AW|Y(JPSew5Y9tsrkp^`)9AF9~ z&)_W`+#OO^s8M}qcjraDseBiFVlgN0T_{El8!A(L;|Oh6h#kZ)Nnt_GReF z-Leyp{K_KOueQr8OMApdabP|XHX#dNR)VZZ@yFmW^u@Kf)3rp)E8Xi_9KAnqF%sd1 zpkm}x2yzIbI*ev0_&9L^V~M4Wi1d6lx&afXCJ*As(YXbX4a z)mD7VBBcp-)+994L}iplQFiEVpY<3iwt;aJCdw8U!5U`wLC2+!igL1S43Ip!>Uwo*qD(nOChkhha;D*p86D?~&anTxie&#gp z8#u%$oMAEnP?Gp;P^0Ex347;jNm9|=BrLX4oP2M_t$RaN%7VwB&Ih}No*qYd-3C6+ zMtD(EQMJiW)0L%Dg?zhxXZfAY!{TNl{V8eEz8`V8Jqnlggs}Z*YeOIw@I++V%xm2IGI`}KiAAJAI3 z{^UKiU!UXRJ^3qoMttd|jYrQEcn*|Z3m=>2AVM%tsELk!pJPIL+w~Qhl`1cn#@}5H z13T8JU7Ssd%(|QF7Kxea3culp+WE(Yl6D|W!E{mFN#*D+#p(y6&`ds`m@qbH3*|`+ zF_t5{-=)rqelu|+a44X~$Fb(@s(6Ky5A)XEd*SlQ)Ml_|0@q?kgY_bU*W7a{aI4mq zf_WY5bhFE***GWe@i-uC&N_MX;jZ~a4G?1R^lP$CpGDBe(<$oB?%^J%CE~@IV7%=g z&+qQ2*m8NCEw<^^iNu=F4U>i^e)*SPTr@Q=r?-;qIKY>9W82Y1b#%cgz{NXuidQVU zT^J9w*;rqMI?s^ZC37dPg^b9xO$Z*s{N(89GHJaNmuoW~`^H(g^2r?d*@TDC0t5}q z50Oz#en1!L^1>uq@S6FVdg?yr3RNvLb*QjI`X+#yp}7BhpDrxj?+ebfs2)K#50>gI z_jB;qWaCf6B1&^?my8SzK+BhZT<;mRkrXnpQMn z?u@)v8|FYw?5IdM-|EK(rH!mECjgv}x#Vi~sa*-*%urelTohXKzHTpQ<4I~lEbi;S zJgq~O&Pg4by*eqXQ@ef*MrYN~MG8WcZqJXjIPkA`mtWK*F0kr}g)`u8@H}ZDA^PYt z{0w`Ji)ew$4FyrnB=dkIE^WTbN(Z6xAbfe6Qn)Z)@L|Yxgp) zLR0^fkRi>Uz~k{XrCsI{;4tM;($@YFBe%eQcQ>;NdAFEocFzX4OzxI9e6+>;oR>AV zwlvr^-At|?!Rs!3v?={lXebc5+??8+5bMpw7VFmO%~osk>%L6Jdrg;6V=TW_F*y|} zhLWp*aAM+9iKL!5k5%fVrg&;Z6pflOrr9Dx9{wSh4+^!NK#Z=@L};uxiZVlwGy0jz zCBITY?z*7}GpkELci3G(tdV%`)I0o4C;x}Gy`QUX=YGt4KS3JKNteKOTHuHD_QFW` z3hyr>2L@W>E%uMQmYI&}ui`xHH!~unXnBMOn_gU8&F{49-hoks4%p6PY z6V2K8Mx$L`!4b>1o4mL{km-)rnHPD0LKHss9-KQb&7(!2t3eVl(cHg9xd@ z(1fm4ak&<9-|A`kjaa7s6I{R+#zQ2t{7T7s{jzxQJaYq+6t~-#Ik&2eo$?EeR~VbG zEpU&V8t4q+qcu8CT*yM|lDoeLnMsLA;R(VpA44mj0<;TVlU}dQpT8xYj0&UI_3m(8 zJ+|K^*wLeKE%-`tZiJ!=W}sB+HTxzxG~05Q$?A0a_U4lAj1K+6Zb)0A2<6R?hf7_! z-2MZ;N1D2bOL>ew5EhU9J4wLwO9{!)*%S$yP5FE;MsiXGM$ZqPE+oXXgXyRJWf;#+ zeuh`MpKbJ--fnI6Fc&f=3+Cb@%kvHzs8&_;$Z9w9C$k{YYSGu`6D|1ny4|5JL{IbQ zV#Gw^*}89N`xm}@J-C}FE0jP6N|L~{+|MjisQu9OAejX201_2Qs^k+NhU?XGy5ieV zV;r0)_f7-Ym3=w#b&S84)%C!rtVq-uGEaz3s_Cz&Uj{{BBv*I(P+rXOO9N6i2(S0I zTHQ}b5_@~luEpJ!R%f&!BNAu_>jY#)zqZT-9vT@$#kydH(Lakyd&sT==_kp|(oe_&+$dEbHI6 ztgI;FpHi^D>K)<}Wm&ZUjQ*WiB7^>Y4N-tVCiY+#Gq4Mzhn=mm927J*2pjZ|i+^V| zFU4m6x@I`zN#$_)|ET|a1xWvz0s`f8gFwzMp0;Mr|3C3~M>#?$-1sQDH)MZg{>>!) z_W-0J8IPgJ@b?0<6$qi@B;#8ZSpNGx#EU2rLhnh&>noC?A%T!UKF}bLy!0Q1{{w#< B7h?bb diff --git a/contrib/csv/vaillant/vpm20s.csv b/contrib/csv/vaillant/vpm20s.csv index c49bbe6a..11900ab2 100644 --- a/contrib/csv/vaillant/vpm20s.csv +++ b/contrib/csv/vaillant/vpm20s.csv @@ -3,7 +3,7 @@ get;vpm20s;Date;Datum;MS;ED;B509;3;0D2400;1;-;sd;1,2,3;hda;-;-;-;-;;;;;;;;;;;;;; get;vpm20s;Time;Uhrzeit;MS;ED;B509;3;0D2300;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm20s;Country;Ländercode;MS;ED;B509;3;0D3900;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm20s;YieldDay;Tagesertrag;MS;ED;B509;3;0D3B00;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vpm20s;YieldSum;Gesamtertrag;MS;ED;B509;3;0D5600;1;-;sd;1,2,3,4;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm20s;YieldSum;Gesamtertrag;MS;ED;B509;3;0D5600;1;-;sd;4,3,2,1;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm20s;SolarNtcFrom;vom Kollektor;MS;ED;B509;3;0D0500;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vpm20s;SolarNtcTo;zum Kollektor;MS;ED;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vpm20s;SolarPower;Solarpumpe Leistung;MS;ED;B509;3;0D1000;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vpm20s.ods b/contrib/csv/vaillant/vpm20s.ods index e33d3f52eadf1308af0852f47d401621f81558af..77347df697016c44fb0a92c4ba115043040460c9 100644 GIT binary patch delta 9059 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 Ms6P*|gnyy_A3mtfApigX delta 8137 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 diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index d95e6681..892fe375 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -3,10 +3,10 @@ get;vwx;BivalentTemp;Bivalenztemperatur;MS;08;B509;3;0D6500;1;-;sd;1,2;d2c;1.0; get;vwx;Bleeding;Entlüften;MS;08;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPower;Solepumpe Leistung;MS;08;B509;3;0DAC01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPowerHeating;Solepumpe Leistung beim Heizen;MS;08;B509;3;0DAE01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;BrinePumpPreRunTime;Vorlaufzeit Quellenpumpe;MS;08;B509;3;0D7600;1;-;sd;1,4;ulg;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePumpPreRunTime;Vorlaufzeit Quellenpumpe;MS;08;B509;3;0D7600;1;-;sd;4,3,2,1;ulg;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpState;Solepumpe Status;MS;08;B509;3;0D1900;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpState;Solepumpe Status;MS;08;B509;3;0DB801;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrineTempInput;T3 Sole Temperatur Vorlauf – von Quelle;MS;08;B509;3;0D0F00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; @@ -17,14 +17,14 @@ get;vwx;CirculationPumpState;Zirkulationspumpe Status;MS;08;B509;3;0D0C00;1;-;sd get;vwx;Code1;Code 1;MS;08;B509;3;0D9700;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Code2;Code 2;MS;08;B509;3;0D9800;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CodeValid;Code 1 und 2 gültig;MS;08;B509;3;0D2400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;CommutationState;Kompressor Kommunikationsstatus;MS;08;B509;3;0DAA00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;CommutationState;Kompressor Kommunikationsstatus;MS;08;B509;3;0DAA00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CompressorNumberStarts;Kompressor Starts pro Stunde;MS;08;B509;3;0D7400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CompressorState;Kompressor Status;MS;08;B509;3;0D1D00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CompressorTempInput;T1 Kompressor Temperatur Eintritt;MS;08;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;CompressorTempOutput;T2 Kompressor Temperatur Austritt;MS;08;B509;3;0D0400;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;Date;Datum;MS;08;B509;3;0D2900;1;-;sd;1,2,3;hda;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;DeicingState;Enteisung Status;MS;08;B509;3;0DCE01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;DeicingWaitTime;Enteisung Wartezeit zur nächsten Enteisung;MS;08;B509;3;0D7000;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;DeicingWaitTime;Enteisung Wartezeit zur nächsten Enteisung;MS;08;B509;3;0D7000;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;EvaporatorTemp;Verdampfer Temperatur;MS;08;B509;3;0D0500;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;ExpansionValveInputTemp;TEV Temperatur Eintritt;MS;08;B509;3;0D0D00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;FlowTemp;VF2 Vorlauftemperatur IST;MS;08;B509;3;0D0300;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; @@ -46,11 +46,11 @@ get;vwx;PowerCutOff;EVU Sperrzeit – Stromunterbrechung;MS;08;B509;3;0D1100;1;- get;vwx;PumpState;Pumpen Status;MS;08;B509;3;0D1800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;RetrurnTempMax;Heizkreis Rücklauftemperatur MAX;MS;08;B509;3;0D7300;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;ReturnTempIntern;T5 interne Rücklauftempertur IST;MS;08;B509;3;0D0A00;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vwx;RunTime;Kompressor Laufzeit Summe;MS;08;B509;3;0D9A00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;RunTimeHeating;Kompressor Laufzeit Heizung;MS;08;B509;3;0D9B00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;RunTimeHotWater;Kompressor Laufzeit Warmwasser;MS;08;B509;3;0D9C00;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RunTime;Kompressor Laufzeit Summe;MS;08;B509;3;0D9A00;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RunTimeHeating;Kompressor Laufzeit Heizung;MS;08;B509;3;0D9B00;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;RunTimeHotWater;Kompressor Laufzeit Warmwasser;MS;08;B509;3;0D9C00;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;ServiceMode;Servicezeit;MS;08;B509;3;0D6600;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;SoftwareState;Software Status;MS;08;B509;3;0DCF00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;SoftwareState;Software Status;MS;08;B509;3;0DCF00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;SwitchValve;Umschaltventil Heizen = 0 / Warmwasser = 1;MS;08;B509;3;0D1000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;TempOutside;Aussentemperatur;MS;08;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;TempSpreadMax;Zulässige Temperaturspreizung T6 zu T7;MS;08;B509;3;0D6E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -60,7 +60,7 @@ get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;1,2; get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Weekday;Wochentag;MS;08;B509;3;0D2A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;BrineTempInput;Kalibrierung Quelle Eintritt;MS;08;B509;3;0DCD00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;BrineTempOutput;Kalibrierung Quelle Austritt;MS;08;B509;3;0DC900;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;CompressorTempInput;Kalibrierung Kompressor Eintritt;MS;08;B509;3;0DC600;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -72,16 +72,16 @@ get;vwxcal;OutsideTemp;Kalibrierung Aussentemperatur;MS;08;B509;3;0DC300;1;-;sd; get;vwxcal;ReturnTemp;Kalibrierung Rücklauftemperatur RF1;MS;08;B509;3;0DCB00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;TankTempBottom;Kalibrierung Speicher Bodentemperatur;MS;08;B509;3;0D3401;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;TankTempTop;Kalibrierung Speicher Kopftemperatur;MS;08;B509;3;0D3301;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxeh;CommutationState;Zusatzheizung Kommunikationsstatus;MS;08;B509;3;0DB100;1;-;sd;1,2,3,4;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;CommutationState;Zusatzheizung Kommunikationsstatus;MS;08;B509;3;0DB100;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;ElectricHeaterModeHeat;Zusatzheizung für Warmwasser;MS;08;B509;3;0D6300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;ElectricHeaterModeHotWater;Zusatzheizung für Heizung;MS;08;B509;3;0D6400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;ElectricHeaterState;Zusatzheizung Status;MS;08;B509;3;0D5F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;ElectricHeaterType;Zusatzheizung Typ;MS;08;B509;3;0D9200;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;Hysteresis;Zusatzheizung Hysterese;MS;08;B509;3;0D7E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;IntegralStartValue;Zusatzheizung Energieintegral Startwert;MS;08;B509;3;0D7F00;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxeh;RunTime;Zusatzheizung Laufzeit Summe;MS;08;B509;3;0DA100;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxeh;RunTimeHeating;Zusatzheizung Laufzeit Heizung;MS;08;B509;3;0DA200;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxeh;RunTimeHotWater;Zusatzheizung Laufzeit Warmwasser;MS;08;B509;3;0DA300;1;-;sd;1,2,3,4;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTime;Zusatzheizung Laufzeit Summe;MS;08;B509;3;0DA100;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTimeHeating;Zusatzheizung Laufzeit Heizung;MS;08;B509;3;0DA200;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;RunTimeHotWater;Zusatzheizung Laufzeit Warmwasser;MS;08;B509;3;0DA300;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxhw;FlowTemp;VF1 Bufferspeicher Kopftemperatur;MS;08;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwxhw;HotWaterTempMax;Warmwasser Termperatur MAX;MS;25;B509;3;0D8200;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxhw;HotWaterTempMin;Warmwasser Termperatur MIN;MS;25;B509;3;0D8300;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index 65cbb4f01498de125aca4102ab9e2774a431e483..35e92f21c29ebd1611a1a1d615ce13be94f8411d 100644 GIT binary patch delta 13200 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�#9YDw-<)OQU~)k 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 delta 11860 zcmaKSWmp|Sw(Y@Pli+fKyF0<%-95MmcMcZZ5AN;`!5snwcY?bHcju9rxp!vnk5}tQ z@7>+i{Z)6>s=dCw$I2kaav)F@WuTxx0s!y;0F{4;NF1sn^xtFc*F4;R7+`ojAZUpT z-S^C(=RT7wme}@-KWc8WjAsi+pj6dKdJXoZ=)5NxuE^UXnE4caL7pJiku#GYBI)|1 z?y=#i()-mHw{{*fs9?xTet%=q5(15>z`FI4G zop{a7%}+fWQt*J;(^@Jj568ADq4#}?jX*au+X^pt_v5{;%=v*|m6Ohyz8E1}XLl2v zu$M6$YUrl5mbOIZRW}5-(>jWhAknc>?K}4|zC`C*(z`kJCjM*DU7&F9Sc)2&`Nyyulk| zthL%=E?6-7C080$8 zP;d&SVoD-tVidOPeBs+PjiH1KuBn1<{jWB`4#7eumS&fA^!!?J=2lbO13n`uTo*9E zYZOGPP?A=*sK6@5O1AN1an5c5pOA@Q^Na?Gztv87$nuXoJNL|4P&!eiOKWvG<)PzQ z`v-Uv8(~q~httm0K*X+x#4B3XZ@FrteU*N)FtZM}(kT_6bw04J3vMid9voRXd)|VE zv99eX&$)MyT|$w?5YmiXeR)=A^6l<+X1hDJLx(@bE!~i9k;+#41+~)Fe(leOqRKR* z%P|<42%F9%xG%Q|0LeZoRyB!7-e>e16JV6)v`c4eclw-q(9 zcozcJvDXwRKItgZT(>61h+F01}a(a>X3bg2|yzwf9BZq zmzETxH0_-PMlT-82iyyOWX`4!;SnU8%pm^y5h-?Y07t{JNjuxD7)w>z?mLBO@8Jc^ zu4n~86Z0(POTIP?XLoaiNZy9B1s|f)=(XFG10fk=NDxdI;k`f}LQt}H-Gchzn~T3! zA)ak1Y)5z`E{Lh<#$@0&h6@*y2*7IJUpHA(PGL_48j5jz5nGu8(L-ldhI9!p7`9c` z%^+(h#wW2i?w)#OM+9mg9=%@gjaGUU|9-<(l!1fq_=ASo2L%8m5&!`IT>0?u@c&r( zfd6Pn@3yhMowKQ(GlRRW4OpL;lE64#(Lcx3YxZn%rt0XIub;19(B465c1)4b*(gNV|Xxnn<@`sO|V=P=&@?Ua25^A|5@a|RAh zA)EfNQuo@#=XkVb$LfL?4K<5@`9ne1!LLWn8|7jJ`ztYp&ZuYQ^ztU6>rfMgislHp{~Tw8E6s9Z=0z<; zqKVSeb?pqrcZY9cKYOc#B`+&fy#mCK&~KVszcRSy9y*yFEy$T~F1gHjY_hlMkziGs z2L_s#OONTam(8{xIzf@NF(%mi?CYKoJiEPK)ar*BPI(;~o9idiYT9oO5)kqE@b7zn zE#o)3uSFXLRVIzJ@%D8UN1uZ3&N~g`!%O>C&xlSj*E8E4h(^6EkD7<0dGbWT%k`KK2tIl zb+~VrOPBN1R?P217l_nYFpU=-WA+~lSHLh_ha-|O3bqrfkV$H;HGyX@y@nIlr1v8C`p1+~&6EUy+c0^X5J!4h4OW8en^c_Qiy;VrP;#)4$T2xs?Tv7;p6C+bo_O8gJB|R>)Nzukk6T z@ODT<<_#VYn&wP4noy)YqhMpGuga~{D+!nLAlp(-+=m`9nan+}4I*R1mLq zmJ|L%S;|7!>_tS4om?tvq$04yPU8*}FY)1ezvex#s)u`-+F6nwrni*Pu~X|xZCdP>vZBDZcN&lfznN3 z$}!FsmKAc#WVgHEkTlPn+_xoTr3p$mQZI3h8D9=8S80g5*+g%pc#R1;LQfYs5dZbG zQ=ov_@NVT|pm;v?qwvJ|%lN*G0VKqcLOT*4$u(F1M$8$17yqG0De5th|4&e1=%6r~ ze#7F){Z_y&RccDLD~3Q?J55gr>K-Nnujg@&lJCcZVVY@-f(4)Hv@dJ&2zF8p+w!(3 zp$9cJJ2Q<{I(_0M!|jVQC1xQJl$<&OiEwXb*N>4Z;)FcEacaGO)G8m24TCybL`lSZ zlU=ROniT9Mz$s)zp!-U+KN3SCt@7-f+q8TAqv zE&Vf|MCFA0J5J&Gwv_Q)l$B$d@U)F>jjGSfy`*qcsmh2u&jK2B84;Rg*EaDwij&); zB07qvFam3r4_`==)+_cv-wUtv*5|gq2CO^?rB*2yj@#zVf<`RLK{`~kbDxfA#E#1l zT|VHeir{eyaUUvsRy5q-t1FfqLi_M{kU>vo1n3s7_gq$kgY`dmjXA%Dka(y6l9})Q zs#|CeNp4zKz;fsJT%e;k6p@H!#p5=njcp~wJ7C4LFuugIIG^)PdxDSc=rb1KhBpu9 z^>HIF<3MMOtG2Gg*{Q>Tn1bS#n4a|Ra&|}@PT-q_60S&u{bQMC2!0W5L^MolTIpxV zmq#%smwgVmZHqF_IbJWmx2l~f$%S+y-N6DY*;UZTSGN7CK*<-S(V?0~)Ia;9U{nev zIM|aY)F^2Yuo;CE>)rl}!bF7o*R7amIm@Y>#m-RQ1(ZD+BcB*w0rEm$!ypd(RBn)h-0y`1J=OiDRC1 z?#E_*Wpzes)bkwxOLhK@-qJUZq8zdFmQ*hx_O?Z%|^x!PLs7b!+)b_~?C*Log|TCWqf7KLgUQ&?HZRX@A<$+6e6 zgQ8aSRWfJwiXw!gR7;d_5iZ=P*rm>}&$ZW44jyf~jgU>%q5g3}qejD`8Ww%V5^RyO zkyy)9L4u}+Xa-yAGL@z3<)r>db7 zOoOzNd~^qN2Lw@F7gG{c1}pexF{1QTc%JWIJb9~c;~)3?h0ao(3{D;}L+G(^;EUwn zqI@QSL?MLxq+!c<3BUaBT8nMi4T-wpHoyRHRQdSFKLCC)xNMCd8f_dOWsdPfGibtz zt*LYMCv%1#9SuS1a4Cz>X4viay)(uGFKjuC`=q9Ek#f*BkbQne2u#Q4I5@D#BB2E+ zbLR>``dIY~$v>Gigl2=f3H#l4}hmd{j2+$OL?b9 z6SJ$yA@-*?qU)>W^pkFrZXO41JlBN(i%h}}%zrtnD^G;1n*;oDks&*p~l^q=g9695EE>u-K-m_1f)d96+_m9Q{CU|_e70>2`lKJDV!Q;QK&pA zVK&3MT3`w5{1qa_5DFAB&3w7e9$E zYBd~b-oRM8;Yh@~#=3G#wk4vhh%5>H3%jdif=iXPIsOfS4YUajI&vs{%$SAFhP}~T zHA0etKW$?{;pH6YsX;>p#VXS*l|gzj6^sp^c@T1p)6t%SSTt;FC|)1g5)#B5ehb~R z11ZslxcPtb82b?f89;qw8mtiXyGmqQ{OWHSd6ft+bw&*y_o2%;-$ZM|m%`%#liD2k z`wQR)3BZ}&yZZ@9@|wJG%_*m7PO@um`fD2t@^*X%@iBxFh$}61nX0$_7e&MpBv!;4s0L@q?^ernpX0W93`(;VY>bQhY8zp)} zFV5rdIh|t<`mw|ocsfMGKUlOrv#$<2wh7Jr5B`3QnabLD|DwQmq?f_)pDlw(wiqVL z#>uhy!pZ4@zM9n#6RtzsSi4cBYw|8dq69nM6g#4G|+tWS7t43RVEoMYe7 zBH5a_%i&)T_%DpKN%g%#rkf$f`pIE7Vd|7JnB62x&P$ z38Q6IbB(vM)n95g)+yErVP~c1a~;>`D51Y>{xk_}n&qj=X+eyYwTjApXQr44t^+MF z!xf?F-9kWJNpVHqP%6UGa9|@1oFpF1(r{Gc{E~wDWJapwuZF#pnf3@W6ozY(_(nfe z1fS{LT*|L^OTl(nk@ZrMDq@bmAe$=!v5(pT$5Qo z%Qmt*EEN@f69OKMDiVzQ_vjatJ}sl&Nv&Do4$NQHl8isI*d7Eibz6jOdRv zL}y)a^%Cv|()o9Eh#+{NXbw(4=_gtAb=Y2Rl+pvH;mB0zcZMJ{Oy`*&gyL^^=E zW_kR*f1DJKM8vG43VS)Owc}d)ZGeNjP`c&#`R?rP8;umNP%QQkExAXcf{;Ft(L}Sy zj|lcU+>bY#E8+nA=x3mfqj`TKh1qSvTQ`5arugM1nuDB(#IhToVK%FyEf|rB9VIuf zd^jjI1up5e&GQ~C%OuZG11n;ZlkUAD>Czl0$caM&wd`k$*u&AT@Y8`#plO+-d+czR zQNCW{dvmcYY7uydNgR|34rdxq^6;2U`&o5t9te zmn7~O5TXBIxA6w^c?x?rrn?QPd*n!UnPG+GD+k(8CnmD4kOJ_YNP?$6_8U)E-92QR$EO(H-MtwTIl0k3L+Zw^gliouM z$g((ScNiWYpY=;$GRy%3uplBZ4V4O!=^(Ls&Y&*+*NfqI@{27&(Wd>!IMY0lpB96r zH&z_ZQSK=q))O>1s=i-STSst7X2+Y`iasW+L;wy|E{_xEwXZd)EMxg$4pk7zH$Z88 zLSg1o@|Wvh-!@~Yz7ih2N04!K-r**_fEBoCK{h|U=@w=XP+7K zJKgZsn0opIKlA*wloT689KhA=rTU~C8+|1+nX7TW4REi6%_601MA`7z8tieD%=tXZ zHxe8?YqWUlbfi#r#o3AG1zu*;KrmZ$F!Ja8)7KB?WyhoZXxsDSouWe;Q3Z8!=qIr( zkQ!i?Se|yw`OmD!hhu6OTF#|blE7eZb`p@*C{H<0C4%wdTZqT>}SGc1GU^x?-xyjF!)EZ@RHbWIzx5&lpl48Cw^M*HWm|7%8$~N8}1~GD~rwq z7aZDNL?KOJMLT>sY%ipde~qB#yJARMquIzF2sU(FKm ze31W{`=+#j;aKut;F<_~X1fg=I z0Bmr@06YN7p3fr7*`Ieo$1$v)@&MB~996j%67LFqksc54QHnMiS1T_H?x2RMX-qI1<&jX0pFprQvf0@*vlOw3}QbC8Qhtb3W z(tlUXaA*=563XAd`}iS2&`|4xW>dChwbR~}? zsnVXw#5>R8smF)!6TlpT8y}kc2`)wBve7!H7-rXoXjhXtozpy4+M@|n6e%(x7_e|X zK?rRDon)Id1&>n^Lg84yoL4-ZM}=f;S>WPl&!e!)F%f$mHM=h~l)L0SF6aFD5QQht z3aTR=>#5SQbC+|6BZsSDAnhj zH5=r_oJgplf{mov+Y~n+dcSF)!P6qR<7(`2WX1u3T)mRS z7D%K%9I7HUSg-^qMwK4H1@`)|@bk_vg==BWDs7mIeGPbR@;9(ev@mYfB80wky?L^J zwH0~>l1>OXP?4XH5s8X>RTK@Le8l@e9H12EU*8qBZdE%!5=NSeFd{=Q0il;x;UFRW znI4-~4v2y9=nWj`*U_jHYkwuNY~yKs5x!=k+VQKlVo{Yfkc{XW>QQP7zytf@=Uc=L z+}3r73%gm|fP{Sau?n&^SAO^LnMFce13cpeCx~+3Cc&iF{eDD(XgQQnLp30VWz2Xw zf3M3eB04LiQ=ta561Z6v=c6#w{x3YKcJs#r)7w5!d3{69pe7mbMGUs~;&CGav29a( z<_BWggce5lO#wp^CXAwdh%rAi+>MFvIr;w0SV#xlEkAlnWEdn@PL*A&Df2RkU#*}J z0DT+?eMj9)hB!>4!B)+)N@>uUHm5FE08Z8x zU6zoL6OzobY0hX;d{3vGS&Cd$C@Po)NNL={lpEC4 z;jFJ&O9j#CovwxLI@PBWVwuF6YSbET8s_SSbwN^dFK6v*HtlXV1H+&-DdV$Ujri+L z)lIczk4~$!;`+JAL;CFqE8}*|juQktvB;3A9akbH0jYvD!yHfjeuoI+8P$0trgpB-aY z0EYq4|DUwjdyX7nYYK8U`kNGs0xQHU1JQq;y?n%K(?I^MPbnU)QC60vZiS{(+BD?9 zn1Ce$?VjoTv<0$k95af^dgw?Ugj$H%m#3`WXsrbqML?0}be0|Mo69 z8HvE`F8t&JN3nq_oGw~=;ca)Kc!u0msgaf52sIJ7aSLsh2s*b;Q;66b)}p<#4)G28 zwiSfj7mMm)wHjAbRyH)Nr$o)LQtIZJR{+d0TG>F5!PQ!v+Vql(I{ra!ePTKlI#E>Y zf?Eia+NJS$P%ztsioTd38e(g4Q68{~NBDS>Ty*5v12B~UFCJI3^^NNY^v z(GvH~;7_ISGZvnA-)nC2<)}VU44Oj_nlzaTUjrP9=I^y29Qd>d$Oe6D+{*Am8#Do- zpdUgQT4uyOf^24bR|Tl3owEM%BvB7V4=-Sr7mqg|9f8vkk`~BYO7lUF0>g&5-Z~08 z+i;$6u3N>;wENKtb`>vAU3@x)4f%$I199klHt3b*Rpu36k3tb^$g}|+pQ?9a^KG$8 zpo<3kJ2M)w0VL=)a;v{@Gv91AWeNE^him(!&#dp;ZG>;NkM7GZMD;>eR1#`q69l3P zpOk@5!l>jv6G+P}DrSiTH5rFOzYf{RFW%IO(IH59%~GpKzpk{7)`n^EG_rYxSB$aL z##~zG5Gi}d+^m0hO&-~;E|Z#m%ChANZ^YGC%G)Q(1s@JWwgZYm-<$DyTWPt#vVkpf z)y}OxeSPCMd&SSMMm6&RMr}C}jkOac1j~Z_d0_Hj7mzV-28SSZ!fwoTk``i9&xi0r zH7FH#lQ}AJgwLP1ly!$uR8LiU7V2rEs?0TV%)FqCEi;(6XjJ#2zo_oXx7Y(_qPjcp z1}LY8Uat-p_^P%9T^XcxloAQO;u=zLU0MVNnhg_OhcYs2kz}vthkTPu+@f~ce#P0)ShK#&UzO;G2;#WLzwT0=0$ zG@;4UucOZqls|X1Zqr%rN_u_=ica*;aSLrcR6qUMt!fZ+Q<5zBJSpR8Jk zcFSx!+S$ugntA|-v$<0Y)q0%Qe{C8*Bx8$-pGEy=wuZjqCGr*J?T4*dxhQGhv~_%* zA-n=;c`_e`{rOlYc-%hJFy3II4tKmbaQ@q$eQs1@?)|Wb7(3GS1uhS0NNPIj13Q$dT4Q)w#9_W^Zx^D8xFP9H9|2u^C{R-d zg1WkVW>7;WrD6j%b1!gFh(o~7Et~WYe(jr}v+S6V!jXa){WLg+P>!|DNwFCL0apAu zD$q@=DW-?8QmtfB=0uUJAlnECM!&?%C|q}X;zE~EF7$Fyl-(H1`1djw#lxBPs%p~1 zD<@dyBGTvU$Fwg+7g(0;Q0=e^zxP*E=?5%j)OB9Y1m5U1d2tGGG6GE5X@`DKcpf5v zIy(T5o;x2JKK$~ZufSeA8gR$2UC9npQ`S&ptwWp<`NG_ATmli7KArdr4fs^4B{wwKg|((A3L~){DN!P>YG*3L5m#S1Q3rxB(RilUx$I z3|TsIbpz!3R#W}VIr^(nBco}65iAiTx;4ok*oS;X;Jm$hx@0~hru0u3<*o7Ss(O~U zvg~>ujut4gaQGP!YA=XR+%xrHx3Jvj+g!SqTy5Q0yqui?uS%&@G}(R#DQ{(1kkmH_ zq7rp|OYCEw%HME37X0wD4?xA8K*LzHamsjdYTZwJ#m+s{;k1AJk3`0m(n{?zGh_C) zom}|&HFmbIg!p}VF^Dx7v4D;{m|l1b5&R;_!QAL~_`n9rP zDXI=Y1`cZ)e#4bfYAr>Ks3WiNjV>0~G>xV-=;D#kuN-KSppAiW*=5ct`2q`@IOr$p zL8r2}jB&=Q_7GsRX>)sv_r;*q?)El77t~OOtEj;a6<%g$s5pl#sX7MR{MsLHyXdH` zu#m0UNUtaBRZg=?R5=O*noVr+%VWW|V07Yc;8!h{1h3f;pCyZJUidDqcO`{0iLRzY znd09Fx^9#cY|;k6tiiD7cisb(^F!K&IY%M(U95<(McG#F=gG+Q?`WZC)xXM?jK1%)gD-3B@QAUj0* zyBULCvdJ<69`>oK&k>}aAMKA%tJaUJM3+y@$0 zWZ`j!U4WrWbn#dDxmuK9AA698J<31|=1$cXwa)|Hs7B;Lk>J?#d2lU{*sc^Nw66^a z@jSzD+AVZeXF)#3ryn7HU5(SjK4cMPFC+c+sZ`vBEw@YwOUcS$HA7nzqNq2tx4Voi zk7*e-j7pCqBPOviYlyy|Qc7>2a^lx)-j_Q?Vlf3LMOgH9TfP>eY#L_lU zJ6lBI)IuA`MJ^1KxEJ%{+lwG%_?Un=IE#~o*XtkLBi-?NsBSyZ9nzqmvPgl8 z9;h$gJS#<-f^pa@iv`DTKLSDsFIVIqOZbe|jqn%_^X0g6l3g8ta+JIh!}Ab*Z$@0j z&a~p!m;E8?d=~5}-236h{bI>$GjNbfxJDD-Ly-1&)e9BN)RFI`#25vkQu`Sxbif^m zGIiOLxG)W#pzk=*diJPL*$x#qae&Lzz;RycI_H>i)R-bF&|Z08fZ7*odU4(ZYJW(q z70uv+qjKn)8j-Ft_#mZJPd46vat`Wv@&NbG;mjHZKFO*P)vxMGW{N#tCL9#`^cDEM zF}TN4YggO>2Fr`7H2rG*NT;KtIm!$WrvD-E*=sR4B|jta$|-fLB={!{??4<1nGIak zkZZ#(!k~%1qp`D7TWDwlo8iP-$}t*gXwG&G{^zTKhEoqli#H+rIN=buL(WF2H|hqJ zJYYm=MD#aDvcqeCHYJ}Q`Ag^nW$mB+q?kqPx|ofy4<+Ruq!!VvgmnjAkNg=xBqLOB zyop^1r;bsqv!){4&m2~_@ zhf5e}-WB2V_#RBr9~X<38L4_5>aBX>tR8yLrawip%qlI{6SKC?%Dk{h-9D|xk@uHV#9s`{FWyORM^!a5~OZCBQK^~eve{KE26mEGrXDB~@?hWE^urIr;2KD2; zXz_dG{|)x*@ntz7-b)<+S>p&!mQ(p>RkOAn_dkq!M+GB@f1X-UWcjCoq9ly^w+8y( zwUS^xB|6aGQ~#+G{}xI9yWJ7~SIMNJ3IUy!k)n$X^-x?>7A9uc-W|ru@IX z{&QTCi2v^MZl&-808Y*xHl|L0#pwU-*l=et4fC#k0^ijS@_+UFE)7;x#`^acX;a37 z?3V#AD6{`_@OJM$zAQLgnI8Cez`~0r(ZKfyi9rJZpZ@DXnzCS^8Zjy&01@B~2>`Uo I{k{7C0JZT*rvLx| From 30c6d2e5e10d0c4b116948a6d5ebf3b35ae7a277 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Thu, 1 May 2014 11:26:04 +0200 Subject: [PATCH 08/30] config: old configuration files deleted. --- contrib/csv/vaillant/old/vaillant_cyc.csv | 14 -- contrib/csv/vaillant/old/vaillant_cyc.ods | Bin 14106 -> 0 bytes contrib/csv/vaillant/old/vaillant_get.csv | 244 ---------------------- contrib/csv/vaillant/old/vaillant_get.ods | Bin 20824 -> 0 bytes contrib/csv/vaillant/old/vaillant_set.csv | 95 --------- contrib/csv/vaillant/old/vaillant_set.ods | Bin 20808 -> 0 bytes contrib/csv/wolf/wolf_cycle.csv | 8 - contrib/csv/wolf/wolf_cycle.ods | Bin 26080 -> 0 bytes 8 files changed, 361 deletions(-) delete mode 100644 contrib/csv/vaillant/old/vaillant_cyc.csv delete mode 100644 contrib/csv/vaillant/old/vaillant_cyc.ods delete mode 100644 contrib/csv/vaillant/old/vaillant_get.csv delete mode 100644 contrib/csv/vaillant/old/vaillant_get.ods delete mode 100644 contrib/csv/vaillant/old/vaillant_set.csv delete mode 100644 contrib/csv/vaillant/old/vaillant_set.ods delete mode 100644 contrib/csv/wolf/wolf_cycle.csv delete mode 100644 contrib/csv/wolf/wolf_cycle.ods diff --git a/contrib/csv/vaillant/old/vaillant_cyc.csv b/contrib/csv/vaillant/old/vaillant_cyc.csv deleted file mode 100644 index 041e42ae..00000000 --- a/contrib/csv/vaillant/old/vaillant_cyc.csv +++ /dev/null @@ -1,14 +0,0 @@ -# type;class;cmd;comment;msg type: 1=BROAD, 2=MM, 3=MS;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment -cyc;broad;date_time_temp;Datum, Uhrzeit und Aussentempertur;BR;FE;0700;9;-;4;temp;md;1,2;d2b;1.0;°C;-;Temperatur;day;md;8;bdy;-;-;-;Wochentag;date;md;6,7,9;bda;-;-;-;Datum;time;md;5,4,3;bti;-;-;-;Uhrzeit -cyc;broad;load_VF_temp;Speicherladung und Vorlauftempertur;BR;FE;B505;4;27;3;load;md;2;bcd;1.0;-;00,01;Speicherladung;temp;md;3;d1c;1.0;°C;-;Temperatur;stat;md;4;bcd;1.0;-;-;Status;;;;;;;; -cyc;broad;date_time;Datum, Uhrzeit;BR;FE;B516;8;00;3;day;md;7;hdy;-;-;-;Wochentag;date;md;5,6,8;bda;-;-;-;Datum;time;md;4,3,2;bti;-;-;-;Uhrzeit;;;;;;;; -cyc;broad;temp;Aussentemperatur;BR;FE;B516;3;01;1;-;md;2,3;d2b;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;mv;VF1_temp;Vorlauftemperatur VF1;MS;08;B509;3;290100;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; -cyc;mv;RF1_temp;Rücklauftemperatur RF1;MS;08;B509;3;290700;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; -cyc;mv;VF2_temp;Vorlauftemperatur VF2;MS;08;B509;3;290300;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; -cyc;mv;brine_in;Quellentemperatur;MS;08;B509;3;290F00;2;temp;sd;3,4;d2c;1.0;°C;-;Temperatur;stat;sd;5;bcd;1.0;-;-;Status;;;;;;;;;;;;;;;; -cyc;amu;high_eff_pump_stat;Hocheffizenzpumpenstatus;MS;08;B509;3;29B801;1;-;sd;3;bcd;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -cyc;cir2;heat_pump_stat;Status Heizkreispumpe;MS;08;B509;3;29B901;1;-;sd;3;bcd;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;cir2;date_time_temp;Datum, Uhrzeit und Aussentempertur;MS;50;B504;1;00;4;day;sd;7;hdy;-;-;-;Wochentag;date;sd;5,6,8;bda;-;-;-;Datum;time;sd;4,3,2;bti;-;-;-;Uhrzeit;temp;sd;9,10;d2b;1.0;°C;-;Temperatur diff --git a/contrib/csv/vaillant/old/vaillant_cyc.ods b/contrib/csv/vaillant/old/vaillant_cyc.ods deleted file mode 100644 index f289937bac75e2453f9b2b72ef19e3f042d3ba44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14106 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 Kuehlung > Heizung;MS;50;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;50;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;min_diff;min Diff VL / RT;MS;50;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;holiday_cooling;Kühlen im Ferienbetrieb;MS;50;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;statbit_cooling;Statusbit Kühlfunktion;MS;50;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;cooling_request;HK spezifische Kühlanforderung?;MS;50;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;heat_pump_stat;Status Heizkreispumpe;MS;50;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;50;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;50;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;heat_pump_heat;Heizkreispumpe Standardwert;MS;50;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir2;heat_pump_pause;Heizkreispumpe in Pausen;MS;50;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# Heizkreis 4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;mode;Heizkreis - Betriebsart;MS;52;B509;3;0D2B00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;type;Heizkreis - Kreis Typ;MS;52;B509;3;0D3C00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;rt_day;Heizkreis – Raumsolltemperatur;MS;52;B509;3;0D3200;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;rt_night;Heizkreis – Absenktemperatur;MS;52;B509;3;0D3300;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;curve;Heizkreis – Heizkurve;MS;52;B509;3;0D3500;1;-;sd;1;d1b;0.010;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;at_off;Heizkreis – Aussentemperatur Abschaltgrenze;MS;52;B509;3;0D3600;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;vl_min;Heizkreis - minimale Vorlauftemperatur;MS;52;B509;3;0D3000;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;vl_max;Heizkreis - maximale Vorlauftemperatur;MS;52;B509;3;0D3100;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;pre_hours;Heizkreis - max. Voraufheizung in Stunden;MS;52;B509;3;0D3800;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;estrich;Heizkreis Estrichtrocknung Tag;MS;52;B509;3;0D3B00;1;-;sd;1;bcd;1.000;dd;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;floor_protect;Fußbodenschutz;MS;52;B509;3;0D7B01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;cooling;Kühlbetrieb;MS;52;B509;3;0D8C01;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;cooling_support;Kühlbetrieb supported/ für freigegeben;MS;52;B509;3;0D8601;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;outdoor_24h_average;Außentemperatur mittel 24h;MS;52;B509;3;0D8801;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;cooling_offset_outdoor;Kühlung Offset AT-Abschaltgrenze;MS;52;B509;3;0D8701;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;locktime_cool>heat;Sperrzeit Kuehlung > Heizung;MS;52;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;52;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;min_diff;min Diff VL / RT;MS;52;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;holiday_cooling;Kühlen im Ferienbetrieb;MS;52;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;statbit_cooling;Statusbit Kühlfunktion;MS;52;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;cooling_request;HK spezifische Kühlanforderung?;MS;52;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;heat_pump_stat;Status Heizkreispumpe;MS;52;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;52;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;52;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;heat_pump_heat;Heizkreispumpe Standardwert;MS;52;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir4;heat_pump_pause;Heizkreispumpe in Pausen;MS;52;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# Heizkreis 5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;mode;Heizkreis - Betriebsart;MS;53;B509;3;0D2B00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;type;Heizkreis - Kreis Typ;MS;53;B509;3;0D3C00;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;rt_day;Heizkreis – Raumsolltemperatur;MS;53;B509;3;0D3200;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;rt_night;Heizkreis – Absenktemperatur;MS;53;B509;3;0D3300;1;-;sd;1;d1b;0.500;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;curve;Heizkreis – Heizkurve;MS;53;B509;3;0D3500;1;-;sd;1;d1b;0.010;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;at_off;Heizkreis – Aussentemperatur Abschaltgrenze;MS;53;B509;3;0D3600;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;vl_min;Heizkreis - minimale Vorlauftemperatur;MS;53;B509;3;0D3000;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;vl_max;Heizkreis - maximale Vorlauftemperatur;MS;53;B509;3;0D3100;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;pre_hours;Heizkreis - max. Voraufheizung in Stunden;MS;53;B509;3;0D3800;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;estrich;Heizkreis Estrichtrocknung Tag;MS;53;B509;3;0D3B00;1;-;sd;1;bcd;1.000;dd;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;floor_protect;Fußbodenschutz;MS;53;B509;3;0D7B01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;cooling;Kühlbetrieb;MS;53;B509;3;0D8C01;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;cooling_support;Kühlbetrieb supported/ für freigegeben;MS;53;B509;3;0D8601;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;outdoor_24h_average;Außentemperatur mittel 24h;MS;53;B509;3;0D8801;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;cooling_offset_outdoor;Kühlung Offset AT-Abschaltgrenze;MS;53;B509;3;0D8701;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;locktime_cool>heat;Sperrzeit Kuehlung > Heizung;MS;53;B509;3;0D8401;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;53;B509;3;0D8501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;min_diff;min Diff VL / RT;MS;53;B509;3;0D8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;holiday_cooling;Kühlen im Ferienbetrieb;MS;53;B509;3;0D9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;statbit_cooling;Statusbit Kühlfunktion;MS;53;B509;3;0D9701;1;-;sd;?;hex;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;cooling_request;HK spezifische Kühlanforderung?;MS;53;B509;3;0D8301;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;heat_pump_stat;Status Heizkreispumpe;MS;53;B509;3;0DB901;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;heat_pump_curr;akt. PWM-Wert Heizkreizpumpe;MS;53;B509;3;0DBA01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;heat_pump_load;Heizkreispumpe bei Pufferladung;MS;53;B509;3;0DBF01;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;heat_pump_heat;Heizkreispumpe Standardwert;MS;53;B509;3;0DC001;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;cir5;heat_pump_pause;Heizkreispumpe in Pausen;MS;53;B509;3;0DE101;1;-;sd;1;d1b;1.000;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/old/vaillant_get.ods b/contrib/csv/vaillant/old/vaillant_get.ods deleted file mode 100644 index 05cf37ab41b8ff9642e3ff2be77bc8ebf89db32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20824 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 z 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 Kuehlung > Heizung;MS;50;B509;4;0E8401;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;cir2;locktime_heat>cool;Sperrzeit Heizung > Kühlung;MS;50;B509;4;0E8501;1;-;sd;1;bcd;1.000;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;cir2;min_diff;min Diff VL / RT;MS;50;B509;4;0E8B01;1;-;sd;1;d1c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;cir2;holiday_cooling;Kühlen im Ferienbetrieb;MS;50;B509;4;0E9501;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -set;cir2;heat_pump_pause;Heizkreispumpe in Pausen;MS;50;B509;4;0EE101;1;-;sd;1;d1b;1.000;%;-;%;;;;;;;;;;;;;;;;;;;;;;;; -#Boiler;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -set;hw;mode;WW/ Betriebsmodus;MS;25;B509;4;0E2B00;1;-;sd;1;bcd;1.000;-;-;01=Ein 02=Aus 03=Auto;;;;;;;;;;;;;;;;;;;;;;;; -set;hw;temp;WW/ Solltemperatur;MS;25;B509;5;0E8200;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;hw;min_temp;WW/ Min. Temperatur;MS;25;B509;5;0E8300;1;-;sd;1,2;d2c;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;hw;legionella_protect;WW/ Legionellenschutz;MS;25;B509;4;0E4000;1;-;sd;1;bcd;1.000;-;-;00=Aus 01=An;;;;;;;;;;;;;;;;;;;;;;;; -set;hw;legionella_wday;WW/ Legionellenschutz Wochentag;MS;25;B509;4;0E7C01;1;-;sd;1;bcd;1.000;-;-;00=Mo 01=Di 02=Mi 03=Do ... ;;;;;;;;;;;;;;;;;;;;;;;; -#set;hw;legionelle_starttime;WW/ Legionellenschutz Startzeit;MS;25;B509;6;0E6700;1;-;sd;1;???;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -#Shortcuts;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -set;short;cir2_party;Quick/ Party-Modus;MS;50;B505;2;0A;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;short;cir2_rt_day;Quick/ Raumsolltemperatur;MS;50;B505;2;01;1;-;sd;1;d1b;1.000;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;short;cir2_mode;Quick/ Heizkreis Betriebsmodus;MS;50;B505;2;02;1;-;sd;1;d1b;1.000;-;-;01=Ein 02=Aus 03=Auto 04=Eco 05=Absenken;;;;;;;;;;;;;;;;;;;;;;;; -#set;short;cir2_curve;Quick/ Heizkurve;MS;50;B505;2;03;1;-;sd;-;???;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;short;party;Quick - Partymodus;MS;50;B505;2;05;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;short;hw_load;Quick - WW Speicherladung;MS;50;B505;2;06;1;-;sd;1;bcd;1.000;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -set;short;cir2_save;Quick/ Sparen bis..;MS;50;B505;2;07;1;-;sd;1;d1c;1.000;-;-;21.5 = 21:30 Uhr;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/old/vaillant_set.ods b/contrib/csv/vaillant/old/vaillant_set.ods deleted file mode 100644 index b346275384b62516c7bb77ca3656457a74c4c2f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20808 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 LRQ-8u3Ece;A(DLU diff --git a/contrib/csv/wolf/wolf_cycle.csv b/contrib/csv/wolf/wolf_cycle.csv deleted file mode 100644 index 3092a165..00000000 --- a/contrib/csv/wolf/wolf_cycle.csv +++ /dev/null @@ -1,8 +0,0 @@ -# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment -cyc;broad;date_time;Datum, Uhrzeit und Aussentempertur;BR;FE;0700;9;-;4;temp;md;1,2;d2b;1.0;°C;-;Aussentemperatur (Wolf Gastherme: Ersatzwert);day;md;8;bdy;-;-;-;Wochentag;date;md;6,7,9;bda;-;-;-;Datum (Wolf Gastherme Ersatzwert: FFFFFF);time;md;5,4,3;bti;-;-;-;Uhrzeit;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;betrd;regler;Betriebsdaten des Reglers an den Feuerungsautomaten;MM;03;0507;9;-;7;status;md;1;hex;-;-;-;Statuswärmeanforderung;aktion;md;2;hex;-;-;-;tbd;brauchwasser;md;3,4;d2c;1.0;°C;0-2000;Brauchwassersollwert;solldruck;md;5,6;d2b;1.0;bar;0-100;Kesselsollwertdruck ;stellgrad;md;7;d1c;1.0;%;0-100;Stellgradanforderung;kesselsolltemp;md;8;d1c;1.0;°C;0-100;Kesselsollwerttemperatur ;brennstoff;md;9;bcd;-;-;-;Brennstoffwahl;;;;;;;; -cyc;betrd;feuerung;Betriebsdaten des Feuerungsautomaten an den Regler;BR;FE;0503;8;-;8;block;md;1;bcd;-;-;-;Block Nummer;status;md;bcd;hex;-;-;-;Feuerungsautomatstatus;zustand;md;3;hex;-;-;-;Feuerungsautomatzustand;stellgrad;md;4;hex;-;-;-;StellgradKesselleistung (Wolf Gastherme Ersatzwert: FF);kesseltemp;md;5;d1c;1.0;°C;-;Kesseltemperatur ;ruecklauftemp;md;6;d1b;1.0;°C;-;Rücklauftemperatur ;boilertemp;md;7;d1b;1.0;°C;-;Boilertemperatur ;aussentemp;md;8;d1b;1.0;°C;-;Außentemperatur -cyc;sollw;regler;Sollwertübertragung des Reglers an andere Regler;MM;03;0800;8;-;5;kesselsolltemp;md;1,2;d2b;1.0;°C;-;Kesselsollwert;aussentemp;md;3,4;d2b;1.0;°C;-;Außentemperatur;leistungszwang;md;5;d1b;1.0;-;-;Leistungszwang;status;md;6;hex;-;-;-;Status;brauchwassersolltemp;md;7,8;d2b;1.0;°C;-;Brauchwassersollwert;;;;;;;;;;;;;;;;;;;;;;;; -cyc;solar;ertraege;Solardaten Erträge ;MM;50;5018;0E;-;6;leistung;md;1,2;d2b;1.0;-;-;Solarleistung;ertraglow;md;3;d1c;1.0;-;-;ErtragTagLow;ertraghigh;md;4;d1c;1.0;-;-;ErtragTagHigh;ertragsummelow;md;5;d1c;1.0;-;-;SummeErtragLow;summertraghigh;md;6;d1c;1.0;-;-;SummeErtragHigh;ertragsumme;md;7;d1c;1.0;-;-;SummeErtragM;;;;;;;;;;;;;;;; -cyc;solar;temp;Solardaten Temperaturen;MM;50;5017;10;-;3;pumpe;md;1;d1c;1.0;-;-;SolarPumpe;kollektortemp;md;3,4;d2c;1.0;-;-;KollektorTemp;wwsolartemp;md;5,6;d2c;1.0;-;-;WWSolarTemp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;solar;regler;Solardaten Regler;MM;50;5014;7;-;4;status;md;1;d1c;1.0;-;-;StatusSolar;mischersolltemp;md;3,4;d2b;1.0;-;-;MischerSolltemperatur;raumtemp;md;5;d1c;1.0;-;-;Raumtemperatur;wwsolltemp;md;7;d1c;1.0;-;-;SollWarmwasser;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/wolf/wolf_cycle.ods b/contrib/csv/wolf/wolf_cycle.ods deleted file mode 100644 index bb30a8a719171c8dd9747857ada67c0ef0e9ee40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26080 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 Date: Thu, 1 May 2014 22:40:22 +0200 Subject: [PATCH 09/30] class BaseLoop: query for negative results added. --- contrib/csv/vaillant/vwx.csv | 1 + contrib/csv/vaillant/vwx.ods | Bin 21837 -> 21930 bytes src/baseloop.cpp | 16 +++++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index 892fe375..7565caa6 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -51,6 +51,7 @@ get;vwx;RunTimeHeating;Kompressor Laufzeit Heizung;MS;08;B509;3;0D9B00;1;-;sd;4, get;vwx;RunTimeHotWater;Kompressor Laufzeit Warmwasser;MS;08;B509;3;0D9C00;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;ServiceMode;Servicezeit;MS;08;B509;3;0D6600;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;SoftwareState;Software Status;MS;08;B509;3;0DCF00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;HeatPumpState;Heizungspumpe Status;MS;08;B509;3;0DD000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;SwitchValve;Umschaltventil Heizen = 0 / Warmwasser = 1;MS;08;B509;3;0D1000;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;TempOutside;Aussentemperatur;MS;08;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;TempSpreadMax;Zulässige Temperaturspreizung T6 zu T7;MS;08;B509;3;0D6E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index 35e92f21c29ebd1611a1a1d615ce13be94f8411d..026afc819a8627cf075449f49bad443ce4fdd652 100644 GIT binary patch delta 13174 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 diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 02a62241..8827df60 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -98,13 +98,19 @@ std::string BaseLoop::decodeMessage(const std::string& data) m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); busCommand = m_ebusloop->getBusCommand(); - // decode data - Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); + if (busCommand->getResult().c_str()[0] != '-') { + // decode data + Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); + + // return result + result << command->calcResult(cmd); + + delete command; + } else { + result << busCommand->getResult().c_str(); + } - // return result - result << command->calcResult(cmd); - delete command; delete busCommand; } else { From cc0bb053f9bc825120fb35472e6541d601e52dce Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 2 May 2014 13:01:15 +0200 Subject: [PATCH 10/30] config: byte order for FLT corrected. --- contrib/csv/vaillant/vwx.csv | 8 ++++---- contrib/csv/vaillant/vwx.ods | Bin 21930 -> 21943 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index 7565caa6..ce902f01 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -1,7 +1,7 @@ # type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment get;vwx;BivalentTemp;Bivalenztemperatur;MS;08;B509;3;0D6500;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Bleeding;Entlüften;MS;08;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPower;Solepumpe Leistung;MS;08;B509;3;0DAC01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -31,7 +31,7 @@ get;vwx;FlowTemp;VF2 Vorlauftemperatur IST;MS;08;B509;3;0D0300;2;temp;sd;1,2;d2c get;vwx;FlowTempIntern;T6 interne Vorlauftempertur IST;MS;08;B509;3;0D0900;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;FrezzeProtectionTempMin;Einfrierschutz T81;MS;08;B509;3;0D7A01;1;-;sd;1;sch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;HeatPumpState;Heizkreispumpe Status;MS;08;B509;3;0D1700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;Hysteresis;Kompressor Hysterese;MS;08;B509;3;0D7D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;InitialCurrentLimitation;Anlaufstrombegrenzung;MS;08;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Integral;Energieintegral;MS;08;B509;3;0D8000;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -57,8 +57,8 @@ get;vwx;TempOutside;Aussentemperatur;MS;08;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0; get;vwx;TempSpreadMax;Zulässige Temperaturspreizung T6 zu T7;MS;08;B509;3;0D6E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Time;Uhrzeit;MS;08;B509;3;0D2800;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Undercooling;Unterkühlung;MS;08;B509;3;0D8E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;1,2;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Weekday;Wochentag;MS;08;B509;3;0D2A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index 026afc819a8627cf075449f49bad443ce4fdd652..20663405f6fde1f95f687e1ac5d70ca0f2a9dd6b 100644 GIT binary patch delta 11077 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 H|M34G#GXQb delta 11078 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 From 7c4012cbe5ee15ebd0dea96ffd094c28a6785ce1 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 2 May 2014 19:03:42 +0200 Subject: [PATCH 11/30] config: byte order for UIN and SIN corrected. --- contrib/csv/vaillant/ci.csv | 48 +++++++++++++++--------------- contrib/csv/vaillant/ci.ods | Bin 20106 -> 20096 bytes contrib/csv/vaillant/vpm20s.csv | 8 ++--- contrib/csv/vaillant/vpm20s.ods | Bin 15407 -> 15408 bytes contrib/csv/vaillant/vpm3035w.csv | 4 +-- contrib/csv/vaillant/vpm3035w.ods | Bin 17230 -> 18178 bytes contrib/csv/vaillant/vr603.csv | 4 +-- contrib/csv/vaillant/vr603.ods | Bin 20495 -> 21328 bytes contrib/csv/vaillant/vwx.csv | 20 ++++++------- contrib/csv/vaillant/vwx.ods | Bin 21943 -> 21946 bytes 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/contrib/csv/vaillant/ci.csv b/contrib/csv/vaillant/ci.csv index 2a38c176..62554f51 100644 --- a/contrib/csv/vaillant/ci.csv +++ b/contrib/csv/vaillant/ci.csv @@ -29,30 +29,30 @@ get;ci;NameHeatCircuit16;Name Heizkreis 16;MS;15;B509;3;0D4178;1;-;sd;1,10;str;- get;ci;PhoneNumber1;Telefonnummer 1;MS;15;B509;3;0D4200;1;-;sd;1,9;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;PhoneNumber2;Telefonnummer 2;MS;15;B509;3;0D4208;1;-;sd;1,9;str;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;HeatBufferAvailable;Bufferspeicher vorhanden;MS;15;B509;3;0D5C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear1;Energieertrag aktuelles Jahr Monat 1;MS;15;B509;3;0D8400;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear2;Energieertrag aktuelles Jahr Monat 2;MS;15;B509;3;0D8408;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear3;Energieertrag aktuelles Jahr Monat 3;MS;15;B509;3;0D8410;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear4;Energieertrag aktuelles Jahr Monat 4;MS;15;B509;3;0D8418;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear5;Energieertrag aktuelles Jahr Monat 5;MS;15;B509;3;0D8420;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear6;Energieertrag aktuelles Jahr Monat 6;MS;15;B509;3;0D8428;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear7;Energieertrag aktuelles Jahr Monat 7;MS;15;B509;3;0D8430;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear8;Energieertrag aktuelles Jahr Monat 8;MS;15;B509;3;0D8438;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear9;Energieertrag aktuelles Jahr Monat 9;MS;15;B509;3;0D8440;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear10;Energieertrag aktuelles Jahr Monat 10;MS;15;B509;3;0D8448;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear11;Energieertrag aktuelles Jahr Monat 11;MS;15;B509;3;0D8450;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldThisYear12;Energieertrag aktuelles Jahr Monat 12;MS;15;B509;3;0D8458;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear1;Energieertrag letztes Jahr Monat 1;MS;15;B509;3;0D8500;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear2;Energieertrag letztes Jahr Monat 2;MS;15;B509;3;0D8508;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear3;Energieertrag letztes Jahr Monat 3;MS;15;B509;3;0D8510;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear4;Energieertrag letztes Jahr Monat 4;MS;15;B509;3;0D8518;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear5;Energieertrag letztes Jahr Monat 5;MS;15;B509;3;0D8520;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear6;Energieertrag letztes Jahr Monat 6;MS;15;B509;3;0D8528;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear7;Energieertrag letztes Jahr Monat 7;MS;15;B509;3;0D8530;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear8;Energieertrag letztes Jahr Monat 8;MS;15;B509;3;0D8538;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear9;Energieertrag letztes Jahr Monat 9;MS;15;B509;3;0D8540;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear10;Energieertrag letztes Jahr Monat 10;MS;15;B509;3;0D8548;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear11;Energieertrag letztes Jahr Monat 11;MS;15;B509;3;0D8550;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;ci;EnergyYieldLastYear12;Energieertrag letztes Jahr Monat 12;MS;15;B509;3;0D8558;1;-;sd;1,2;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear1;Energieertrag aktuelles Jahr Monat 1;MS;15;B509;3;0D8400;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear2;Energieertrag aktuelles Jahr Monat 2;MS;15;B509;3;0D8408;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear3;Energieertrag aktuelles Jahr Monat 3;MS;15;B509;3;0D8410;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear4;Energieertrag aktuelles Jahr Monat 4;MS;15;B509;3;0D8418;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear5;Energieertrag aktuelles Jahr Monat 5;MS;15;B509;3;0D8420;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear6;Energieertrag aktuelles Jahr Monat 6;MS;15;B509;3;0D8428;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear7;Energieertrag aktuelles Jahr Monat 7;MS;15;B509;3;0D8430;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear8;Energieertrag aktuelles Jahr Monat 8;MS;15;B509;3;0D8438;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear9;Energieertrag aktuelles Jahr Monat 9;MS;15;B509;3;0D8440;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear10;Energieertrag aktuelles Jahr Monat 10;MS;15;B509;3;0D8448;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear11;Energieertrag aktuelles Jahr Monat 11;MS;15;B509;3;0D8450;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldThisYear12;Energieertrag aktuelles Jahr Monat 12;MS;15;B509;3;0D8458;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear1;Energieertrag letztes Jahr Monat 1;MS;15;B509;3;0D8500;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear2;Energieertrag letztes Jahr Monat 2;MS;15;B509;3;0D8508;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear3;Energieertrag letztes Jahr Monat 3;MS;15;B509;3;0D8510;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear4;Energieertrag letztes Jahr Monat 4;MS;15;B509;3;0D8518;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear5;Energieertrag letztes Jahr Monat 5;MS;15;B509;3;0D8520;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear6;Energieertrag letztes Jahr Monat 6;MS;15;B509;3;0D8528;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear7;Energieertrag letztes Jahr Monat 7;MS;15;B509;3;0D8530;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear8;Energieertrag letztes Jahr Monat 8;MS;15;B509;3;0D8538;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear9;Energieertrag letztes Jahr Monat 9;MS;15;B509;3;0D8540;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear10;Energieertrag letztes Jahr Monat 10;MS;15;B509;3;0D8548;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear11;Energieertrag letztes Jahr Monat 11;MS;15;B509;3;0D8550;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;ci;EnergyYieldLastYear12;Energieertrag letztes Jahr Monat 12;MS;15;B509;3;0D8558;1;-;sd;2,1;uin;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;EnergyYieldDayTransfer;Energieertrag Tagesübertrag;MS;15;B509;3;0D8600;1;-;sd;4,3,2,1;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;EnergyYieldSum;Energieertrag Gesamt;MS;15;B509;3;0D8700;1;-;sd;4,3,2,1;ulg;-;kWh;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;ci;SystemMode;Modus (Heizen/Kühlen/Warmwasser);MS;15;B509;3;0D9700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/ci.ods b/contrib/csv/vaillant/ci.ods index 5810961d935dcf87ae8669250db5ca4e05531f71..9fd4ee1716b4c3480dd9d53a99fcfeab1ab9d6a4 100644 GIT binary patch delta 3109 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 delta 3153 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 delta 8273 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 diff --git a/contrib/csv/vaillant/vpm3035w.csv b/contrib/csv/vaillant/vpm3035w.csv index 9a8e45a0..c0d246c9 100644 --- a/contrib/csv/vaillant/vpm3035w.csv +++ b/contrib/csv/vaillant/vpm3035w.csv @@ -2,10 +2,10 @@ get;vpm3035w;Ntc1Sensor;Ntc1Sensor;MS;0A;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vpm3035w;Ntc2Sensor;Ntc2Sensor;MS;0A;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vpm3035w;Ntc3Sensor;Ntc3Sensor;MS;0A;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vpm3035w;Vortex;Wirbel, Bypass?;MS;0A;B509;3;0D0300;1;-;sd;1,2;uin;-;hz;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;Vortex;Wirbel, Bypass?;MS;0A;B509;3;0D0300;1;-;sd;2,1;uin;-;hz;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;CircoPumpPower;Zirkulationspumpe Leistung;MS;0A;B509;3;0D0400;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;PumpDutyCycle;Pumpe Einschaltdauer;MS;0A;B509;3;0D0500;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vpm3035w;MixerPosition;Mischer Position max. 220 Schritte;MS;0A;B509;3;0D0600;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vpm3035w;MixerPosition;Mischer Position max. 220 Schritte;MS;0A;B509;3;0D0600;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;ElectricHeater;Elektrische Zusatzheizung;MS;0A;B509;3;0D0800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;HeatDemand;Heizanforderung;MS;0A;B509;3;0D0900;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;OperatingMode;Betriebsart;MS;0A;B509;3;0D0A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vpm3035w.ods b/contrib/csv/vaillant/vpm3035w.ods index b5607c137d72205ee2ec0e41ffd40954dd44636b..7f09b4196fe00fa69521cb193b4678e55acb5720 100644 GIT binary patch delta 9702 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 diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index ce902f01..b9740fb7 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -2,7 +2,7 @@ get;vwx;BivalentTemp;Bivalenztemperatur;MS;08;B509;3;0D6500;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Bleeding;Entlüften;MS;08;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPower;Solepumpe Leistung;MS;08;B509;3;0DAC01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPowerHeating;Solepumpe Leistung beim Heizen;MS;08;B509;3;0DAE01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -14,8 +14,8 @@ get;vwx;BrineTempOutput;T8 Sole Temperatur Rücklauf – zur Quelle;MS;08;B509;3 get;vwx;CirculationPumpInput;Zirkulationspumpe Eingang;MS;08;B509;3;0D0B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CirculationPumpPower;Zirkulationspumpe Leistung;MS;23;B509;3;0DE601;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CirculationPumpState;Zirkulationspumpe Status;MS;08;B509;3;0D0C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;Code1;Code 1;MS;08;B509;3;0D9700;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;Code2;Code 2;MS;08;B509;3;0D9800;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Code1;Code 1;MS;08;B509;3;0D9700;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Code2;Code 2;MS;08;B509;3;0D9800;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CodeValid;Code 1 und 2 gültig;MS;08;B509;3;0D2400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CommutationState;Kompressor Kommunikationsstatus;MS;08;B509;3;0DAA00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;CompressorNumberStarts;Kompressor Starts pro Stunde;MS;08;B509;3;0D7400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -34,13 +34,13 @@ get;vwx;HeatPumpState;Heizkreispumpe Status;MS;08;B509;3;0D1700;1;-;sd;1;uch;-;- get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;Hysteresis;Kompressor Hysterese;MS;08;B509;3;0D7D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;InitialCurrentLimitation;Anlaufstrombegrenzung;MS;08;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;Integral;Energieintegral;MS;08;B509;3;0D8000;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;IntegralStartValue;Energieintegral Startwert;MS;08;B509;3;0D7C00;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;Integral;Energieintegral;MS;08;B509;3;0D8000;1;-;sd;2,1;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;IntegralStartValue;Energieintegral Startwert;MS;08;B509;3;0D7C00;1;-;sd;2,1;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;MixerPosition;Mischer Position -100 – 100;MS;08;B509;3;0D0E00;1;-;sd;1;sch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;NoiseReductionFactor;Lautstärken Reduktion Faktor;MS;08;B509;3;0D2401;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;NoiseReductionState;Lautstärken Reduktion Status;MS;08;B509;3;0DA901;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Overheating;Überhitzung;MS;08;B509;3;0D8D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;PhaseOrder;Drehfeld Status;MS;08;B509;3;0D5701;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;PhaseOrder;Drehfeld Status;MS;08;B509;3;0D5701;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;PhaseState;Phasen Status;MS;08;B509;3;0D8800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;PowerCutOff;EVU Sperrzeit – Stromunterbrechung;MS;08;B509;3;0D1100;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;PumpState;Pumpen Status;MS;08;B509;3;0D1800;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -59,7 +59,7 @@ get;vwx;Time;Uhrzeit;MS;08;B509;3;0D2800;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;; get;vwx;Undercooling;Unterkühlung;MS;08;B509;3;0D8E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Weekday;Wochentag;MS;08;B509;3;0D2A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxcal;BrineTempInput;Kalibrierung Quelle Eintritt;MS;08;B509;3;0DCD00;1;-;sd;1,2;d2c;1.0;K;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -79,7 +79,7 @@ get;vwxeh;ElectricHeaterModeHotWater;Zusatzheizung für Heizung;MS;08;B509;3;0D6 get;vwxeh;ElectricHeaterState;Zusatzheizung Status;MS;08;B509;3;0D5F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;ElectricHeaterType;Zusatzheizung Typ;MS;08;B509;3;0D9200;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;Hysteresis;Zusatzheizung Hysterese;MS;08;B509;3;0D7E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxeh;IntegralStartValue;Zusatzheizung Energieintegral Startwert;MS;08;B509;3;0D7F00;1;-;sd;1,2;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxeh;IntegralStartValue;Zusatzheizung Energieintegral Startwert;MS;08;B509;3;0D7F00;1;-;sd;2,1;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;RunTime;Zusatzheizung Laufzeit Summe;MS;08;B509;3;0DA100;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;RunTimeHeating;Zusatzheizung Laufzeit Heizung;MS;08;B509;3;0DA200;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxeh;RunTimeHotWater;Zusatzheizung Laufzeit Warmwasser;MS;08;B509;3;0DA300;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -99,8 +99,8 @@ get;vwxmk;DesiredTempLow;Absenktemperatur;MS;50;B509;3;0D3300;1;-;sd;1;d1c;1.0; get;vwxmk;FloorProtectionTempLimit;Fußbodenschutz Temp > VF2;MS;50;B509;3;0D7B01;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;FloorScreedDryingDay;Estrichtrocknung Tag;MS;50;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;FlowTempDesired;Vorlauftemperatur Soll;MS;50;B509;3;0D4600;1;-;sd;1;d1c;1.0;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxmk;HeatingCircuitType;Heizkreistyp;MS;50;B509;3;0D3C00;1;-;sd;1,2;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwxmk;HeatingCurve;Heizkurve;MS;50;B509;3;0D3500;1;-;sd;1,2;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;HeatingCircuitType;Heizkreistyp;MS;50;B509;3;0D3C00;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vwxmk;HeatingCurve;Heizkurve;MS;50;B509;3;0D3500;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;OperatingMode;Betriebsart;MS;50;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;50;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;PreHeatingTimeMax;Voraufheizung MAX;MS;50;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index 20663405f6fde1f95f687e1ac5d70ca0f2a9dd6b..d8a63c1a1455803b0023fd048ec2ebcb07ba77b5 100644 GIT binary patch delta 13390 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 delta 13382 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 Ku&Mpi{r>^+WfWQf From b6ec718d34ec7d6fdd1a7c28cf9ded98dc305703 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 2 May 2014 21:41:04 +0200 Subject: [PATCH 12/30] BUG: missing folder m4 added. --- m4/.info | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 m4/.info diff --git a/m4/.info b/m4/.info new file mode 100644 index 00000000..e69de29b From 6a5bdd28c5af89058c04a406da53553c9c929127 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sun, 4 May 2014 21:53:19 +0200 Subject: [PATCH 13/30] class BaseLoop: daemon command SET implemented. --- contrib/csv/vaillant/vwx.csv | 1 + contrib/csv/vaillant/vwx.ods | Bin 21946 -> 21976 bytes src/baseloop.cpp | 92 +++++++++++++++++++++++++++-------- src/main.cpp | 1 + src/network.h | 2 +- 5 files changed, 75 insertions(+), 21 deletions(-) diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index b9740fb7..da8ec25c 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -95,6 +95,7 @@ get;vwxhw;TankTemp;Speichertemperatur IST;MS;08;B509;3;0D0000;2;temp;sd;1,2;d2c; get;vwxhw;TankTypePipe;Speichertyp ist Rohr;MS;25;B509;3;0DCD01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;CoolingOperatingMode;Kühlung Betriebsart;MS;50;B509;3;0D8C01;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;DesiredTemp;Solltemperatur;MS;50;B509;3;0D3200;1;-;sd;1;d1c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +set;vwxmk;DesiredTemp;Solltemperatur;MS;50;B509;4;0E3200;1;-;sd;1;d1c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;DesiredTempLow;Absenktemperatur;MS;50;B509;3;0D3300;1;-;sd;1;d1c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;FloorProtectionTempLimit;Fußbodenschutz Temp > VF2;MS;50;B509;3;0D7B01;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwxmk;FloorScreedDryingDay;Estrichtrocknung Tag;MS;50;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index d8a63c1a1455803b0023fd048ec2ebcb07ba77b5..23352b1b56369a15dbe4b4a35864fe30deb1163b 100644 GIT binary patch delta 12664 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°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 lLH5ySqC@TdYWNx8m;p=zsrp-(7FL zJ!`MbH<_&LWM`6@B=hA^ZRJp?D)KO}*Z=?`03a8hmx!tg^On>a=M(%*Aqa#dU<21Y ze*7+x?!3NZ0tS;MgUkao|5>fdJhf|PQTkFc<0R5WLvYY6=x}(J{^}@$?^8s=win4- zb%$fibM4jH05p3XEgfB}yk=`ae-RpaeG)q%H~U%&$xgS!{v}79@no*Yx)?b-5fWMP z8FFjJ*``HH0c;F5-FgJxyE9T2FjBjWpG?z8RC|52t#LYye9VuIf)??+0XuG#z7bZi z>;hvt12)pa^`1wW;!lomAO;%_A8qWytKuB1?_r}K(~8Qp7sfhW&Of+FbA3}=JurT} z9cgxi=1xVyoQQUFJ-^}2(^4z=u?hYCtavtA;&8Q^?Y%T^7=N&ljGwsxEm*6INK%s4 z{F?ib;YV@6(wS~S@KXrU260f=i+{?i2lo?5lH->2`p~w~$(7N65XK+=JpyxXJqvPJ zcxA&Uis$IcIAfH)FZI$8WNHIZI%%}TN9<`txA z@7KG8GS@|G4_|a4K3G3@LhuF1d@ltP>a1r-#;pYAHsw^!BP>{gI^mh@A<}!nv|Cdp z394=6)$>mJamUAZ1=k8{ZV#Tc-YlhiC*5gkv6s-9U`Juu404OxC?1;gDX1u2?EsZZ zE{{4|R52jf?>DOIwFW4FAcp;@NvmIC6> z{W%*T*tjD(wfF2!WMFLev4Vir&G^8COd_HR!DtiVfX7FBa&dUrI|&;A^Lke^^$_3AKc;q`*8iZP`neeRAe%@ejS9)KWsz;w(HF`=@I9rcFTWX5^N_L zV^&Xj*9phw;YJyCt$Ef;R$IQ|Ap;3PQs*J z2_&$qB54>&(4c(UxqM;{X?eK0zh>ccX51-B(N@=9heEHzn&EsF<%>(-KIXTPxnnqc971Y0w44Vr zZT?`y_&xDfmwST{ZZb>b3bHc389EORidO^q+FSc;{)h}W@~Q=YI=u z)Op^79dGWHqQcl8zF5QOyPfyo_SL7FqX$tI&SGoN)BOy-g2mc`<>5l#AFku~ z8g}8y&pUAT+$S^c_arLv2#8b&Yn(th0N{xj0Qk?Giin8#cTRzJFksoD1FQZc(Ox-dG!3~!mB+!KIBi{l+=z%ITp{_G{$)S2?N|j|vo#16&wupiB@1MxKtZ@}mFg}0x;}nX*C-`UXf}nka zev<5)hwnH^T=To~`YwybR8?m=xt71XA0I5i@tn8p8QMWIn(&(Y_h;^#N8!(5h+Rw` zdpXRoQjU)%za?#30zrU)a+8LpY9RS*X2>w~|~g+^!bRDQ0v$_$Yt1+J8y0E;2` zg+l##vgIm+`&~XC&jSa+#U4w1T)Lh9`pr*@Fom|V&aSDV!{KL`X{Ei_r06^Iddwk4 zlPPyf>x6+KUNi3@BA=66v(DFX*BP_6%>JbEtoYWHb9akt%coZuTZ2#OD|R-2T69%G ztt1E=vnyYJ#-`*x5S1jvd{9d5?!rz6qtK^n_z|?Rm+7q;ID6kkc(q|wIq=*99ax)0 zjK}4hW-jY0n>w4dl`ZusSe9;@^%|eunvVaN>)HA=Cth?O@93<3t9+B}S}uukWLhKK z`ypMgBv)5{&9)!27*@_r$+nMe$QG~sX8Ne5e7|YK=Ydig+~CMOl$EQxqG%1)cQBB! zZ=aP}i2Lnw2s~Jd?d(h*+?nP3-Q?-1-Ydh@yefucTlrpDFjWshb*<{O z@PV}7^@-tbFVWaWeyZ#zb7!rxZZ(U0?Js=A8as#KF}Xhvr;lckvhOSo z=FOFpWVtuXM2cns&5xSb60X+nOw8pZE5n>cLX1gMIDqK9Q?Q!&Bw-kDJ2du(R zAGDvB#B-~vRJ7?#v^7i8=W__BTIhylQ>Xk22Zox1#K)-jqW7uD0{&oc(?6qq0cUbv z$=%yqT#6)bEGZb);o@%5`(e@2L8wyN5w>Yog2X>nG^o_K+RnDA$S<yl z!G}(J9ptK_*X{v!w-R$`npeEIZ~WS}l6>ZFIhezOFj)@N>DOKaBm41RMPi53bbPtg z2KW~eDj4~3DcRH|U>~ldNu76@J-28l(+@KHa=`}YRt1M+lvSo$T$s1nVIpI#hrDWF zLJs!QO31_gI{rsx=gzi`LoO7sq2t`y^$m)lSIQq197Rw3}h*N2?Cpm%97)--?VvD19GI{)Ta7xPX^pD&!gPrlm?exbZ@?W?JLXIsMK3%J(y<;8`CcioftE7hG9o2QRoR=dy^@K6=TaYVG6^Wn>Q zOw6r-iA{AG9f%O6UgXvP&u;djD@BSBzl4KbPUO$k`OIefn!Lr)W}72TJ#Ik{IUe`f zRNuO8?MjO-^SNC~Vc#nry~cZLg}6*zmHJ#z8U7xB-BwBDxEoJB0k~27TE9F;+Y?pL z^QNh#Df2==M^W?XwmUABZEJ|)71y65mSlRCy<)}&6wqXs!<4Poxt)kw;7%y_dgG(5 z2D6D90@o`irqc+Ih#WGb*Ctx`5WU=m_s;- zVjje6e=;4IGa4Y90|rhg61FWE;;j6}%S%rlkDB2Wli;Wnvqmg_p*I}df1nQQuj3h< zIkuTWTJEBR|A6TdPKRZXiy9A_WMyajXeaHH@a(s}L{r(gUaK;0c8XT<8OySH?NOL( zic!2HMYN+)+WT4qNST4_n03-l-mL6vofjwGFVFG!dF+IIjS+MC53_$Opfx9Eh zD7c=3@|8msZm%Y+R_ps^6Ge4{Dyft*5Z{=r!eXsr=E}!v3q5KFUH{A1tasXU@R_rS zWtYM{F-8&A4h-EFU`)q)bcT-)k0KFKfI4%gOv;p?buV+6Ne{9Z(oZh#+0j?S5fX113J83L2jHy))e2 zu;5w5`wy-uY&y)asAq6@b+}!NYB({d%kHNaQ`7@#MPQWGVXtp4$Q^L2L68yJP0}t< z1WZ5FCcxQFG$WsS@H~K5l!z3qgSSwOs8j9xqZ2;xGt7cWrIM+j=CA$HFAPpaFgD}h zmlyQisPJhqE?}Es%`f;`LMe^moGl6H7ZYUY z2G$?u62ajocZGCOjuRrS{sXuR#B$Oi(B0 zzhGtg5yY`ED4ZA*&M)`#8(GI%8ot7D6!oNBv5kn>IE_qO2i3}Z^1Am`Ax?$n6|~kZ znB;XM5`wb@&AxJihZ%p^x4_2-_cs^m!`#J>hy(CT0rqd*DpMNr`HUU<3m4W}7Bnt( z&-Z+d5b1qB;v0#Mrk7XV)X z5sF6&vdhuO&lP_tb!ZZEUXnu(RIGbs{xh024rOHGL%>(@^9b+uqbp)%WDGyQCnfVs z?40^oPKMlwhB+m|4L4jxIXs@HIdt$#roE3hs3Ew4L3FXwZk>1v?O&?eqlTJth=oHf z02LUN7OdFV>_sNh7Q$e8^arAfL(@A1Yv^}|{-Bhk7D{%izNifGi?3j5Ame|RW15cs z2o7P_wy&XndEiV=mU5n#xZ@%%M*P7iJiu=nKonvK%_Opf{Ph%edx3!>zz`7x&AZP5A~FJI&%85gX*yF}Ivar>O+^Jd$t9R0 zG9*FGM~Sn>Z$ZF%Xi zR&88b>=SN(De~j`Wg-*#$!5igzS9Pzh2gYu`O#wto(hVfS(d#D3QU0TU$T_0hW!`Z z=EeAs$kB@f`}Hl?j7?4VBoq;35oEO^3f?NilHvcC{#GW_#)ZqC;P#gyKa%c^p*}OV z6jYfB{ss;4apW9-Tet+))G*-VBre78#7yeiqE)x2=|5+z}y2*iM;uCtTA73e! zsYQq39M1#^0cqxe2UjHq*qsaKB1wl$Da$dYC-N&A1d2r$oMlklO&(%h)b5KK=MDk50T6&mdELVZJ(5W0v4w7)V8c^Olf<>MvSJ2*2odKUjS#nY* zhlDNHO72F%6c!_*t9;SR!Z_oZib{oAmHe;wk0Kc#7nLx!;Vy<{KFz2n;Qc@*&|=LA zhw5ZsA7{ysx^UjmmMOj%-HPW5o#4>?fK0p|ZeEs@dzlAr=doN87N)kWlJISGgR#FufbZOb$=GX9=ZmoI z`lL0$L_-(q&9*Sh8K0gG8p1UqfWzCLhqd)~U1KC<2MTi>NF*$cvX-?a<%EtgMq&Oy zT_&e_vBKD8ejO?bt!!j-+6CAni33|)1Gq(jIj9pw*jAUJa_^&SB!V~iWW5e&&SF3P z@_rjt8Gq;hz)yJ+^oJ!X9TXXteccNa$3b8(?g%e5LL*{Ubn@Ky@9Zi3jXCW*&u!%l z`Li2q$kR+jn~_gugA~PYZWA4=8)mbtkVBPD?7!Qr_AeaYb~&1S0-M5o zy5{=g?mTZCh_eAr@|pE*M?om`QuSS{bDEg|ngTuo4gyZ9_&}pp(dPOGL-}{jk7eid z*ZOla*z!lf2uv2_F($aCv#P#!2fDD%dYb$tLBeS$^t3`~;*rduxE|AWwln+6Par zC%SC$bt`wqTOC6~A}cBHt>wbxbrpZz9ZdCj!xj{d|=mWSa?)K@Qlx zLkWQC3G{q-1v8|yzb`EK)8#I>JBYHih)sr2+Lmz9T*^bb{^mY#?8wZa>d3I zx)}2Gv-V$ud`%Q-nO#-On6(R>W?XN$iI8mui#;(g&>qi`x;*x$YI7!!k{}dMPk3!< zWM)blB`+G~(7?0@uBg@Mp&r3|{AF2%wUI6+_uYgC*iAe_h(Uuz}g-iBSuzSd|Rm)cjqsT zkPD3Z@dG8xK^< zR0H7SU$7t+U8HZwu?33v!st(u8SHC%5OeLkcXXEAR?MzTx1OpXMO!ekQ^2OP-TV=@ zN?g(?R^qPF2LO|+Fc`yY0Xfx$Y8FY)hJ>H^u1m|gTTk77M!24+KI;Wy{O){a#)LrI z?*)Aq0rrbLB5EMK3OcoJe}ppSF@Hqw*X7%6_#%-3LmF2Z!7=8m!uh8o{mEE@2YGOT za!{-dh7}DTAqHlUj%o{AC}C!B0;h%=T(KYkGYhZ{;3DiHG>WCt;rNwsw014AxL;yw zS93rHLsxFM2dU)YLiI9i8hw0tiwlRf&f9BRrh!w>U} z4MDA=tdbU+NMC$FM$D{pNNKiNWIkU}zdpr;QMyrgQ&p{%+IK!5uUt+wYHs!BH16mbGQl@dBdPcJ?3{r;qDG{wKEhNOI;*g= zBs+_T8TY=){(&1_%Gu9LUA*Od($3BDQXxCKqGq@ly6)x_N!OtfjOGe=HiT5x1zxnM z$z*C^5XH6PuSn&eS_G%FZ1ZpyEI|=r?|HyRk^gtifFv>{^R_m_m3#dYf_A+tHi!9Y zKC3&iazEvs>a5hY<9+J0);gWLSvBG^j{a&9{JBP=b>=o_S?lHZ41_w5U|l}kPS0}z zzL+oL&le7@MO`}vlZxB!`H8XMTJFeNjB3Cj^qWEbwWMkEm&6-A(&=>!l;J$+mA7a=&a$WJjR$paN;af*FL%XlAuH#k6QL1S-8zKAJ1f{ z8P8rs8R``~Ieubz!iesVnRr%mbVn{XqK+B-#O4rh_SJLblv+f4*~qIMYqvOIo;QnN^(slCnm|;^kM=%S-`wh~1n- zxYX2r?<2lPJB^nlVdYC{In5AF8eX&vg(M-9sgx{5EGx?_<1bhkVA^AvtD$`j^XNnH zpi`#?^Je9)PHpN+IugnxS&z9N|Y%KiSJ8(=NTA_lFeCzfH>O@&Rty;;x7&u`jA#y+jfWhj2`!{W ze%@Xg5-Vg1KW+_)8eDjyW8+G%Ff+$bgNU;paD}UpEn4krEPV}x?Mm11%`9-92)St8 z2S%#YJvysZECsEwF;IgT9&qvM`*c!BBtuRnu^iA+9=n5;E!KY;?hAn_tRGDyZ0p`u)MGDEnpMcqey4nU1 z%$nmt1bsi*?$*`xPf|eorjf#YGcx*EvLs8pTRobzGk9s_+L*>Zz5TIg2H%y z^Tp)vIV|WYydYrhoFI$ep{F4#gzQ_1a^&cu-CgQV?2GD$!(Ch2bSEgwMFll*rtCxDJphaO#_v5-E6+(>SXH_mQvEKn^yM2#s2TLp>M zJlSMcz>FRo%a23YOF@8;Z`qmd>_&wI#ct35qRxWl3 zESgSE(9ESUUlw}*7}1e4UrA@8GvW8?dymI{@3V8^?d_eax>l~RI*~?kQkmTpP5DKT zR57VFGL@@!b-aVd&!XO&MPM49Pwh0}bE5y*V{Gbjd)Mp8mIKj*N*OzH;lusSE7ac; z!uq61(81g3;9d;u|8qi^DNF<2lt7mcsQ?(b;pD&_K(7$6^Eof56^N-OKHkpsxn#~p zGjh2ypJtM23T5hHbq1X_)a&(|M3L7_(b>oAUD@Bh!`mx;QE5%ZV-lmKdBnBrVG5xp zENsG(w~h9847KH7dAHOs5lI><5NJTP`31LrQjHI254N9-$50ANFvbUOl0{~UU}}A# z`r6J=ww)qyy*iql1dF181~O)&U=X14bu5YOjNQ&?Cse${^lsWpE;76Sw4bj%ybLrl z!(ykl6Aw1zLP4i(ivia=#T~e}tH-o`>ytrO#D6CkmHQ`|D$QAeN1*9_awKK6Yt}A- za&!T?Cw5AbNlH&1nNy2a#*#{OmfBybKmqgGvtC-q)bd&Q>{IA8E-RE2KwOwmBm?P!YXIKK6 zVJmqOk())@Q5Iovygp+UdIPfQFtZiG*!2VviqXC|aIi4HkoG%QTH_$WR%)Gqf`@G| zxtjL&7;2&qSmGJs@1LW@vM9=j0s!P;{@=4*4^bvU$`rFQwU73vHrn4DV%vOfx{--` z(TrdV)VLs>qQu~h{TWvp7SdciLQ7pj z>tznfi0adyUaKI1$4Po?-(-*6ZgEnVycBdn{7MtoQ0P6&Of9Jc91wl0_}6of;{JhE zHs4q;0jxze!?RHlb}HtZCh?lxV+E^P#po5Dh~`V%?O`yGGW`d#=n;|Z`2qjSY5Wv- zTyRR>(d}bhVHSSPu#`iD!5(ZS1-_VtSLW~Lw#5pi zg31cGC>kY3%BTi5@sZH9UUsR*L1nTuEhjPqtaufaEf#&?-*u2T&Tv0JC;~s0>^aYC4(*Pwmy42pI zV);Y6vL#Z%G5dgb=E&b18vJF{H2l4io~V0;eH45d;w>a_rp8I&t5M3t+{_XaMBrg!90>;2S9JS>uKK`FSC!r#Hc z;Nx!t^b=Gjwz+s+!lIx97} z$La1WzCMZjX_!7;OQ>ZOaLN6oh;;8NnR-7-`Mkr|b#%wp;4Csyo5|ZdSPV0BHVXDi zYiI4Jy4G7!`R4sv{>}P4NdE|1Eq-tVO^yp?wZn4TVk%ka%Oq|`)5{w8B|X}spVCsP zr!H&T?8>t927fIML7&fwZL#)G+i$zniW#&?=A4mtWm@0$%}34%6-+iVf@Y;!PJEje zO774J%1cu9tN)BG@UX=r1PKcIj>v+M_VLzF*2CjP7S4ag^PP!ew3IgPV6rax4aAWv z8Z=3?FF@N^A}7Zfx~ZGI4t}=RklhsjEo$@b{ITxnR$Z~6lxNpn5hu%~3ZL}%cRxVh zEu744|7YfaJ@TpEh2NN)?w!SRu}hb2&KnJ^4gvT=P`#>%hLpCOB6$Fp*Ya6#(bPI5 zM8(~m*`4O1G=J)@jHG@PSPiHpd%DvZQ3`Mz^!Z5QTH~^$YwcU{Q9OY+2O|if{JceZ z?gM53uSjGN<*fD7ds;2S6AVFj9Sf9$MHMy~G6rgRIyKmS(reLM{EXNFIZPe~qm*&{ zAXAN09_WGM47sm#c3Cr)!2@?-1^t*`umg7$+A+6XOw z@4dcs%%iD6y}k>Ce`>eBf0Q5$6{0-qGeF57ElfUBbxCw25pdB&|AL4)sf&^v#YnUX z3W5)wMM0dl>iA9N{<4uxz1d@!B#4@lXY^ z^V{1Xz;)axz_m4>dGP*Wi@wRSV@V4n0oI?niSd~}=*)5P;hvA1QCNO^C*o!*{D#WT zMNjMs;NCWAu+VP(AM{2xR)uNOEVaEI_L6RPkQ;H0fci9POkkJG`f=s5A`;9UF_Jy) z>-%H94K#{zswIjgy6dL;9w5mE5VqB`G+_pqhrrdsIn8gSg_8;;Z4)G$YmTt&t-^+n z;n#jxgkG#C9T{82D^Q*I)$@1lk7+dWY;#~>Vrl>l!lxlrn3N;Wc*#zscFNu6U%oPr zZpm-EHhzmaZeVpA-54;^mT0-t-fy$^Z4nd!!lR*&O3jY0t=v_Ow5pxKQEn6OnUtik zlj)GWkC05zjvn!O;`1Rk<8jCZOTihlK$j!9Hme`8hiLq&&v~VXg3Z6-HcECc`O^BX zh6W~O%QNMRs#GN$hM`*jggbG8!NhaAGBXRAKfQkHs4uKXdjuQomw`i-(WeQv%Bjd<;%(h z=SN!}1~hsqJj{U#tost+R(YGeP9KPgOj!5)og()1n)N1%PT?diGObC;=T_1ju%B#t1W#P1G%nzoXGb%WuM#* zp%+|}=)T8OJB+#9lW0pz@onpF|7e-vc0l*!-l-si{0OTmUTFvpE(d<)`>F{`pafW1D+^4-q-1fLtLr{6+0H-guf+~#{tFrZ`H zOZlkQ(ffrKXXip~khbJ~En}S8IaK)R74QON4fgs#MvPbe?WAY~U@KpDznv-fsuBdy z!8M>N^(<@p;SF`^S?7OI$r#+tp?RU~kO>W!Wo@tXT~=!P9LBof#zwlacU03l7$Gl1 z%1x(nB05A}{ah_3_#1X=M7KXF)O1_lY(8H1Gzj`ITJ8G;iVu(%VGS;V@?p|vgu<__tEB0K}S5LjYyw8Yf$^*MT zALi(2x%2ueC6kjGyjG-+kQ=)kEAVO^s7re+i2oTMk*~9Q2LJW;LycGwZjk{1P{RM? z?bjD72txgHFFsC*3<9Tw{SQy1#PeTSt2zqu|6Hes#3^z8llSzdzpI4#FVFE`nY!|S zWLC-=|H!(P`TwT%Ps%3$smNIMKgy}95~yz(lK;JB3fWa<0{@l#Z&dmA(f{)(lK=pw zjt*|-4sOh!?d??Lp`ft=*noeprAq#9Q1f>C|9>7AVF1A1+|Bs^SL%N|hXLt-3cW=~ zq5y!ao0pxr>;I=9q)QD51OC&{D0LuID+F7e?jIzo4un2egczvP|2LBXQuJ@; zUsY4c$-l@*0|=E4;ntw}NAoY5g!ukn1dX5!5mP3DtZ5+qqj2=5AOu0w@~ diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 8827df60..ba49c233 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -37,7 +37,7 @@ void BaseLoop::start() data.erase(std::remove(data.begin(), data.end(), '\r'), data.end()); data.erase(std::remove(data.begin(), data.end(), '\n'), data.end()); - + L.log(bas, event, ">>> %s", data.c_str()); // decode message @@ -59,31 +59,29 @@ std::string BaseLoop::decodeMessage(const std::string& data) std::ostringstream result; std::string cycdata; int index; - BusCommand* busCommand; - + // prepare data std::string token; std::istringstream stream(data); std::vector cmd; - + while (std::getline(stream, token, ' ') != 0) cmd.push_back(token); if (cmd.size() == 0) return "command missing"; - + switch (getCase(cmd[0])) { case notfound: result << "command not found"; break; - + case get: - case set: if (cmd.size() < 3) { result << "format: type class cmd [sub]"; break; } - + index = m_commands->findCommand(data); if (index >= 0) { @@ -92,11 +90,11 @@ std::string BaseLoop::decodeMessage(const std::string& data) std::string ebusCommand(A.getParam("p_address")); ebusCommand += m_commands->getEbusCommand(index); std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower); - + L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); // send busCommand m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); - busCommand = m_ebusloop->getBusCommand(); + BusCommand* busCommand = m_ebusloop->getBusCommand(); if (busCommand->getResult().c_str()[0] != '-') { // decode data @@ -107,26 +105,80 @@ std::string BaseLoop::decodeMessage(const std::string& data) delete command; } else { + L.log(bas, error, " %s", busCommand->getResult().c_str()); result << busCommand->getResult().c_str(); } - - + + delete busCommand; } else { result << "ebus command not found"; } - + break; - + + case set: + if (cmd.size() != 4) { + result << "format: type class cmd value"; + break; + } + + index = m_commands->findCommand(data.substr(0, data.find(cmd[3])-1)); + + if (index >= 0) { + + std::string type = m_commands->getType(index); + std::string ebusCommand(A.getParam("p_address")); + ebusCommand += m_commands->getEbusCommand(index); + + // encode data + Command* command = new Command(index, (*m_commands)[index], cmd[3]); + std::string value = command->calcData(); + if (value[0] != '-') { + ebusCommand += value; + } else { + L.log(bas, error, " %s", value.c_str()); + delete command; + break; + } + + std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower); + + L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); + // send busCommand + m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); + BusCommand* busCommand = m_ebusloop->getBusCommand(); + + if (busCommand->getResult().c_str()[0] != '-') { + // decode result + if (busCommand->getResult().substr(busCommand->getResult().length()-8) == "00000000") + result << "done"; + else + result << "error"; + + } else { + L.log(bas, error, " %s", busCommand->getResult().c_str()); + result << busCommand->getResult().c_str(); + } + + delete busCommand; + delete command; + + } else { + result << "ebus command not found"; + } + + break; + case cyc: if (cmd.size() < 3) { result << "format: type class cmd [sub]"; break; } - + index = m_commands->findCommand(data); - + if (index >= 0) { // get cycdata cycdata = m_cycdata->getData(index); @@ -136,7 +188,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) // return result result << command->calcResult(cmd); - + delete command; } else { result << "no data stored"; @@ -144,9 +196,9 @@ std::string BaseLoop::decodeMessage(const std::string& data) } else { result << "ebus command not found"; } - + break; - + case dump: if (cmd[1] == "on") m_ebusloop->dump(true); if (cmd[1] == "off") m_ebusloop->dump(false); @@ -160,7 +212,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) if (cmd[1] == "debug") L.getSink(0)->setLevel(debug); result << "done"; break; - + default: break; } diff --git a/src/main.cpp b/src/main.cpp index db87c3b8..7fceab24 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with ebus-daemon. If not, see http://www.gnu.org/licenses/. */ + #include "libebus.h" #include "logger.h" #include "daemon.h" diff --git a/src/network.h b/src/network.h index 8642857f..ebde2738 100644 --- a/src/network.h +++ b/src/network.h @@ -25,8 +25,8 @@ #include "thread.h" #include "notify.h" #include "baseloop.h" -#include #include +#include class Connection : public Thread { From 60cfff673843532e84c88394c455d8bea7f7026c Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 5 May 2014 09:22:59 +0200 Subject: [PATCH 14/30] daemon option -l --logfile added; ebusd strings replaced with ebus-daemon --- src/main.cpp | 72 +++++++++++++++---------- test/{scan_ebusd.bin => ebus_dump.bin} | Bin test/feed.cpp | 27 +++++----- utils/daemon.cpp | 10 ++-- 4 files changed, 61 insertions(+), 48 deletions(-) rename test/{scan_ebusd.bin => ebus_dump.bin} (100%) diff --git a/src/main.cpp b/src/main.cpp index 7fceab24..ed8f008d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -49,48 +49,60 @@ CYCData* cycdata; void define_args() { A.addItem("p_address", Appl::Param("FF"), "a", "address", - "\tebus device address (FF)", - Appl::type_string, Appl::opt_mandatory); - + "\tebus device address (default: FF)", + Appl::type_string, Appl::opt_mandatory); + A.addItem("p_device", Appl::Param("/dev/ttyUSB0"), "d", "device", - "\tebus device (serial or network) (/dev/ttyUSB0)", - Appl::type_string, Appl::opt_mandatory); + "\tebus device (serial or network) (default: /dev/ttyUSB0)", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_nodevicecheck", Appl::Param(false), "n", "nodevicecheck", - "disable valid ebus device test\n", Appl::type_bool, Appl::opt_none); + "disable valid ebus device test\n", + Appl::type_bool, Appl::opt_none); A.addItem("p_ebusconfdir", Appl::Param("contrib/csv/vaillant"), "e", "ebusconfdir", - "directory for ebus configuration (contrib/csv/vaillant)\n", - Appl::type_string, Appl::opt_mandatory); + "directory for ebus configuration (default: contrib/csv/vaillant)\n", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_foreground", Appl::Param(false), "f", "foreground", - "run in foreground\n", Appl::type_bool, Appl::opt_none); + "run in foreground\n", + Appl::type_bool, Appl::opt_none); A.addItem("p_port", Appl::Param(8888), "p", "port", - "\tlisten port (8888)", Appl::type_int, Appl::opt_mandatory); + "\tlisten port (default: 8888)", + Appl::type_int, Appl::opt_mandatory); A.addItem("p_localhost", Appl::Param(false), "", "localhost", - "listen localhost only\n", Appl::type_bool, Appl::opt_none); + "listen localhost only\n", + Appl::type_bool, Appl::opt_none); + + A.addItem("p_logfile", Appl::Param("/var/log/ebus-daemon.log"), "l", "logfile", + "\tlog file name (default: /var/log/ebus-daemon.log)", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_area", Appl::Param(all), "", "logarea", - "\tlogging area (bas=1, net=2, bus=4, cyc=8, all=15)", - Appl::type_int, Appl::opt_mandatory); + "\tlogging area (bas=1, net=2, bus=4, cyc=8, default: all=15)", + Appl::type_int, Appl::opt_mandatory); A.addItem("p_level", Appl::Param(trace), "", "loglevel", - "\tlogging level (error=1, event=2, trace=3, debug=4)\n", - Appl::type_int, Appl::opt_mandatory); + "\tlogging level (error=1, event=2, default: trace=3, debug=4)\n", + Appl::type_int, Appl::opt_mandatory); A.addItem("p_dump", Appl::Param(false), "D", "dump", - "\tenable dump", Appl::type_bool, Appl::opt_none); + "\tenable dump", + Appl::type_bool, Appl::opt_none); - A.addItem("p_dumpfile", Appl::Param("/tmp/dump_ebus.bin"), "", "dumpfile", - "\tdump file name (/tmp/dump_ebusd.bin)", Appl::type_string, Appl::opt_mandatory); + A.addItem("p_dumpfile", Appl::Param("/tmp/ebus_dump.bin"), "", "dumpfile", + "\tdump file name (default: /tmp/ebus_dump.bin)", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_dumpsize", Appl::Param(100), "", "dumpsize", - "\tmax size for dump file in kB (100)\n", Appl::type_long, Appl::opt_mandatory); - + "\tmax size for dump file in kB (default: 100)\n", + Appl::type_long, Appl::opt_mandatory); + A.addItem("p_help", Appl::Param(false), "h", "help", - "\tprint this message", Appl::type_bool, Appl::opt_none); + "\tprint this message", + Appl::type_bool, Appl::opt_none); } void shutdown() @@ -111,7 +123,7 @@ void shutdown() ebusloop->join(); delete ebusloop; } - + // free Commands DB if (commands != NULL) delete commands; @@ -126,7 +138,7 @@ void shutdown() D.stop(); // stop Logger - L.log(bas, event, "ebusd stopped"); + L.log(bas, event, "ebus-daemon stopped"); L.stop(); L.join(); @@ -163,21 +175,23 @@ int main(int argc, char* argv[]) A.printArgs(); exit(EXIT_FAILURE); } - + // print Help if (A.getParam("p_help") == true) { A.printArgs(); exit(EXIT_SUCCESS); } - + // make me Daemon if (A.getParam("p_foreground") == true) { L += new LogConsole(A.getParam("p_area"), - static_cast(A.getParam("p_level")), "logConsole"); + static_cast(A.getParam("p_level")), + "logConsole"); } else { - D.run("/var/run/ebusd.pid"); + D.run("/var/run/ebus-daemon.pid"); L += new LogFile(A.getParam("p_area"), - static_cast(A.getParam("p_level")), "logFile", "/var/log/ebusd.log"); + static_cast(A.getParam("p_level")), + "logFile", A.getParam("p_logfile")); } // trap Signals that we expect to receive @@ -187,7 +201,7 @@ int main(int argc, char* argv[]) // start Logger L.start("logInstance"); - L.log(bas, event, "ebusd started"); + L.log(bas, event, "ebus-daemon started"); // print Daemon status if (D.status() == true) diff --git a/test/scan_ebusd.bin b/test/ebus_dump.bin similarity index 100% rename from test/scan_ebusd.bin rename to test/ebus_dump.bin diff --git a/test/feed.cpp b/test/feed.cpp index b01f8344..1d043b5d 100644 --- a/test/feed.cpp +++ b/test/feed.cpp @@ -33,18 +33,20 @@ Appl& A = Appl::Instance(); void define_args() { A.addItem("p_device", Appl::Param("/dev/ttyUSB60"), "d", "device", - "dummy serial device (/dev/ttyUSB60)\n\t\t(socat -d -d pty,raw,echo=0 pty,raw,echo=0)", - Appl::type_string, Appl::opt_mandatory); + "dummy serial device (default: /dev/ttyUSB60)\n\t\t(socat -d -d pty,raw,echo=0 pty,raw,echo=0)", + Appl::type_string, Appl::opt_mandatory); - A.addItem("p_file", Appl::Param("test/scan_ebusd.bin"), "f", "file", - "dump file with raw data (test/scan_ebusd.bin)", - Appl::type_string, Appl::opt_mandatory); + A.addItem("p_file", Appl::Param("test/ebus_dump.bin"), "f", "file", + "dump file with raw data (default: test/ebus_dump.bin)", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_time", Appl::Param(10000), "t", "time", - "wait time [ms] (10000)", Appl::type_long, Appl::opt_mandatory); + "wait time [ms] (default: 10000)", + Appl::type_long, Appl::opt_mandatory); A.addItem("p_help", Appl::Param(false), "h", "help", - "print this message", Appl::type_bool, Appl::opt_none); + "print this message", + Appl::type_bool, Appl::opt_none); } int main(int argc, char* argv[]) @@ -57,14 +59,13 @@ int main(int argc, char* argv[]) A.printArgs(); exit(EXIT_FAILURE); } - + // print Help if (A.getParam("p_help") == true) { A.printArgs(); exit(EXIT_SUCCESS); } - std::string dev(A.getParam("p_device")); Port port(dev, true); @@ -72,11 +73,10 @@ int main(int argc, char* argv[]) if(port.isOpen() == true) std::cout << "openPort successful." << std::endl; - std::fstream file(A.getParam("p_file"), std::ios::in | std::ios::binary); if(file.is_open() == true) { - + while (file.eof() == false) { unsigned char byte = file.get(); std::cout << std::hex << std::setw(2) << std::setfill('0') @@ -85,15 +85,14 @@ int main(int argc, char* argv[]) port.send(&byte, 1); usleep(A.getParam("p_time")); } - + file.close(); } - port.close(); if(port.isOpen() == false) std::cout << "closePort successful." << std::endl; - + return 0; } diff --git a/utils/daemon.cpp b/utils/daemon.cpp index 5f276d29..c24a0276 100644 --- a/utils/daemon.cpp +++ b/utils/daemon.cpp @@ -37,14 +37,14 @@ void Daemon::run(const char* file) m_status = false; m_pidfile = file; m_pidfd = 0; - + pid_t pid; // fork off the parent process pid = fork(); - + if (pid < 0) { - std::cerr << "ebusd fork() failed." << std::endl; + std::cerr << "daemon fork() failed." << std::endl; exit(EXIT_FAILURE); } @@ -62,14 +62,14 @@ void Daemon::run(const char* file) // Create a new SID for the child process and // detach the process from the parent (normally a shell) if (setsid() < 0) { - std::cerr << "ebusd setsid() failed." << std::endl; + std::cerr << "daemon setsid() failed." << std::endl; exit(EXIT_FAILURE); } // Change the current working directory. This prevents the current // directory from being locked; hence not being able to remove it. if (chdir("/tmp") < 0) { //DAEMON_WORKDIR - std::cerr << "ebusd chdir() failed." << std::endl; + std::cerr << "daemon chdir() failed." << std::endl; exit(EXIT_FAILURE); } From e302ce474507104e986c2e6178fcc990a337e144 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 5 May 2014 22:48:58 +0200 Subject: [PATCH 15/30] BUG: Appl::parseArgs searching for '-' in argument reduced to first character; Appl::printSettings added. --- src/main.cpp | 19 +++++++++----- test/feed.cpp | 2 +- utils/appl.cpp | 69 ++++++++++++++++++++++++++++++++++++-------------- utils/appl.h | 15 ++++++----- 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ed8f008d..cfde90a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -85,7 +85,7 @@ void define_args() Appl::type_int, Appl::opt_mandatory); A.addItem("p_level", Appl::Param(trace), "", "loglevel", - "\tlogging level (error=1, event=2, default: trace=3, debug=4)\n", + "\tlogging level (error=0, event=1, default: trace=2, debug=3)\n", Appl::type_int, Appl::opt_mandatory); A.addItem("p_dump", Appl::Param(false), "D", "dump", @@ -100,6 +100,10 @@ void define_args() "\tmax size for dump file in kB (default: 100)\n", Appl::type_long, Appl::opt_mandatory); + A.addItem("p_settings", Appl::Param(false), "", "settings", + "\tprint daemon settings\n", + Appl::type_bool, Appl::opt_none); + A.addItem("p_help", Appl::Param(false), "h", "help", "\tprint this message", Appl::type_bool, Appl::opt_none); @@ -171,7 +175,7 @@ int main(int argc, char* argv[]) define_args(); // parse Arguments - if (A.parse(argc, argv) == false) { + if (A.parseArgs(argc, argv) == false) { A.printArgs(); exit(EXIT_FAILURE); } @@ -182,6 +186,10 @@ int main(int argc, char* argv[]) exit(EXIT_SUCCESS); } + // print Daemon settings + if (A.getParam("p_settings") == true) + A.printSettings(); + // make me Daemon if (A.getParam("p_foreground") == true) { L += new LogConsole(A.getParam("p_area"), @@ -201,14 +209,13 @@ int main(int argc, char* argv[]) // start Logger L.start("logInstance"); + // wait for Logger be ready + usleep(100000); L.log(bas, event, "ebus-daemon started"); - // print Daemon status - if (D.status() == true) - L.log(bas, event, "change to daemon"); - // create Commands DB commands = ConfigCommands(A.getParam("p_ebusconfdir"), CSV).getCommands(); + L.log(bas, debug, "ebus configuration dir: %s", A.getParam("p_ebusconfdir")); L.log(bas, event, "commands DB with %d entries created", commands->size()); // create EBusLoop diff --git a/test/feed.cpp b/test/feed.cpp index 1d043b5d..5480b305 100644 --- a/test/feed.cpp +++ b/test/feed.cpp @@ -55,7 +55,7 @@ int main(int argc, char* argv[]) define_args(); // parse Arguments - if (A.parse(argc, argv) == false) { + if (A.parseArgs(argc, argv) == false) { A.printArgs(); exit(EXIT_FAILURE); } diff --git a/utils/appl.cpp b/utils/appl.cpp index 6bccd76e..ed10e05b 100644 --- a/utils/appl.cpp +++ b/utils/appl.cpp @@ -58,7 +58,7 @@ void Appl::printArgs() std::cerr << std::endl << "Usage:" << std::endl << " " << m_argv[0].substr(2) << " [Options]" << std::endl << std::endl << "Options:" << std::endl; - + for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) { const char* c = (strlen(a_it->shortname) == 1) ? a_it->shortname : " "; std::cerr << ((strcmp(c, " ") == 0) ? " " : "-") << c @@ -70,53 +70,84 @@ void Appl::printArgs() std::cerr << std::endl; } -bool Appl::parse(int argc, char* argv[]) +bool Appl::parseArgs(int argc, char* argv[]) { std::vector _argv(argv, argv + argc); m_argc = argc; m_argv = _argv; - + for (int i = 1; i < m_argc; i++) { - + // find option with long format '--' if (m_argv[i].rfind("--") == 0 && m_argv[i].size() > 2) { - // is next item an added argument? - if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos) { + if (i+1 < m_argc && m_argv[i+1].rfind("-", 0) == std::string::npos) { if (checkArg(m_argv[i].substr(2), m_argv[i+1]) == false) return false; - } else { + } else { if (checkArg(m_argv[i].substr(2), "") == false) return false; } - // find option with short format '-' + // find option with short format '-' } else if (m_argv[i].rfind("-") == 0 && m_argv[i].size() > 1) { - + // walk through all characters for (size_t j = 1; j < m_argv[i].size(); j++) { - + // only last charater could have an argument - if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos + if (i+1 < m_argc && m_argv[i+1].rfind("-", 0) == std::string::npos && j+1 == m_argv[i].size()) { if (checkArg(m_argv[i].substr(j,1), m_argv[i+1]) == false) return false; - } else { + } else { if (checkArg(m_argv[i].substr(j,1), "") == false) return false; - } + } } - } - + } + } return true; } -bool Appl::checkArg(const std::string name, const std::string arg) +void Appl::printSettings() +{ + std::cerr << std::endl << "Settings:" << std::endl; + + for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) { + const char* c = (strlen(a_it->shortname) == 1) ? a_it->shortname : " "; + std::cerr << ((strcmp(c, " ") == 0) ? " " : "-") << c + << " | --" << a_it->longname + << " = "; + if (a_it->datatype == type_bool) { + if (getParam(a_it->name) == true) + std::cerr << "yes" << std::endl; + else + std::cerr << "no" << std::endl; + } + else if (a_it->datatype == type_int) { + std::cerr << getParam(a_it->name) << std::endl; + } + else if (a_it->datatype == type_long) { + std::cerr << getParam(a_it->name) << std::endl; + } + else if (a_it->datatype == type_float) { + std::cerr << getParam(a_it->name) << std::endl; + } + else if (a_it->datatype == type_string) { + std::cerr << getParam(a_it->name) << std::endl; + } + + } + + std::cerr << std::endl; +} + +bool Appl::checkArg(const std::string& name, const std::string& arg) { for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) { if (a_it->shortname == name || a_it->longname == name) { - if (a_it->optiontype == opt_mandatory && arg.size() == 0) { std::cerr << std::endl << "option requires an argument '" << name << "'" << std::endl; @@ -141,10 +172,10 @@ void Appl::addParam(const char* name, const std::string arg, Datatype datatype) case type_bool: m_params[name] = true; break; - case type_int: + case type_int: m_params[name] = strtol(arg.c_str(), NULL, 10); break; - case type_long: + case type_long: m_params[name] = strtol(arg.c_str(), NULL, 10); break; case type_float: diff --git a/utils/appl.h b/utils/appl.h index a7d8a92b..a4ba9d97 100644 --- a/utils/appl.h +++ b/utils/appl.h @@ -27,7 +27,7 @@ class Appl { - + private: struct Option; @@ -58,7 +58,7 @@ public: } static Appl& Instance(); - + ~Appl(); void addItem(const char* name, Param param, const char* shortname, @@ -67,13 +67,14 @@ public: void printArgs(); - bool parse(int argc, char* argv[]); + bool parseArgs(int argc, char* argv[]); + void printSettings(); private: Appl() {} Appl(const Appl&); Appl& operator= (const Appl&); - + struct Arg { const char* name; const char* shortname; @@ -82,17 +83,17 @@ private: Datatype datatype; Optiontype optiontype; }; - + int m_argc; std::vector m_argv; - + std::vector m_args; std::vector::const_iterator a_it; std::map m_params; std::map::iterator p_it; - bool checkArg(const std::string name, const std::string arg); + bool checkArg(const std::string& name, const std::string& arg); void addParam(const char* name, Param param) { m_params[name] = param; } From 1d2bd3840f05cc5e6577cd24b911fc5a98ff350e Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 9 May 2014 11:47:34 +0200 Subject: [PATCH 16/30] Default ebus config dir changed to /etc/ebus-daemon --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cfde90a9..807ea4d1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,8 +60,8 @@ void define_args() "disable valid ebus device test\n", Appl::type_bool, Appl::opt_none); - A.addItem("p_ebusconfdir", Appl::Param("contrib/csv/vaillant"), "e", "ebusconfdir", - "directory for ebus configuration (default: contrib/csv/vaillant)\n", + A.addItem("p_ebusconfdir", Appl::Param("/etc/ebus-daemon"), "e", "ebusconfdir", + "directory for ebus configuration (default: /etc/ebus-daemon)\n", Appl::type_string, Appl::opt_mandatory); A.addItem("p_foreground", Appl::Param(false), "f", "foreground", From 4635a3b3c06f87e0b87dc0f62796e2df99031ac1 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Fri, 9 May 2014 11:56:38 +0200 Subject: [PATCH 17/30] config: factor for FLT corrected. --- contrib/csv/vaillant/vwx.csv | 8 ++++---- contrib/csv/vaillant/vwx.ods | Bin 21976 -> 21954 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/csv/vaillant/vwx.csv index da8ec25c..37547615 100644 --- a/contrib/csv/vaillant/vwx.csv +++ b/contrib/csv/vaillant/vwx.csv @@ -1,7 +1,7 @@ # type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment get;vwx;BivalentTemp;Bivalenztemperatur;MS;08;B509;3;0D6500;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Bleeding;Entlüften;MS;08;B509;3;0D1300;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;BrinePress;Druck Solekreis;MS;08;B509;3;0D1600;2;press;sd;2,1;flt;1.0;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;BrinePressSwitch;Soledruckschalter;MS;08;B509;3;0D2600;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpCoolingRunTime;Kühlung Laufzeit Solepumpe;MS;08;B509;3;0D7D01;1;-;sd;4,3,2,1;ulg;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;BrinePumpPower;Solepumpe Leistung;MS;08;B509;3;0DAC01;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -31,7 +31,7 @@ get;vwx;FlowTemp;VF2 Vorlauftemperatur IST;MS;08;B509;3;0D0300;2;temp;sd;1,2;d2c get;vwx;FlowTempIntern;T6 interne Vorlauftempertur IST;MS;08;B509;3;0D0900;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;FrezzeProtectionTempMin;Einfrierschutz T81;MS;08;B509;3;0D7A01;1;-;sd;1;sch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;HeatPumpState;Heizkreispumpe Status;MS;08;B509;3;0D1700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;HeatSystemPress;Heizanlagendruck;MS;08;B509;3;0D1200;2;press;sd;2,1;flt;1.0;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;Hysteresis;Kompressor Hysterese;MS;08;B509;3;0D7D00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;InitialCurrentLimitation;Anlaufstrombegrenzung;MS;08;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Integral;Energieintegral;MS;08;B509;3;0D8000;1;-;sd;2,1;sin;-;°min;-;-;;;;;;;;;;;;;;;;;;;;;;;; @@ -57,8 +57,8 @@ get;vwx;TempOutside;Aussentemperatur;MS;08;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0; get;vwx;TempSpreadMax;Zulässige Temperaturspreizung T6 zu T7;MS;08;B509;3;0D6E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Time;Uhrzeit;MS;08;B509;3;0D2800;1;-;sd;3,2,1;hti;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Undercooling;Unterkühlung;MS;08;B509;3;0D8E00;1;-;sd;1,2;d2c;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;2,1;flt;0.001;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressHigh;Hochdruck Kältekreis;MS;08;B509;3;0D1400;2;press;sd;2,1;flt;1.0;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vwx;VaporPressLow;Niederdruck Kältekreis;MS;08;B509;3;0D1500;2;press;sd;2,1;flt;1.0;bar;-;Druck;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vwx;VaporPressostate;Kältekreis Über/Unterdruck Sicherheitsabschaltung;MS;08;B509;3;0D2500;1;-;sd;2,1;sin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;Weekday;Wochentag;MS;08;B509;3;0D2A00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vwx;YieldEnvironmentEnergy;Energieertrag Umgebung;MS;08;B509;3;0DBC00;1;-;sd;4,3,2,1;ulg;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/csv/vaillant/vwx.ods index 23352b1b56369a15dbe4b4a35864fe30deb1163b..3f3d9ce7a938a17d395ec1dba165eefdd075ed8c 100644 GIT binary patch delta 8063 zcmZu$bzD^4)}Ekq=up$BP@ZV(w7q@)B1XQV;W0SQR~5$P5|7(zKf7scO#7 z{sycPTsnu|$!7CttCS6{507Kh?AP3V{_eh_ts!>u6LXrx%nZ-|(|+s5qjQ?ssx>{C zeP$9GqKG7|v($N=02di66OgJV`J*l^jDVyxM7Y&!dG==aqN~ZG_^O>=JhmEcz6!`w zo>zpO`&#KYcV}f^@ligX9o+UP(e4w=%;kO99B55mbQG26-1%}qHT})I>DirH?_*VO zU5QMC*$tc1L%v2&Py-VUdmh!s_f2=`YZH^g-Z9el{ivxFyNks=5fU}ZNa--Ra)`qn z9>i2@ma;N8#j)gtSZ^^>X5YLp>@u8wg)vMpxOoWik@}kGbyHAEV7?yrVpeSK0Ww#y z>lxn<`u@-rFFyAZ^&8tQL+Z||9r}^APz@?Q-ejdU`A^~?xn(Jk0UHxZNSgyqh0dck z3pCUrq(3=nQ9=KS%K$HByMa#$fgZxGmv`jHQKNC3nkams1Z`+66G4pae9d(bS? zYuA{nB^T~KoQ3rpzDpFtp9I!{yRS!_(9zQcppiP075mtsH z{S3=50+&g`BK;xI8UYQJ-jN8sUW7Ob6!=O3>u!VhqxUELvF8xRoW>X&8q(#&x4`$v zs7M{wng+D{^;AM3XFKx#oJ{L4lVNSosC_lQeXW(KXW#NTR;!Q5Kngn7_ort&w)ncD zTy2}LUSfIO~imluk?mWb6+~%4wpZ_3Gq??3A@C- zC$tCS-;W!$^78S`TCN014*)cyQlLU6h$Y6dI#+5q^TO#t-~dZ082DoNr9=rcTr0Oy zf7mHWEmEUJbL;aj@mLG)&`y(H5dGqPQxc$CxsiInslUmNK)H$60!`(8OR;ICVI!G> zhN<$zV}%`w-i)w=QtQULNyM0H)2{DW=SfG8j<(h5gQNMyF)pjU&C>S7^~j3m&L88+ zo=TO`aVCb@M90SQM$^kBc|)8#t1v!qz9q^6lS4nrCPcb6*6RyV!XPlhC8$P^D{`xD ze=M+%utiRBN43oUCtq(}_C?!YYwO!BERLkj3W%{Mjg*nuAFhQL zdf!_Qa2iugaCj~dySqm)46k`Fge{1+n17x?8xo(Y#eX~&L%fTBZneM^M;AGv*fr~Z zk1NvBl3J>{zN2baq2H_Q&Lj9z#-`b3U&)2BlP&+T<7BqWcbt2{m+zh5Cet3NRw{^= z8rPb;r90NUrtcm)-*-b$gWu6<`v^ZwACIwcqdD|GXEojKi%J)KXvpL!Jtj0OM^3Y& zDv-tXa9ak3=0v#@9|iNbaWS<9GCLE(Wz?}-SIkFT`iF!Ys4ok)-Yyy8y)oLneEHD4 z$E-m>UvJ*96f2t0>*rmA3a4>*3+ZV7hJ1R&(yN=stwG|?6*qTLOiVPK*ZG6pSN>M# z*m_#nIA5xRlxQ&lfGb7-;9t8Z4i3)m-Lv)qlOHa^gqCTHLqs?+Nk%h+8pl0gJ32Bs zrpZ<&Fl_r<@?Lb^ly}cv5mbn9)ob=4kG9j0hlQ5mzI@MoT@#NQ4c#G+EIvF5+>V`> zKPZZk#KXnLO}pDMY09~>oEI5vxmKMKlVte*?aFJcb#^EhQDjfn#lzt==ynwv#_f0F zza55!IDl?TF=@(s9;=Ui=87LUo>gF7Y6hfQ! zEo<{^*xIh^A5Xi5D>w#30oii|w zBb@i!`#Hw>$*hoIvHwZ3H+~D|Vkqh}_bPKMLo~PxxC-!cgJl(Pem_7$Vf4&IEl@;} zBK=i%=;?~Eq#kJ2x?IPu#b|hAK;C5e9@j+H&E*x-5Cw5D>Y*e-8$6fLHg}W8d*oxP zYO9L@<7K-OL9AQ6*3<61<#|JMHTAIE14TyZwS2z8ZRwvQ3pCGUeIfq1UZ*@S8{Rg5 zC-Xb~cG4`9zR^rqkNJz}R|QVUba*Qwto3iy+8KrZA+Lhk>^SFVxLzFSsqvVLMV!)+ zg_T&1vRiBz?Qr#;V`!u`7RuaJmh4D{RMf>$a1ff_Ret;=x+nAKrEZK<_V|6r7Av_W z{ilYr-+h_#XW(>I@q~jAo>U0&166d5a zf+k?OnOE^+kx(pt;4sq3VE^70Ko*>%5$Jh1L>yE3(?U)B(Mp-rC^Zhp9cA&`Mx#jQ zG00&5OE07|Oq`h({}pfanu?Z%|f#lSm#KusdTT+W;net zkz+m#nvRIz#a_Wsu%$sx9aNP0UPq?oT^ev?UR*WKUf@S(z&fUrIAcH z_b?P7RoF9zqTAJ@gy9^f$Se?Z@ncXga1G!MKuD!;^HQzN9IsSoqTt!ep}!0%-zgOV z*?@no0>g4P7CF)}1zRTeLZKQ7R+f+zV`TV|N`j_qc_jaYw7UAu3^{l63vQX`tjf)CIEJK~J>a4_qo`NYKV-~P_UsShv zNo#{kqgd9N*A04`!j$a2?$U-Wj#0cg&R6uv@Vl?!L&2OeL8~+^W6YHM74EG4VZc9S zfdIo{RL@)`S&XdC7{h&%C`lZz&Y0T0ygs+AP)aQMh0CBwaR`G3ZSWLRavi3x`VSN% zp&Usw0!$ZaE|%|41?$&jp?ws|`}RZ@Om;&o2V9+q_~DEJ$p zb-WmwY8f90!hyh$FsW!Y-gM?x!f+p2gHgK_8ZlfqaDzs>q;{|fnVX@#9?af$(%Re+ zbaPb+Z(2p#;U;icij)e(BvJi>;XnIKV|nK_DAy1e_)WIhpWp}-2>ghA029hf8%6ZU zJ1xCE8(?$%th^}od|sYnC|g^n$fR8Q=KMk-%VJIuvWEGyU;V+PVG>m@{<*PmeiZIU z(d8kbER`et<5e%gCb3mbGQOaiHaL?8KiiXwDC&`s(G$Y%Z68%ERRWA-WT1hbZU~k6 zH<%ob9q1U{XDGi}%~|qAY$R;W1Bu81<*ip?{s0~U0s(T!98uVCF(2=*cRJ}Ye(>3) z(l3a2-^ZLtx5m(t=RF>5Jb;<+z%R@^fEOS@Ez&%L>B1*h`3SXtZ*8^z`e`oC+@8Tw z7#VJ!F^2OF13Cs{%hXa81i+Ii=f>l9eg zd@Z=?YM1DUOS-To0q>Jc2SQ5W^7hwAFx@FEeLWBO9eBu0N}D_)xk}|YK1J8|=BVh< z9G|a-=kW=>q-3N#r!XOW?+XJRH2~0{2r!YmPl24I0#&6HTs{22d4(6+j)uDq!ifia z7x4^8O{S8)zDHH% zH591!WY%oq7jGn=>1Za}`%pxEGL#eNap-&xTNa**7r^h&C<97-)`PZN7IA&Ru|K1_ zPn~9M{K+i&(wz~J6vDwuoy;w2!;(&L?`34){-lR6&F!t@a47~Sp9HGD7fSy)+6Je@VOr-SVJROslIC8xAhe90H zM3=0OO@Cs|k;NW;WX@{AEym3y#le>6I7=zR5a4HcU^nuCSxHcStM2`t*)aOD?OA>2 z{7w+-W9*@*FABjL*rB5Qj9A{^S^y4Iz)a7cjhbgxr>QS$ElalOs8Ri4R%uycKYYMr?}z!1OX2 z;}1OrQ}nP|lAd#Rz4E!xoqYPZJ6Vs+VcO9nH&)(3lr;@y>>QcvK$} z@LX0Be>!awaz%(Bt%(nBHIUx#ttSK=rSf&-asa0QuHN05N^rueH;uj#ZZ)NNdf>O! zgb%Ny^p|7^E7O;4@{(4?3tu~7evK2bNx|b$A3m4(F{*Xu1(1CL9v&4zVxv*Q;M_6{ zLYoD15Ai~x&;D742!rhAgAiz(A?4jE7lGAUt@gJgC9H^B*P72@Jtbn3JLXblIVZSj z{S0FsyxYF{)DlFlK<&U^wu5bFjyB7+bphModN<7YNyY&CdVo2SA4YjgFndKW)_P>A zE33bDfIO$7GDP;Bfem<}<*6YHq*a(RAU9wGz!E7yH*bME7wU>%XH4MEfNX$S<_U~Y zI^!ei98UU%gXPDvjOlHx9<89>^EoY@`3VjY#6jWw!X~uc9k#NRfI`gt4WuMQna@#`vDQ}imE zWE?x7I>}<&Z7;!`;U#FGZJyj_Vgmj#1DX=6n8O!M7aq|a>k}ec-eP4 z6Hm-BPe{MB0g=2-6$V?=iI2GAb|sra*(iB!KQ+Mireyh*4+yVJ#*IxZyCX+>@_Q9p^#IZo#1qGn~25( z`+>iMe2Q!Y2VOsGdf{03;4<~N+T0n_C&MOspo@avlpZc9JdKy`n!^&5L6~tF7s>9+ z*@ob#SSoS6w^29O+?mtaLP5f^DsyLqB+FN#3y0ZBP|vu*9n+x z4zr(39aNv9Vy#ILSt;E}DNNqY7uSnazw(Qlxbu-yp2O0i#j62ddY#%i{Emw|i6?JN&pB%|G88*K=!xnmh-jR}lG?G*sbY_I zOn~i1PjUkJ z{g1&T@?TGLRCv z>HF@KBs7~o8oEF{?!jUKQZ#DtdN^qH<*ojW*j>`R)hV-P*eAtX$mx4M9Cnf%@ZagZ zS7SxYK&i2gzh^hMle0$RQunL4B8NT~ZpF_U4{`Y&4Tu--_+VBmOGe-Z-?bYGsc-)v zyhTjgd0gyG;wje?`*C~GNN*&O=WWb3a~^_O55kQ@ZsdU{olinGAtvUUyO1S$8q#$i z9E8`AgVpMYvCTsi)I!U-S*tsdCO-UBYN}afS!kc?%vJl$^^WzmG$!I%8`}DJ(WQ0M z;k25E%3^Wn=jccIrKmG0_NNUYBGVuxYvPQfHK})i9 zy;P*LOWt&4wg{cWTOXD?r&?bfKznQ4o)3JO?hN!SV|aBD>U?yWEN1vX>yxS}S*03( zAv+A$=1_w@<@=>pB?@6pw9PulSdBuM{@D3Mh`r^4bYyjlm9@GU5j8lDWt)Mqc+7A_ z{UYSeI6^Yrw>?64)q~YKo2VO6V?&Mwa)*F+cEPtkS^AZw#|be61IL06Cs3^?hBzVP zksYVZw9B|$c|Y%CF-S_u7A;N;_7(E!7!;YHsF0T%PIGK}{!`a}_2T^_;IpSN1^h8x z{)+7tMzQYSzZ5QcPQ)YNA3TsiTNrU3_6Q1WZmgF2Eybx zigV0V2MTJxIqp2=my;J|mX6~;^}py!lT+-Z+obQ-SMJn+Kqzm*V!Tf=SuU~fVQ_YM zi|5gd@MB+|^Z)Q=t>^>=>a@gJGZQTgrxqTFbbN25 z54fESK4eu{9R&irb2vEVgl!mWS5s-dAYsD<=Fk~Hls?CtE-kGb%Yi0`_eVOOaiPgc z`BSmq%o$8-k_Z=h(yK|veTS83-z}lk!{f$G5!DpgVh~ML_$1q)!I0MSxctMHvb|xI zY$h|~(kXvaCzJAqaE;?Ds@OYBdsemeHKHyOIYKY$h>H=tm8}DZleMzh=I7~m1yB!qtdkt0lsE5_o;ZsmYJCu?cP!g(o>KqZmtOWd3ToCZxx8BYak^CM zpU4xVR|EHc5D}2m`t_AS#E&mg_0wOOa$P5<7DgGLN6I%<_+|)ADm~~n;N4nu(;yi) z$5p%EySA5V`*~|)!%8)zQj{lOL~Y(uVTVeC{|SuUhb%&(X>q89E5xyuH!a&GioQgY z{Xrqq<JIBx?A$J^$PJj&O1-^V&m{O#tVOm@!xS?RJJ@FLO1c1 zFyzzT6?t#7=~o2^DSwBi+)Rqr9Ic-3GcxmhnwA5nzR(I}t8E+J$#t}9&IdA~Gr z1;~+h;7K{8|Iy7qPT$m!dLth<8LdwsQOw^NXZK;Tx<2ooeQDjYO7-eFXDOnWL8YkB ztWfF=-@VTacC11wjO+GW5<)H{Mfj4i#ojAh>$N_@DupMfWcJKb1p*y=n{ww{8YSWd({*#JD-L^ul>yZBGA@-L{ z(2@8fSx`-e1o;0*-J%k1+hgjG|5Z<~Blfq}+Dlzq;9rF{`u}=Jn!Xb5ZMH)BuRI3o ztG)>0H~Z(;emj(ZTslkufSsp@uY-rLV1T=uo)!>94j>2o8I|%sEqt3r{>K$44*W)0sstP0DzD06E_E+|ED9W)qsvE^xo}*Z9H5Y9ejKRz3m~ zMs%QdZ4|EYzpMqnrPMkoMO}K-k`dOw4XkKP2h!0&Juv3^chPN2;B%Cu5!YV^`_0-> z!GBn+Asz4(wQI=pSKTcG3F)GW4Y~hKopezYe<HdhyAWytyWG@ufU>43AScgEaU JviiS=`+u#cYfS(E delta 8091 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 From 23b00280da2ed4904f98594ce277879da97f1890 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sat, 10 May 2014 15:47:00 +0200 Subject: [PATCH 18/30] configure.ac: AC_PREREQ changed. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c6861ebb..13c3cfe4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_PREREQ([2.69]) +AC_PREREQ([2.65]) AC_INIT([ebus-daemon], [0.1], [roland.jax@liwest.at], [ebus-daemon], [https://github.com/yuhu-/ebus-daemon]) AM_INIT_AUTOMAKE([1.11 -Wall no-define]) From 3cc04bf3a7ffffd91fcf670d1a2a2c2272cb6e6c Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sun, 11 May 2014 15:12:00 +0200 Subject: [PATCH 19/30] some cosmetics. --- src/baseloop.cpp | 2 +- src/ebusloop.cpp | 23 +++++++++++++---------- src/network.cpp | 32 ++++++++++++++++---------------- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index ba49c233..c572ac2f 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -91,7 +91,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) ebusCommand += m_commands->getEbusCommand(index); std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower); - L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); + L.log(bas, trace, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); // send busCommand m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); BusCommand* busCommand = m_ebusloop->getBusCommand(); diff --git a/src/ebusloop.cpp b/src/ebusloop.cpp index d1373f2a..079c22c7 100644 --- a/src/ebusloop.cpp +++ b/src/ebusloop.cpp @@ -28,13 +28,13 @@ extern Appl& A; EBusLoop::EBusLoop() : m_stop(false) { m_deviceName = A.getParam("p_device"); - + m_bus = new Bus(m_deviceName, A.getParam("p_nodevicecheck"), A.getParam("p_dumpfile"), A.getParam("p_dumpsize"), A.getParam("p_dump")); - + m_bus->connect(); if (m_bus->isConnected() == false) @@ -44,10 +44,10 @@ EBusLoop::EBusLoop() : m_stop(false) EBusLoop::~EBusLoop() { m_bus->disconnect(); - + if (m_bus->isConnected() == true) L.log(bus, error, "error during disconnect."); - + delete m_bus; } @@ -55,7 +55,7 @@ void* EBusLoop::run() { int busResult; bool busCommandActive = false; - + for (;;) { if (m_bus->isConnected() == true) { @@ -72,13 +72,16 @@ void* EBusLoop::run() // add new bus command to send if (busResult == 4 && busCommandActive == false && m_sendBuffer.size() != 0) { BusCommand* busCommand = m_sendBuffer.remove(); + L.log(bus, debug, " type: %s msg: %s", + busCommand->getType().c_str(), busCommand->getCommand().c_str()); m_bus->addCommand(busCommand); + L.log(bus, debug, " addCommand success"); busCommandActive = true; } // send bus command if (busResult == 1 && busCommandActive == true) { - L.log(bus, event, " getBus success"); + L.log(bus, trace, " getBus success"); m_bus->sendCommand(); BusCommand* busCommand = m_bus->recvCommand(); L.log(bus, trace, " %s", busCommand->getResult().c_str()); @@ -87,21 +90,21 @@ void* EBusLoop::run() } if (busResult == 0) - L.log(bus, event, " getBus failure"); + L.log(bus, trace, " getBus failure"); if (busResult == -1) L.log(bus, event, " getBus error"); - + } else { sleep(10); m_bus->connect(); - + if (m_bus->isConnected() == false) L.log(bus, error, "can't open %s", m_deviceName.c_str()); } if (m_stop == true) { - m_bus->disconnect(); + m_bus->disconnect(); return NULL; } } diff --git a/src/network.cpp b/src/network.cpp index c4b74487..318a4695 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -38,7 +38,7 @@ void Connection::addResult(Message message) void* Connection::run() { m_running = true; - + int maxfd; fd_set checkfds; struct timeval timeout; @@ -46,7 +46,7 @@ void* Connection::run() FD_ZERO(&checkfds); FD_SET(m_notify.notifyFD(), &checkfds); FD_SET(m_socket->getFD(), &checkfds); - + (m_notify.notifyFD() > m_socket->getFD()) ? (maxfd = m_notify.notifyFD()) : (maxfd = m_socket->getFD()); @@ -56,7 +56,7 @@ void* Connection::run() // set select timeout 10 secs timeout.tv_sec = 10; - timeout.tv_usec = 0; + timeout.tv_usec = 0; // set readfds to inital checkfds readfds = checkfds; @@ -65,7 +65,7 @@ void* Connection::run() if (ret == 0) { continue; } - + // new data from notify if (FD_ISSET(m_notify.notifyFD(), &readfds)) break; @@ -79,7 +79,7 @@ void* Connection::run() datalen = m_socket->recv(data, sizeof(data)-1); else break; - + // removed closed socket if (datalen <= 0 || strncasecmp(data, "quit", 4) == 0) break; @@ -94,12 +94,12 @@ void* Connection::run() L.log(net, debug, "[%08x] result added", getID()); std::string result(message->getData()); - + if (m_socket->isValid() == true) m_socket->send(result.c_str(), result.size()); else - break; - + break; + delete message; } @@ -108,7 +108,7 @@ void* Connection::run() delete m_socket; m_running = false; - L.log(net, event, "[%08x] connection closed - active connections: %d", getID(), m_count); + L.log(net, trace, "[%08x] connection closed - active connections: %d", getID(), m_count); return NULL; } @@ -137,10 +137,10 @@ Network::~Network() connection->join(); delete connection; } - + if (m_running == true) stop(); - + delete m_Listener; } @@ -158,7 +158,7 @@ void* Network::run() FD_ZERO(&checkfds); FD_SET(m_notify.notifyFD(), &checkfds); FD_SET(m_Listener->getFD(), &checkfds); - + (m_notify.notifyFD() > m_Listener->getFD()) ? (maxfd = m_notify.notifyFD()) : (maxfd = m_Listener->getFD()); @@ -168,7 +168,7 @@ void* Network::run() // set select timeout 1 secs timeout.tv_sec = 1; - timeout.tv_usec = 0; + timeout.tv_usec = 0; // set readfds to inital checkfds readfds = checkfds; @@ -178,7 +178,7 @@ void* Network::run() cleanConnections(); continue; } - + // new data from notify if (FD_ISSET(m_notify.notifyFD(), &readfds)) { m_running = false; @@ -190,14 +190,14 @@ void* Network::run() TCPSocket* socket = m_Listener->newSocket(); if (socket == NULL) continue; - + Connection* connection = new Connection(socket, m_queue); if (connection == NULL) continue; connection->start("netConnection"); m_connections.push_back(connection); - L.log(net, event, "[%08x] connection opened %s", connection->getID(), socket->getIP().c_str()); + L.log(net, trace, "[%08x] connection opened %s", connection->getID(), socket->getIP().c_str()); } } From e3395116471868239d3d7175a6f32e19b12b8c1f Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sun, 11 May 2014 20:25:29 +0200 Subject: [PATCH 20/30] ReadMe adapted. --- ChangeLog | 4 ++++ NEWS | 3 +++ README | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5af6adfb..28ef9efb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2014-05-11 Roland Jax + + * Beta-Test. + 2014-01-09 Roland Jax * Initial commit. diff --git a/NEWS b/NEWS index e69de29b..28b2cbac 100644 --- a/NEWS +++ b/NEWS @@ -0,0 +1,3 @@ +2014-05-11 Roland Jax + + * Beta-Test. diff --git a/README b/README index 1e6cf141..4de22d0b 100644 --- a/README +++ b/README @@ -1,4 +1,38 @@ -ebusd +ebus-daemon +----------- + +The ebus-daemon provides a communication interface to the energy bus (ebus) +which is used in various heating systems. + + +Features +-------- + + * send and receive ebus commands + - message types: Broadcast, Master-Master and Master-Slave + - collect data of cycle messages + + * tcp socket multi session server (daemon commands) + - get fetch data from ebus participant + - set adjust data of ebus participant + - cyc fetch data from collected cycle messages + - log change loglevel + - dump toggle dump on/off + - quit close connection + + +Build ----- -Daemon to communicate with ebus based heating systems. +$ ./autogen.sh [--prefix=/usr] +$ make +$ make install + + +Daemon Configuration +-------------------- + +See ./ebus-daemon -h + + +The author can be contacted at roland.jax@liwest.at. From 2a2b638fc48bda730c6bb33715ae90cb03ca43c9 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 12 May 2014 17:59:41 +0200 Subject: [PATCH 21/30] cleanup: not necessary c_str() removed. --- src/baseloop.cpp | 10 +++++----- src/baseloop.h | 8 ++++---- utils/logger.cpp | 26 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index c572ac2f..2b3e1323 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -48,7 +48,7 @@ void BaseLoop::start() // send result to client result += '\n'; Connection* connection = static_cast(message->getSource()); - connection->addResult(Message(result.c_str())); + connection->addResult(Message(result)); delete message; } @@ -98,7 +98,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) if (busCommand->getResult().c_str()[0] != '-') { // decode data - Command* command = new Command(index, (*m_commands)[index], busCommand->getResult().c_str()); + Command* command = new Command(index, (*m_commands)[index], busCommand->getResult()); // return result result << command->calcResult(cmd); @@ -106,7 +106,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) delete command; } else { L.log(bas, error, " %s", busCommand->getResult().c_str()); - result << busCommand->getResult().c_str(); + result << busCommand->getResult(); } @@ -159,7 +159,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) } else { L.log(bas, error, " %s", busCommand->getResult().c_str()); - result << busCommand->getResult().c_str(); + result << busCommand->getResult(); } delete busCommand; @@ -184,7 +184,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) cycdata = m_cycdata->getData(index); if (cycdata != "") { // decode data - Command* command = new Command(index, (*m_commands)[index], cycdata.c_str()); + Command* command = new Command(index, (*m_commands)[index], cycdata); // return result result << command->calcResult(cmd); diff --git a/src/baseloop.h b/src/baseloop.h index 0ca9e217..f2cf3d0c 100644 --- a/src/baseloop.h +++ b/src/baseloop.h @@ -37,12 +37,12 @@ public: Message(const std::string data, void* source = NULL) : m_data(data), m_source(source) {} Message(const Message& src) : m_data(src.m_data), m_source(src.m_source) {} - std::string getData() const { return m_data.c_str(); } + std::string getData() const { return m_data; } void* getSource() const { return m_source; } private: std::string m_data; - void* m_source; + void* m_source; }; @@ -52,7 +52,7 @@ class BaseLoop public: BaseLoop(EBusLoop* ebusloop, CYCData* cycdata, Commands* commands) : m_ebusloop(ebusloop), m_cycdata(cycdata), m_commands(commands) {} - + void start(); WQueue* getQueue() { return &m_queue; } @@ -64,7 +64,7 @@ private: Commands* m_commands; WQueue m_queue; - enum ClientCommand { + enum ClientCommand { get, // get ebus data set, // set ebus value cyc, // fetch cycle data diff --git a/utils/logger.cpp b/utils/logger.cpp index 9e7f04f3..e0ed83db 100644 --- a/utils/logger.cpp +++ b/utils/logger.cpp @@ -37,10 +37,10 @@ LogMessage::LogMessage(const Area area, const Level level, const std::string tex struct timeval tv; struct timezone tz; struct tm* tm; - + gettimeofday(&tv, &tz); tm = localtime(&tv.tv_sec); - + sprintf(&time[0], "%04d-%02d-%02d %02d:%02d:%02d.%03ld", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec/1000); @@ -65,11 +65,11 @@ void* LogSink::run() while (m_queue.size() == true) { LogMessage* message = m_queue.remove(); write(*message); - delete message; + delete message; } return NULL; } - + write(*message); delete message; } @@ -129,7 +129,7 @@ LogInstance& LogInstance::operator+= (LogSink* sink) return (*this); } - + LogInstance& LogInstance::operator-= (const LogSink* sink) { sinkCI_t itEnd = m_sinks.end(); @@ -151,12 +151,12 @@ void LogInstance::log(const Area area, const Level level, const std::string& dat char* tmp; va_list ap; va_start(ap, data); - + if (vasprintf(&tmp, data.c_str(), ap) != -1) { std::string buffer(tmp); - m_messages.add(new LogMessage(LogMessage(area, level, buffer.c_str(), LogMessage::Run))); + m_messages.add(new LogMessage(LogMessage(area, level, buffer, LogMessage::Run))); } - + va_end(ap); free(tmp); } @@ -166,15 +166,15 @@ void LogInstance::log(const Area area, const Level level, const std::string& dat void* LogInstance::run() { m_running = true; - + while (m_running == true) { LogMessage* message = m_messages.remove(); sinkCI_t iter = m_sinks.begin(); - + for (; iter != m_sinks.end(); ++iter) { if (*iter != 0) { - + if (((*iter)->getAreas() & message->getArea() && (*iter)->getLevel() >= message->getLevel()) && message->getStatus() == LogMessage::Run) { @@ -183,10 +183,10 @@ void* LogInstance::run() (*iter)->addMessage(*message); m_running = false; } - + } } - + delete message; } From 820b4dd6bee2166cb65156cc9ec8e594205d4645 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 12 May 2014 18:17:46 +0200 Subject: [PATCH 22/30] class BaseLoop: help page added; ReadMe adapted. --- README | 9 ++++++++- src/baseloop.cpp | 10 ++++++++++ src/baseloop.h | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README b/README index 4de22d0b..32ec24f5 100644 --- a/README +++ b/README @@ -16,9 +16,16 @@ Features - get fetch data from ebus participant - set adjust data of ebus participant - cyc fetch data from collected cycle messages - - log change loglevel - dump toggle dump on/off + - log change loglevel - quit close connection + - help print help page + + +Dependency +---------- + * libebus (https://github.com/yuhu-/libebus) + * glibc Build diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 2b3e1323..c03cbc01 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -213,6 +213,16 @@ std::string BaseLoop::decodeMessage(const std::string& data) result << "done"; break; + case help: + result << " get - fetch ebus data [get class cmd (sub)]" << std::endl + << " set - set ebus values [set class cmd value]" << std::endl + << " cyc - fetch cycle data [cyc class cmd (sub)]" << std::endl + << " dump - change dump state [dump on|off]" << std::endl + << " log - change log level [log error|event|trace|debug]" << std::endl + << " quit - close connection" << std::endl + << " help - print this page"; + break; + default: break; } diff --git a/src/baseloop.h b/src/baseloop.h index f2cf3d0c..1ecb7951 100644 --- a/src/baseloop.h +++ b/src/baseloop.h @@ -70,6 +70,7 @@ private: cyc, // fetch cycle data dump, // change dump state log, // change log level + help, // print commands notfound }; @@ -81,6 +82,7 @@ private: if (strcasecmp(item.c_str(), "cyc") == 0) return cyc; if (strcasecmp(item.c_str(), "dump") == 0) return dump; if (strcasecmp(item.c_str(), "log") == 0) return log; + if (strcasecmp(item.c_str(), "help") == 0) return help; return notfound; } From 92a3f7fbc519414005797f041a43a5cd06b42d98 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Tue, 13 May 2014 18:58:10 +0200 Subject: [PATCH 23/30] daemon parameter '--retries' (number retries send ebus command) added. --- src/ebusloop.cpp | 16 ++++++++++++++-- src/ebusloop.h | 1 + src/main.cpp | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ebusloop.cpp b/src/ebusloop.cpp index 079c22c7..224425a7 100644 --- a/src/ebusloop.cpp +++ b/src/ebusloop.cpp @@ -35,6 +35,8 @@ EBusLoop::EBusLoop() : m_stop(false) A.getParam("p_dumpsize"), A.getParam("p_dump")); + m_retries = A.getParam("p_retries"); + m_bus->connect(); if (m_bus->isConnected() == false) @@ -54,6 +56,7 @@ EBusLoop::~EBusLoop() void* EBusLoop::run() { int busResult; + int retries = 0; bool busCommandActive = false; for (;;) { @@ -85,8 +88,17 @@ void* EBusLoop::run() m_bus->sendCommand(); BusCommand* busCommand = m_bus->recvCommand(); L.log(bus, trace, " %s", busCommand->getResult().c_str()); - m_recvBuffer.add(busCommand); - busCommandActive = false; + + if (busCommand->getResult().c_str()[0] == '-' && retries < m_retries) { + retries++; + L.log(bus, trace, " retry number: %d", retries); + busCommand->setResult(std::string()); + m_bus->addCommand(busCommand); + } else { + retries = 0; + m_recvBuffer.add(busCommand); + busCommandActive = false; + } } if (busResult == 0) diff --git a/src/ebusloop.h b/src/ebusloop.h index 53b9fd5c..8212b995 100644 --- a/src/ebusloop.h +++ b/src/ebusloop.h @@ -51,6 +51,7 @@ private: bool m_stop; WQueue m_sendBuffer; WQueue m_recvBuffer; + int m_retries; }; diff --git a/src/main.cpp b/src/main.cpp index 807ea4d1..241e1ba7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,6 +60,10 @@ void define_args() "disable valid ebus device test\n", Appl::type_bool, Appl::opt_none); + A.addItem("p_retries", Appl::Param(2), "r", "retries", + "\tnumber retries send ebus command (default: 2)\n", + Appl::type_int, Appl::opt_mandatory); + A.addItem("p_ebusconfdir", Appl::Param("/etc/ebus-daemon"), "e", "ebusconfdir", "directory for ebus configuration (default: /etc/ebus-daemon)\n", Appl::type_string, Appl::opt_mandatory); From ad200cc6b934b8af05115cea6f7a054b06f9a1d1 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Wed, 14 May 2014 19:07:47 +0200 Subject: [PATCH 24/30] class BaseLoop: parameter test for dump and log command added. --- src/baseloop.cpp | 16 +++++++++++++--- src/main.cpp | 12 ++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index c03cbc01..7bb2bed3 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -78,7 +78,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case get: if (cmd.size() < 3) { - result << "format: type class cmd [sub]"; + result << "format: get class cmd (sub)"; break; } @@ -120,7 +120,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case set: if (cmd.size() != 4) { - result << "format: type class cmd value"; + result << "format: set class cmd value"; break; } @@ -173,7 +173,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case cyc: if (cmd.size() < 3) { - result << "format: type class cmd [sub]"; + result << "format: cyc class cmd (sub)"; break; } @@ -200,12 +200,22 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case dump: + if (cmd.size() < 2) { + result << "format: dump on|off"; + break; + } + if (cmd[1] == "on") m_ebusloop->dump(true); if (cmd[1] == "off") m_ebusloop->dump(false); result << "done"; break; case log: + if (cmd.size() < 2) { + result << "format: log error|event|trace|debug"; + break; + } + if (cmd[1] == "error") L.getSink(0)->setLevel(error); if (cmd[1] == "event") L.getSink(0)->setLevel(event); if (cmd[1] == "trace") L.getSink(0)->setLevel(trace); diff --git a/src/main.cpp b/src/main.cpp index 241e1ba7..b3d0e48f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -84,11 +84,11 @@ void define_args() "\tlog file name (default: /var/log/ebus-daemon.log)", Appl::type_string, Appl::opt_mandatory); - A.addItem("p_area", Appl::Param(all), "", "logarea", + A.addItem("p_logarea", Appl::Param(all), "", "logarea", "\tlogging area (bas=1, net=2, bus=4, cyc=8, default: all=15)", Appl::type_int, Appl::opt_mandatory); - A.addItem("p_level", Appl::Param(trace), "", "loglevel", + A.addItem("p_loglevel", Appl::Param(trace), "", "loglevel", "\tlogging level (error=0, event=1, default: trace=2, debug=3)\n", Appl::type_int, Appl::opt_mandatory); @@ -196,13 +196,13 @@ int main(int argc, char* argv[]) // make me Daemon if (A.getParam("p_foreground") == true) { - L += new LogConsole(A.getParam("p_area"), - static_cast(A.getParam("p_level")), + L += new LogConsole(A.getParam("p_logarea"), + static_cast(A.getParam("p_loglevel")), "logConsole"); } else { D.run("/var/run/ebus-daemon.pid"); - L += new LogFile(A.getParam("p_area"), - static_cast(A.getParam("p_level")), + L += new LogFile(A.getParam("p_logarea"), + static_cast(A.getParam("p_loglevel")), "logFile", A.getParam("p_logfile")); } From 0821a7d31b33e22afddd83639cfb56e4d616ac26 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Thu, 15 May 2014 21:08:49 +0200 Subject: [PATCH 25/30] init and logrotate file added. --- .../{csv => etc/ebus-daemon}/vaillant/ci.csv | 0 .../{csv => etc/ebus-daemon}/vaillant/ci.ods | Bin .../ebus-daemon}/vaillant/vpm20s.csv | 0 .../ebus-daemon}/vaillant/vpm20s.ods | Bin .../ebus-daemon}/vaillant/vpm3035w.csv | 0 .../ebus-daemon}/vaillant/vpm3035w.ods | Bin .../ebus-daemon}/vaillant/vr603.csv | 0 .../ebus-daemon}/vaillant/vr603.ods | Bin .../ebus-daemon}/vaillant/vr903.csv | 0 .../ebus-daemon}/vaillant/vr903.ods | Bin .../{csv => etc/ebus-daemon}/vaillant/vwx.csv | 0 .../{csv => etc/ebus-daemon}/vaillant/vwx.ods | Bin contrib/etc/init.d/ebus-daemon.debian | 44 ++++++++++++++++++ contrib/etc/logrotate.d/ebus-daemon | 9 ++++ 14 files changed, 53 insertions(+) rename contrib/{csv => etc/ebus-daemon}/vaillant/ci.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/ci.ods (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vpm20s.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vpm20s.ods (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vpm3035w.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vpm3035w.ods (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vr603.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vr603.ods (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vr903.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vr903.ods (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vwx.csv (100%) rename contrib/{csv => etc/ebus-daemon}/vaillant/vwx.ods (100%) create mode 100755 contrib/etc/init.d/ebus-daemon.debian create mode 100644 contrib/etc/logrotate.d/ebus-daemon diff --git a/contrib/csv/vaillant/ci.csv b/contrib/etc/ebus-daemon/vaillant/ci.csv similarity index 100% rename from contrib/csv/vaillant/ci.csv rename to contrib/etc/ebus-daemon/vaillant/ci.csv diff --git a/contrib/csv/vaillant/ci.ods b/contrib/etc/ebus-daemon/vaillant/ci.ods similarity index 100% rename from contrib/csv/vaillant/ci.ods rename to contrib/etc/ebus-daemon/vaillant/ci.ods diff --git a/contrib/csv/vaillant/vpm20s.csv b/contrib/etc/ebus-daemon/vaillant/vpm20s.csv similarity index 100% rename from contrib/csv/vaillant/vpm20s.csv rename to contrib/etc/ebus-daemon/vaillant/vpm20s.csv diff --git a/contrib/csv/vaillant/vpm20s.ods b/contrib/etc/ebus-daemon/vaillant/vpm20s.ods similarity index 100% rename from contrib/csv/vaillant/vpm20s.ods rename to contrib/etc/ebus-daemon/vaillant/vpm20s.ods diff --git a/contrib/csv/vaillant/vpm3035w.csv b/contrib/etc/ebus-daemon/vaillant/vpm3035w.csv similarity index 100% rename from contrib/csv/vaillant/vpm3035w.csv rename to contrib/etc/ebus-daemon/vaillant/vpm3035w.csv diff --git a/contrib/csv/vaillant/vpm3035w.ods b/contrib/etc/ebus-daemon/vaillant/vpm3035w.ods similarity index 100% rename from contrib/csv/vaillant/vpm3035w.ods rename to contrib/etc/ebus-daemon/vaillant/vpm3035w.ods diff --git a/contrib/csv/vaillant/vr603.csv b/contrib/etc/ebus-daemon/vaillant/vr603.csv similarity index 100% rename from contrib/csv/vaillant/vr603.csv rename to contrib/etc/ebus-daemon/vaillant/vr603.csv diff --git a/contrib/csv/vaillant/vr603.ods b/contrib/etc/ebus-daemon/vaillant/vr603.ods similarity index 100% rename from contrib/csv/vaillant/vr603.ods rename to contrib/etc/ebus-daemon/vaillant/vr603.ods diff --git a/contrib/csv/vaillant/vr903.csv b/contrib/etc/ebus-daemon/vaillant/vr903.csv similarity index 100% rename from contrib/csv/vaillant/vr903.csv rename to contrib/etc/ebus-daemon/vaillant/vr903.csv diff --git a/contrib/csv/vaillant/vr903.ods b/contrib/etc/ebus-daemon/vaillant/vr903.ods similarity index 100% rename from contrib/csv/vaillant/vr903.ods rename to contrib/etc/ebus-daemon/vaillant/vr903.ods diff --git a/contrib/csv/vaillant/vwx.csv b/contrib/etc/ebus-daemon/vaillant/vwx.csv similarity index 100% rename from contrib/csv/vaillant/vwx.csv rename to contrib/etc/ebus-daemon/vaillant/vwx.csv diff --git a/contrib/csv/vaillant/vwx.ods b/contrib/etc/ebus-daemon/vaillant/vwx.ods similarity index 100% rename from contrib/csv/vaillant/vwx.ods rename to contrib/etc/ebus-daemon/vaillant/vwx.ods diff --git a/contrib/etc/init.d/ebus-daemon.debian b/contrib/etc/init.d/ebus-daemon.debian new file mode 100755 index 00000000..d64558da --- /dev/null +++ b/contrib/etc/init.d/ebus-daemon.debian @@ -0,0 +1,44 @@ +#!/bin/sh + +### BEGIN INIT INFO +# Provides: ebus-daemon +# Required-Start: $network $remote_fs $syslog +# Required-Stop: $network $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: Start ebus-daemon +### END INIT INFO + +PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin + +. /lib/lsb/init-functions + +DAEMON=/usr/bin/ebus-daemon +PIDFILE=/var/run/ebus-daemon.pid + +test -x $DAEMON || exit 5 + +case $1 in + start) + log_daemon_msg "Starting ebus-daemon" "ebus-daemon" + start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON + status=$? + log_end_msg $status + ;; + stop) + log_daemon_msg "Stopping ebus-daemon" "ebus-daemon" + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + log_end_msg $? + rm -f $PIDFILE + ;; + restart|force-reload) + $0 stop && sleep 2 && $0 start + ;; + status) + status_of_proc $DAEMON "ebus-daemon" + ;; + *) + echo "Usage: $0 {start|stop|restart|force-reload|status}" + exit 2 + ;; +esac diff --git a/contrib/etc/logrotate.d/ebus-daemon b/contrib/etc/logrotate.d/ebus-daemon new file mode 100644 index 00000000..2e253ea6 --- /dev/null +++ b/contrib/etc/logrotate.d/ebus-daemon @@ -0,0 +1,9 @@ +/var/log/ebus-daemon.log { + rotate 7 + size 1M + copytruncate + compress + missingok + notifempty + daily +} From 0ed9795d99c1815c815c65899a98bd6a1a5be940 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sat, 17 May 2014 13:36:09 +0200 Subject: [PATCH 26/30] logger: logarea and loglevel reimplemented; daemon socket option logarea added. --- src/baseloop.cpp | 42 ++++++++++++++++++------------ src/baseloop.h | 16 +++++++----- src/main.cpp | 36 ++++++++++++------------- utils/logger.cpp | 42 +++++++++++++++++++++++++++--- utils/logger.h | 68 +++++++++++++++++++++++++----------------------- 5 files changed, 127 insertions(+), 77 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 7bb2bed3..27d184de 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -78,7 +78,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case get: if (cmd.size() < 3) { - result << "format: get class cmd (sub)"; + result << "format: [get class cmd (sub)]"; break; } @@ -120,7 +120,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case set: if (cmd.size() != 4) { - result << "format: set class cmd value"; + result << "format: [set class cmd value]"; break; } @@ -173,7 +173,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case cyc: if (cmd.size() < 3) { - result << "format: cyc class cmd (sub)"; + result << "format: [cyc class cmd (sub)]"; break; } @@ -201,7 +201,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) case dump: if (cmd.size() < 2) { - result << "format: dump on|off"; + result << "format: [dump state] (on|off)"; break; } @@ -210,27 +210,35 @@ std::string BaseLoop::decodeMessage(const std::string& data) result << "done"; break; - case log: + case logarea: if (cmd.size() < 2) { - result << "format: log error|event|trace|debug"; + result << "format: [logarea area,area,..] (bas|net|bus|cyc|all)"; break; } - if (cmd[1] == "error") L.getSink(0)->setLevel(error); - if (cmd[1] == "event") L.getSink(0)->setLevel(event); - if (cmd[1] == "trace") L.getSink(0)->setLevel(trace); - if (cmd[1] == "debug") L.getSink(0)->setLevel(debug); + L.getSink(0)->setAreas(calcArea(cmd[1])); + result << "done"; + break; + + case loglevel: + if (cmd.size() < 2) { + result << "format: [loglevel level] (error|event|trace|debug)"; + break; + } + + L.getSink(0)->setLevel(calcLevel(cmd[1])); result << "done"; break; case help: - result << " get - fetch ebus data [get class cmd (sub)]" << std::endl - << " set - set ebus values [set class cmd value]" << std::endl - << " cyc - fetch cycle data [cyc class cmd (sub)]" << std::endl - << " dump - change dump state [dump on|off]" << std::endl - << " log - change log level [log error|event|trace|debug]" << std::endl - << " quit - close connection" << std::endl - << " help - print this page"; + result << " get - fetch ebus data [get class cmd (sub)]" << std::endl + << " set - set ebus values [set class cmd value]" << std::endl + << " cyc - fetch cycle data [cyc class cmd (sub)]" << std::endl + << " dump - change dump state [dump state] (on|off)" << std::endl + << " logarea - change log area [logarea area,area,..] (bas|net|bus|cyc|all)" << std::endl + << " loglevel - change log level [loglevel level] (error|event|trace|debug)" << std::endl + << " quit - close connection" << std::endl + << " help - print this page"; break; default: diff --git a/src/baseloop.h b/src/baseloop.h index 1ecb7951..fdbaa914 100644 --- a/src/baseloop.h +++ b/src/baseloop.h @@ -65,12 +65,13 @@ private: WQueue m_queue; enum ClientCommand { - get, // get ebus data - set, // set ebus value - cyc, // fetch cycle data - dump, // change dump state - log, // change log level - help, // print commands + get, // get ebus data + set, // set ebus value + cyc, // fetch cycle data + dump, // change dump state + logarea, // change log area + loglevel, // change log level + help, // print commands notfound }; @@ -81,7 +82,8 @@ private: if (strcasecmp(item.c_str(), "set") == 0) return set; if (strcasecmp(item.c_str(), "cyc") == 0) return cyc; if (strcasecmp(item.c_str(), "dump") == 0) return dump; - if (strcasecmp(item.c_str(), "log") == 0) return log; + if (strcasecmp(item.c_str(), "logarea") == 0) return logarea; + if (strcasecmp(item.c_str(), "loglevel") == 0) return loglevel; if (strcasecmp(item.c_str(), "help") == 0) return help; return notfound; diff --git a/src/main.cpp b/src/main.cpp index b3d0e48f..d778b23b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -49,11 +49,11 @@ CYCData* cycdata; void define_args() { A.addItem("p_address", Appl::Param("FF"), "a", "address", - "\tebus device address (default: FF)", + "\tebus device address (FF)", Appl::type_string, Appl::opt_mandatory); A.addItem("p_device", Appl::Param("/dev/ttyUSB0"), "d", "device", - "\tebus device (serial or network) (default: /dev/ttyUSB0)", + "\tebus device (serial or network) (/dev/ttyUSB0)", Appl::type_string, Appl::opt_mandatory); A.addItem("p_nodevicecheck", Appl::Param(false), "n", "nodevicecheck", @@ -61,11 +61,11 @@ void define_args() Appl::type_bool, Appl::opt_none); A.addItem("p_retries", Appl::Param(2), "r", "retries", - "\tnumber retries send ebus command (default: 2)\n", + "\tnumber retries send ebus command (2)\n", Appl::type_int, Appl::opt_mandatory); A.addItem("p_ebusconfdir", Appl::Param("/etc/ebus-daemon"), "e", "ebusconfdir", - "directory for ebus configuration (default: /etc/ebus-daemon)\n", + "directory for ebus configuration (/etc/ebus-daemon)\n", Appl::type_string, Appl::opt_mandatory); A.addItem("p_foreground", Appl::Param(false), "f", "foreground", @@ -73,7 +73,7 @@ void define_args() Appl::type_bool, Appl::opt_none); A.addItem("p_port", Appl::Param(8888), "p", "port", - "\tlisten port (default: 8888)", + "\tlisten port (8888)", Appl::type_int, Appl::opt_mandatory); A.addItem("p_localhost", Appl::Param(false), "", "localhost", @@ -81,27 +81,27 @@ void define_args() Appl::type_bool, Appl::opt_none); A.addItem("p_logfile", Appl::Param("/var/log/ebus-daemon.log"), "l", "logfile", - "\tlog file name (default: /var/log/ebus-daemon.log)", + "\tlog file name (/var/log/ebus-daemon.log)", Appl::type_string, Appl::opt_mandatory); - A.addItem("p_logarea", Appl::Param(all), "", "logarea", - "\tlogging area (bas=1, net=2, bus=4, cyc=8, default: all=15)", - Appl::type_int, Appl::opt_mandatory); + A.addItem("p_logarea", Appl::Param("all"), "", "logarea", + "\tlogging area - bas|net|bus|cyc|all (all)", + Appl::type_string, Appl::opt_mandatory); - A.addItem("p_loglevel", Appl::Param(trace), "", "loglevel", - "\tlogging level (error=0, event=1, default: trace=2, debug=3)\n", - Appl::type_int, Appl::opt_mandatory); + A.addItem("p_loglevel", Appl::Param("trace"), "", "loglevel", + "\tlogging level - error|event|trace|debug (event)\n", + Appl::type_string, Appl::opt_mandatory); A.addItem("p_dump", Appl::Param(false), "D", "dump", "\tenable dump", Appl::type_bool, Appl::opt_none); A.addItem("p_dumpfile", Appl::Param("/tmp/ebus_dump.bin"), "", "dumpfile", - "\tdump file name (default: /tmp/ebus_dump.bin)", + "\tdump file name (/tmp/ebus_dump.bin)", Appl::type_string, Appl::opt_mandatory); A.addItem("p_dumpsize", Appl::Param(100), "", "dumpsize", - "\tmax size for dump file in kB (default: 100)\n", + "\tmax size for dump file in kB (100)\n", Appl::type_long, Appl::opt_mandatory); A.addItem("p_settings", Appl::Param(false), "", "settings", @@ -196,13 +196,13 @@ int main(int argc, char* argv[]) // make me Daemon if (A.getParam("p_foreground") == true) { - L += new LogConsole(A.getParam("p_logarea"), - static_cast(A.getParam("p_loglevel")), + L += new LogConsole(calcArea(A.getParam("p_logarea")), + calcLevel(A.getParam("p_loglevel")), "logConsole"); } else { D.run("/var/run/ebus-daemon.pid"); - L += new LogFile(A.getParam("p_logarea"), - static_cast(A.getParam("p_loglevel")), + L += new LogFile(calcArea(A.getParam("p_logarea")), + calcLevel(A.getParam("p_loglevel")), "logFile", A.getParam("p_logfile")); } diff --git a/utils/logger.cpp b/utils/logger.cpp index e0ed83db..02299ca5 100644 --- a/utils/logger.cpp +++ b/utils/logger.cpp @@ -19,6 +19,7 @@ #include "logger.h" #include +#include #include #include #include @@ -27,10 +28,45 @@ #include #include -static const char* AreaNames[Size_of_Area] = { "bas", "net", "bus" , "cyc" }; +static const char* AreaNames[Size_of_Area] = { "bas", "net", "bus", "cyc" }; static const char* LevelNames[Size_of_Level] = { "error", "event", "trace", "debug" }; -LogMessage::LogMessage(const Area area, const Level level, const std::string text, const Status status) +int calcArea(const std::string area) +{ + int m_area = 0; + + // prepare data + std::string token; + std::istringstream stream(area); + std::vector cmd; + + while (std::getline(stream, token, ',') != 0) + cmd.push_back(token); + + for (std::vector::iterator it = cmd.begin() ; it != cmd.end(); ++it) + for (int i = 0; i < Size_of_Area; i++) { + if (strcasecmp("all", it->c_str()) == 0) + return (pow(2, (int)Size_of_Area) - 1); + + if (strcasecmp(AreaNames[i], it->c_str()) == 0) + m_area += pow(2, i); + } + + return m_area; +} + +int calcLevel(const std::string level) +{ + int m_level = event; + for (int i = 0; i < Size_of_Level; i++) + if (strcasecmp(LevelNames[i], level.c_str()) == 0) + return i; + + return m_level; +} + + +LogMessage::LogMessage(const int area, const int level, const std::string text, const Status status) : m_area(area), m_level(level), m_text(text), m_status(status) { char time[24]; @@ -145,7 +181,7 @@ LogInstance& LogInstance::operator-= (const LogSink* sink) return (*this); } -void LogInstance::log(const Area area, const Level level, const std::string& data, ...) +void LogInstance::log(const int area, const int level, const std::string& data, ...) { if (m_running == true) { char* tmp; diff --git a/utils/logger.h b/utils/logger.h index c92cf49d..73593f4c 100644 --- a/utils/logger.h +++ b/utils/logger.h @@ -31,14 +31,18 @@ enum Area { bas=1, net=2, bus=4, cyc=8, all=15, Size_of_Area=4 }; enum Level { error=0, event, trace, debug, Size_of_Level }; +int calcArea(const std::string area); +int calcLevel(const std::string level); + + class LogMessage { - + public: enum Status { Run, End }; - - LogMessage(const Area area, const Level level, const std::string text, const Status status); - + + LogMessage(const int area, const int level, const std::string text, const Status status); + ~LogMessage() {} LogMessage(const LogMessage& src) @@ -48,16 +52,16 @@ public: void operator= (const LogMessage& src) { m_area = src.m_area; m_level = src.m_level; m_text = src.m_text; m_status = src.m_status; m_time = src.m_time; } - - Area getArea() const { return (m_area); } - Level getLevel() const { return(m_level); } + + int getArea() const { return (m_area); } + int getLevel() const { return(m_level); } std::string getText() const { return (m_text.c_str()); } Status getStatus() const { return (m_status); } std::string getTime() const { return (m_time.c_str()); } private: - Area m_area; - Level m_level; + int m_area; + int m_level; std::string m_text; Status m_status; std::string m_time; @@ -68,23 +72,23 @@ enum Type { Console, Logfile }; class LogSink : public Thread { - + public: - LogSink(const unsigned char areas, const Level level, const Type type, const char* name) + LogSink(const int areas, const int level, const Type type, const char* name) : m_areas(areas), m_level(level), m_type(type), m_name(name) {} virtual ~LogSink() {} - + void addMessage(const LogMessage& message); void* run(); - unsigned char getAreas() const { return (m_areas); } - void setAreas(const unsigned char areas) { m_areas = areas; } - - Level getLevel() const { return (m_level); } - void setLevel(const Level level) { m_level = level; } - + int getAreas() const { return (m_areas); } + void setAreas(const int& areas) { m_areas = areas; } + + int getLevel() const { return (m_level); } + void setLevel(const int& level) { m_level = level; } + Type getType() const { return (m_type); } const char* getName() const { return (m_name.c_str()); } @@ -92,20 +96,20 @@ protected: WQueue m_queue; private: - unsigned char m_areas; - Level m_level; + int m_areas; + int m_level; Type m_type; std::string m_name; - + virtual void write(const LogMessage& message) const = 0; }; class LogConsole : public LogSink { - + public: - LogConsole(const unsigned char areas, const Level level, const char* name) + LogConsole(const int areas, const int level, const char* name) : LogSink(areas, level, Console, name), m_instance(++m_numInstance) { this->start(name); } @@ -116,31 +120,31 @@ private: static int m_numInstance; void write(const LogMessage& message) const; - + }; class LogFile : public LogSink { - + public: - LogFile(const unsigned char areas, const Level level, const char* name, const char* filename) + LogFile(const int areas, const int level, const char* name, const char* filename) : LogSink(areas, level, Logfile, name), m_filename(filename), m_instance(++m_numInstance) { this->start(name); } ~LogFile() {} - + private: std::string m_filename; const int m_instance; static int m_numInstance; void write(const LogMessage& message) const; - + }; class LogInstance : public Thread { - + public: static LogInstance& Instance(); @@ -149,7 +153,7 @@ public: LogInstance& operator+= (LogSink* sink); LogInstance& operator-= (const LogSink* sink); - void log(const Area area, const Level level, const std::string& text, ...); + void log(const int area, const int level, const std::string& text, ...); int getNumberOfSinks() const { return(m_sinks.size()); } LogSink* getSink(const int Index) const { return(m_sinks[Index]); } @@ -158,11 +162,11 @@ public: void stop(); -private: +private: LogInstance() {} LogInstance(const LogInstance&); LogInstance& operator= (const LogInstance&); - + typedef std::vector sink_t; typedef std::vector::iterator sinkCI_t; From b75246bf1101d337be37f846afc418efd9f4fd49 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Sun, 18 May 2014 16:45:06 +0200 Subject: [PATCH 27/30] config: factor for DesiredTemp correted. --- contrib/etc/ebus-daemon/vaillant/vr603.csv | 30 ++++++++++----------- contrib/etc/ebus-daemon/vaillant/vr603.ods | Bin 21328 -> 21320 bytes src/network.cpp | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/contrib/etc/ebus-daemon/vaillant/vr603.csv b/contrib/etc/ebus-daemon/vaillant/vr603.csv index 4f14a37a..6457fe0c 100644 --- a/contrib/etc/ebus-daemon/vaillant/vr603.csv +++ b/contrib/etc/ebus-daemon/vaillant/vr603.csv @@ -6,24 +6,24 @@ get;vr603mk1;RemoteControlActive;Fernsteuerung aktiv;MS;52;B509;3;0D0A00;1;-;sd; get;vr603mk1;MixerDutyCycle;Mischer Einschaltdauer;MS;52;B509;3;0D0E00;1;-;sd;1;sch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;HolidayActive;Ferienprogramm aktiv;MS;52;B509;3;0D2700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;OperatingMode;Betriebsart;MS;52;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;FlowTempMin;Vorlaufsollwert MIN;MS;52;B509;3;0D3000;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;FlowTempMax;Vorlaufsollwert MAX;MS;52;B509;3;0D3100;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;DesiredTemp;Solltemperatur;MS;52;B509;3;0D3200;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;DesiredTempLow;Absenktemperatur;MS;52;B509;3;0D3300;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempMin;Vorlaufsollwert MIN;MS;52;B509;3;0D3000;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempMax;Vorlaufsollwert MAX;MS;52;B509;3;0D3100;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;DesiredTemp;Solltemperatur;MS;52;B509;3;0D3200;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;DesiredTempLow;Absenktemperatur;MS;52;B509;3;0D3300;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;HeatingCurve;Heizkurve;MS;52;B509;3;0D3500;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;52;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;52;B509;3;0D3600;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;PreHeatingTimeMax;Voraufheizung MAX;MS;52;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;FloorScreedDryingDay;Estrichtrocknung Tag;MS;52;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;HeatingCircuitType;Heizkreistyp;MS;52;B509;3;0D3C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;OperatingModeRemoteControl;Betriebsart Fernsteuerung;MS;52;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;FlowTempDesired;Vorlauftemperatur Soll;MS;52;B509;3;0D4600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;FlowTempDesired;Vorlauftemperatur Soll;MS;52;B509;3;0D4600;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;TankHeatingActive;Speicherladung aktiv;MS;52;B509;3;0D4700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;PowerSavingActive;Sparfunktion aktiv;MS;52;B509;3;0D4B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;PartyActive;Partyfunktion aktiv;MS;52;B509;3;0D4E00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;PumpCutOffTime;Pumpe Sperrzeit;MS;52;B509;3;0D4F00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;PumpState;Pumpe Status;MS;52;B509;3;0D9100;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;52;B509;3;0DBA00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk1;CoolingHysteresisTempMin;Kühlung Hysteresis Vorlauftemperatur MIN;MS;52;B509;3;0DBE00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;52;B509;3;0DBA00;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk1;CoolingHysteresisTempMin;Kühlung Hysteresis Vorlauftemperatur MIN;MS;52;B509;3;0DBE00;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk1;CoolingOperatingMode;Kühlung Betriebsart;MS;52;B509;3;0DBF00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;FlowTempSensor;Vorlauftemperatur Ist;MS;53;B509;3;0D0300;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vr603mk2;OutsideTemp;Aussentemperatur;MS;53;B509;3;0D0600;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; @@ -31,21 +31,21 @@ get;vr603mk2;RemoteControlActive;Fernsteuerung aktiv;MS;53;B509;3;0D0A00;1;-;sd; get;vr603mk2;MixerDutyCycle;Mischer Einschaltdauer;MS;53;B509;3;0D0F00;1;-;sd;1;sch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;HolidayActive;Ferienprogramm aktiv;MS;53;B509;3;0D2700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;OperatingMode;Betriebsart;MS;53;B509;3;0D2B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;FlowTempMin;Vorlaufsollwert MIN;MS;53;B509;3;0D3000;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;FlowTempMax;Vorlaufsollwert MAX;MS;53;B509;3;0D3100;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;DesiredTemp;Solltemperatur;MS;53;B509;3;0D3200;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;DesiredTempLow;Absenktemperatur;MS;53;B509;3;0D3300;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempMin;Vorlaufsollwert MIN;MS;53;B509;3;0D3000;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempMax;Vorlaufsollwert MAX;MS;53;B509;3;0D3100;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;DesiredTemp;Solltemperatur;MS;53;B509;3;0D3200;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;DesiredTempLow;Absenktemperatur;MS;53;B509;3;0D3300;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;HeatingCurve;Heizkurve;MS;53;B509;3;0D3500;1;-;sd;2,1;uin;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;53;B509;3;0D3600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;OutsideTempLimitShutdown;Abschaltgrenze Aussentempertur;MS;53;B509;3;0D3600;1;-;sd;1;uch;1.0;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;PreHeatingTimeMax;Voraufheizung MAX;MS;53;B509;3;0D3800;1;-;sd;1;uch;-;h;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;FloorScreedDryingDay;Estrichtrocknung Tag;MS;53;B509;3;0D3B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;HeatingCircuitType;Heizkreistyp;MS;53;B509;3;0D3C00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;OperatingModeRemoteControl;Betriebsart Fernsteuerung;MS;53;B509;3;0D3F00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;FlowTempDesired;Vorlauftemperatur Soll;MS;53;B509;3;0D4600;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;FlowTempDesired;Vorlauftemperatur Soll;MS;53;B509;3;0D4600;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;TankHeatingActive;Speicherladung aktiv;MS;53;B509;3;0D4700;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;PowerSavingActive;Sparfunktion aktiv;MS;53;B509;3;0D4B00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;PartyActive;Partyfunktion aktiv;MS;53;B509;3;0D4E00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;PumpCutOffTime;Pumpe Sperrzeit;MS;53;B509;3;0D4F00;1;-;sd;1;uch;-;min;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;PumpState;Pumpe Status;MS;53;B509;3;0D9400;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; -get;vr603mk2;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;53;B509;3;0DBA00;1;-;sd;1;uch;-;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; +get;vr603mk2;CoolingDeltaStart;Kühlung Starttemperturdifferenz;MS;53;B509;3;0DBA00;1;-;sd;1;uch;0.5;°C;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vr603mk2;CoolingOperatingMode;Kühlung Betriebsart;MS;53;B509;3;0DBF00;1;-;sd;1;uch;-;-;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/etc/ebus-daemon/vaillant/vr603.ods b/contrib/etc/ebus-daemon/vaillant/vr603.ods index 1c2ee776a350caf50fbe12d6da75f26a97129cdc..7ab86f017ad938e185a8c5c0bbc6d8498c706fa7 100644 GIT binary patch delta 10580 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 b#gV`CTLKOW3irPZ4Iz}O^so9A|5W}z9DA1s delta 10528 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 diff --git a/src/network.cpp b/src/network.cpp index 318a4695..e00e6e60 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -108,7 +108,7 @@ void* Connection::run() delete m_socket; m_running = false; - L.log(net, trace, "[%08x] connection closed - active connections: %d", getID(), m_count); + L.log(net, trace, "[%08x] connection closed", getID()); return NULL; } From fd93217f66a7d25e179264da53a0bcc9c51ec953 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 19 May 2014 20:24:12 +0200 Subject: [PATCH 28/30] NEW: new command 'hex' added; sends given hex value to slave [hex type value] (ZZ PB SB NN Dx) --- src/baseloop.cpp | 57 ++++++++++++++++++++++++++++++++++++++---------- src/baseloop.h | 2 ++ 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/baseloop.cpp b/src/baseloop.cpp index 27d184de..053c4e3f 100644 --- a/src/baseloop.cpp +++ b/src/baseloop.cpp @@ -77,7 +77,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case get: - if (cmd.size() < 3) { + if (cmd.size() < 3 || cmd.size() > 4) { result << "format: [get class cmd (sub)]"; break; } @@ -172,7 +172,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case cyc: - if (cmd.size() < 3) { + if (cmd.size() < 3 || cmd.size() > 4) { result << "format: [cyc class cmd (sub)]"; break; } @@ -199,8 +199,41 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; + case hex: + if (cmd.size() != 3) { + result << "format: [hex type value] (ZZ PB SB NN Dx)"; + break; + } + + if ((strcasecmp(cmd[1].c_str(), "MS") == 0) + || (strcasecmp(cmd[1].c_str(), "MM") == 0) + || (strcasecmp(cmd[1].c_str(), "BC") == 0)) { + + std::string type = cmd[1]; + std::string ebusCommand(A.getParam("p_address")); + cmd[2].erase(std::remove_if(cmd[2].begin(), cmd[2].end(), isspace), cmd[2].end()); + ebusCommand += cmd[2]; + std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower); + + L.log(bas, trace, " type: %s msg: %s", type.c_str(), ebusCommand.c_str()); + // send busCommand + m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand)); + BusCommand* busCommand = m_ebusloop->getBusCommand(); + + if (busCommand->getResult().c_str()[0] == '-') + L.log(bas, error, " %s", busCommand->getResult().c_str()); + + result << busCommand->getResult(); + + delete busCommand; + } else { + result << "specified message type is incorrect"; + } + + break; + case dump: - if (cmd.size() < 2) { + if (cmd.size() != 2) { result << "format: [dump state] (on|off)"; break; } @@ -211,7 +244,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case logarea: - if (cmd.size() < 2) { + if (cmd.size() != 2) { result << "format: [logarea area,area,..] (bas|net|bus|cyc|all)"; break; } @@ -221,7 +254,7 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case loglevel: - if (cmd.size() < 2) { + if (cmd.size() != 2) { result << "format: [loglevel level] (error|event|trace|debug)"; break; } @@ -231,12 +264,14 @@ std::string BaseLoop::decodeMessage(const std::string& data) break; case help: - result << " get - fetch ebus data [get class cmd (sub)]" << std::endl - << " set - set ebus values [set class cmd value]" << std::endl - << " cyc - fetch cycle data [cyc class cmd (sub)]" << std::endl - << " dump - change dump state [dump state] (on|off)" << std::endl - << " logarea - change log area [logarea area,area,..] (bas|net|bus|cyc|all)" << std::endl - << " loglevel - change log level [loglevel level] (error|event|trace|debug)" << std::endl + result << std::endl + << " get - fetch ebus data [get class cmd (sub)]" << std::endl + << " set - set ebus values [set class cmd value]" << std::endl + << " cyc - fetch cycle data [cyc class cmd (sub)]" << std::endl + << " hex - send given hex value [hex type value] (ZZ PB SB NN Dx)" << std::endl + << " dump - change dump state [dump state] (on|off)" << std::endl + << " logarea - change log area [logarea area,area,..] (bas|net|bus|cyc|all)" << std::endl + << " loglevel - change log level [loglevel level] (error|event|trace|debug)" << std::endl << " quit - close connection" << std::endl << " help - print this page"; break; diff --git a/src/baseloop.h b/src/baseloop.h index fdbaa914..6decc652 100644 --- a/src/baseloop.h +++ b/src/baseloop.h @@ -68,6 +68,7 @@ private: get, // get ebus data set, // set ebus value cyc, // fetch cycle data + hex, // send hex value dump, // change dump state logarea, // change log area loglevel, // change log level @@ -81,6 +82,7 @@ private: if (strcasecmp(item.c_str(), "get") == 0) return get; if (strcasecmp(item.c_str(), "set") == 0) return set; if (strcasecmp(item.c_str(), "cyc") == 0) return cyc; + if (strcasecmp(item.c_str(), "hex") == 0) return hex; if (strcasecmp(item.c_str(), "dump") == 0) return dump; if (strcasecmp(item.c_str(), "logarea") == 0) return logarea; if (strcasecmp(item.c_str(), "loglevel") == 0) return loglevel; From c2743ccfbb8ccf9851072a05dc297e939964ad2f Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Mon, 19 May 2014 20:26:42 +0200 Subject: [PATCH 29/30] config: vpm3035w - sensor names reduced. --- contrib/etc/ebus-daemon/vaillant/vpm3035w.csv | 6 +++--- contrib/etc/ebus-daemon/vaillant/vpm3035w.ods | Bin 18178 -> 18012 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/etc/ebus-daemon/vaillant/vpm3035w.csv b/contrib/etc/ebus-daemon/vaillant/vpm3035w.csv index c0d246c9..7f48036c 100644 --- a/contrib/etc/ebus-daemon/vaillant/vpm3035w.csv +++ b/contrib/etc/ebus-daemon/vaillant/vpm3035w.csv @@ -1,7 +1,7 @@ # type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment -get;vpm3035w;Ntc1Sensor;Ntc1Sensor;MS;0A;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vpm3035w;Ntc2Sensor;Ntc2Sensor;MS;0A;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; -get;vpm3035w;Ntc3Sensor;Ntc3Sensor;MS;0A;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Ntc1;Ntc1 Sensor;MS;0A;B509;3;0D0000;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Ntc2;Ntc2 Sensor;MS;0A;B509;3;0D0100;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; +get;vpm3035w;Ntc3;Ntc3 Sensor;MS;0A;B509;3;0D0200;2;temp;sd;1,2;d2c;1.0;°C;-;Temperatur;sensor;sd;3;uch;-;-;-;Fühler;;;;;;;;;;;;;;;; get;vpm3035w;Vortex;Wirbel, Bypass?;MS;0A;B509;3;0D0300;1;-;sd;2,1;uin;-;hz;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;CircoPumpPower;Zirkulationspumpe Leistung;MS;0A;B509;3;0D0400;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; get;vpm3035w;PumpDutyCycle;Pumpe Einschaltdauer;MS;0A;B509;3;0D0500;1;-;sd;1;uch;-;%;-;-;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/etc/ebus-daemon/vaillant/vpm3035w.ods b/contrib/etc/ebus-daemon/vaillant/vpm3035w.ods index 7f09b4196fe00fa69521cb193b4678e55acb5720..c0d85950bc4385a3bcd09d6c1a914516b9e55cda 100644 GIT binary patch delta 16160 zcma*O1yCKqwl<2p1_&M;g1fsza0~A4t^qa{BshfN7A&~CyL)hVclS3OyZ8L{zgKTp zP4&#~UaPym?xj5w5Cy&*0gkLF0||u*1_lQP_Qj(r7Fh`yD8!Q1E?T7V!N8SD3>|7) zSx6B|NvQ+p14R(+7g7VbfGiRTl25V2kdOgsLnKgboZ9o(wLQ8%?~n3*3=9kztmg8m z9JYAuRxVegocMY1Vt(r;$Au~dQMjyTeG$0$95yk1b)V8Ae4g(w;;9riuSSwtePi1! zCVvM71u5l7^!D^zA58Z%vQW5m56+8*pb!fBg1qy-B*35$>|-A+EG(d-qfbswuK7Nd z>O+0GhoCY(TWP-Q3BzEzZS#40CT(@v84AZ{{KRb3vp<>hLaNw>&4tU$&hEN9lFY>M z>0&IM_lbdDK;U&CmJH3~q;~F+L9R;@Xu`tcbTnJ4R;22G_I->0+pSIU*HZ7;jI=aa z5bUcL<9-J~@F0jDC7Z<5`Pnq$dwiw!Oi``ZjTOP)KT2C$(Sm*c(S01EezQ4}sNQ3l zf`ZJ<7r<0x5*gUVkXbth=Y5GT&EO_1S^$7b#lt_It2ytEFn_`5-Y_{X({1LkoPx4H zaywa6EB-p_ey|HaaV{b)E#28EiVEU4DWQbv8l0#7S~6c_IlVm?|8#q@lr0*v+WKwH zZOOJxic`VQtpKv`(10r~BJz$_uS_%;DJ(oZ@H>F{R!(IqyLBDF`a2?anO5yk2M)4E zoA*OsB>wQwkOQCP6geb2GumEcdSW6h(Q2LyHo;c11RjUmu?A6I`~7A(C|cmrLQ6}l zKZ?)?bBAnqEIqt3eC|i36;Ak7pMb-92Y@Le0)oSGwYfsOl%&U6sdhcP^{h~pKGdOv zjm>c|GJaQAm&04eTDzc7+zmJiA17yGl#j^|5$wGPegH+FgWLVd zt@X~pNPN!Mm%BBepWzKinbl^azlps81OyPS(H-b1Cwqj_Sa1EnA<;zB`8+QJQ3d8( zzuf_V0`$AhE)r?B3st@Dma`N8Xm`9&eX!nz$k?+7!cgGbz&_}YCRziw*uiwc+v}5k zJ6w$)CCp}8W!RTAHp{6M_cdf0a}$&MowtwUd{;lApoH$Q_dT59_LptRL)b^^W2FB z3BDTash4WqESP7K_;{Un!Y8O5d3o^!sgOWMSDTNc5c06` z@jdS(>fgE#%fh<%>9u%V88^k~f+F z+<)d~PXDa*yv}y1?RL?6T;PfBr4VGNWM_9uU%#xZp|M}Sn}oa5_xk#D)*pd8{YNS1 zT@ocC@g$=^mFl%VPAdq$0CoDFI|)1yKK+F5Sr}(6S7TpGwK{#j-5z`1Z-g|v9I#mZ z{mfS=<;m-I917c{-|nm1?AF^`af&MV>~J%q-i^~h_WJy=ml=y!aV7W)y59n{#NEkK z2-Qt~s$J9F>NjQxJPw=tVa9g8^A1Q=;k+z1_-V2go0ivGsaNlE??jm^Mn8-NO=z3nw+Pd+hFT1`+h@*Dun*fJ(-; z`%Sr24#OVrmzz0kU6I<{F( z=RbS$fzCGy6f*OTsBwFw?_woCb&5u7 zi^8_(GqZr!)qNiisN6nftOH9cnI`@dZnerm1Sbm6m)~9=_GtgYc0->+_1R73!fUa4 z-#gUQ1M4l-wlP&*RpoX(?~nhWS7PY&6TjK>YWHeyyq`5hU28Oj{jB*+;Pyt>eI-xS zBAv(8;1f^ZQVLd9rz`EUVEP}veK**7`;Dc8baNIZ|g z3GmHkK+{~(4-E_$ByNgp-r8{v;?C? zP^pmzz-&d@(gl81RP>wJ_*yQPs{m-ksi~>!TDBSkcNpZpzEsnREMbpkZQn4W z!K?+iIN@q^@<1~(9EBn&DC9o;B@LL!cHS;d5a*aq1#e*ATKc9Wq9}`nLPhibNq3CD z$;8;2xTK8e`#|oSbMx~Lt?mDGoPvHhA1zc< zm4#H2d^Co07yAHLKUr_T78e)y{QNx3&|K2cfa8vYikiveN>l5#SYtT=!jH`+Nw}+Y z9)+Q0wLr#WA|f*XE0fAaQu6S zP9`Cw)&NC_%*jnRmL&{P5~|<^vl{R-EF!{$$}zYWFACW{vO5Iz$htY%&=H27ni?Jw zPF~y5=1X7*e%~i11F&>(P^e0GLo&Pd$6CB`udiQc5gA(yTBj(0vHUP5XO?>%2j_{3 zjLZvcCg|vld{v0g3)_`b1RJ4+jtWKg1j0xsE9FJYJ%r`)hie-|JnDkmOGc!l% z=VY#*ii?W_7L6;oU0PmV;&;1I?+;eS*oR`}be>1(ci;C30eX{PhnaqCRJ0n)TP7Rl%{c;w61VRw z?f8{DnoQHd{w;zbKrgV>dbiqr1lA9T>y{);&Ug^?Bu=}8Z&G>)eKyvlTuSNZvoB?N zUE`jERy&@rC{rF*l--2*d{?9D=g**gLCXAv#_`KP4t4lMob`N z=ka;$%Bwu!6J~88gq!*RyZ#yGs$P}F;#F9x=C6mcIH?8G>b$@4gtti*ngfY^59r$q z;L3#-eF8mSAb?2G+{)Ynb6qkMYGILq^})Y4WtOK>bG|_IWJe*5==6W8p|N1N3ipI6CW@zVjnu@?|aHaM**LbJGG!t^G)3P zx8=v!gkQgYTMi_lhr|n+1P8*RuGZP&!+bR{A#eUrwhyS?38Fg@^?lCRH(;yKlafNT zZJcj(H;_3aJ@d(pJ~Fz57L!&rG;o;|+<}&zQI`~<$lyU;^IRGH-#D5-jGp~1#AxeU z>JjU!V*hJ2-AdrD2ig+Uh5iJda zyJg(d0mJh5nofHiEK}8|(-~Z}=6cueQZSy*aMEoPmXHK-mBSdPmv7H&Lr)qjL3n}!rwOj;6?}A8}s@wdrFTV_N@txKOM$WJ4Qsy(VN?M|n3J6q8jc`WDH6Zx*jA5*F z72qd7evJmKeiDBFJ+WYfLXhte=zXv_j)opW3*!&=8&^;p_aA2|lxh$d=#bTeB=uWc zw1f)Gz2M$Ay_bw`0_D%(ixV~dk&p`!TNY=g?QLE9ax=RBhBLR)7HTV!Z~_z{YQG>y zIPJ2M^XCr`DT-5irfa4#+@N{OtSC$)TWX{+>@3LDgfcR2!^@BU64~464k6PuTQ16f zJ?D{?H#4K8WeEa(QBWw?uD8?BNUA5qA^s!vnwm@m_29#iX9rUVy3GIf4VkK_5u zuI4o))szI>nvoINh)+EkT*1r}1STDN(gysBB+-;3$hU_K!ht}2OABAFtxH5^7B>?| zdx>tV*UevO|BH(YD>LLU+&F$V|9R%+lpCDOj)4IwLpvs|kpA@DQzJH38v1+0l?y=6 z^p%4|LL5b{4KHZ2r`Zu9*pt~a2)nJn-{6E{?ZV`^F4fuQG&Y->nnrv6%}h-J=Qqvz3PfZ15vs{>7KfMe8b_F)Gih|iR8{L7yJ_p)Je^|Nv2t_cLNG_n ze=w8H<8eLwg9za%5n(>-an9c-fiK7jO3G|*2EF-8%O^9=> zmL9Yh+GPlF5ATdzh=cwdE$Y+`AR22Y2yc;`8wGqlEG10sk)|YDrF#eo4}_Y59SHle#;Ml4Xo4GV6bAK^_rp#i z5RU7&n$x&qFAKy6vp)YShPa=(#59LMSu|QM{s)8mj~7@AT{Otj=8U<=euXLN4&U`auMUkTzk#r}pIgC|`CDy{(&k%dnUVt2*X}5!l;5DK zp~yHMp8hnsuQmf&)HJ2bv-&|@-t2WI6QBswiK*#nW;kVK<#Tw(@3IQ>OKK`nC_q3!(8pqNJ|7BWHBgpk8}c0?4}_4C%S9xNc2d_nrR2>a6o z3gvpO9QLabX=s)OyX>b=@ohI^xGUcX=f4Z9q%AOTq0Vl{#eLXTij9qpI0?WuM8X@h zF4O5#adLrK{D_4`;;u}<3%$FycedP!QEvc3O7Y_SszYt_)MUHFvHiR3r*PsWy-4}* zlLp3Vs7e!gc@!_KgS5KJla4Ivu_d^5pUxE7c)NQZMvE~Ih88(Cbq0(iI+wf0o1=|E z%hIEv1loGrrCT7U-~r1FBiD*=t*Mz@aZ>!v6v}w|hjt4k;IQu}@9$fTeyTtOoC{F7 zaBzW6YfN%irEbKYQ>{~She<5{9;3lh2?7!xqr+BTq#cKw8ZDU)ll>~63rjhC#^(lv zMORhia8`>3_GkJ}4S+?uvcb->!mpW(l$d3y4;=22J`|WQ9b>PR}h{T~IfK%1zw_aZpB_XSXtu*ySeBf6nx?J(Sv-raTz7ljTD>Shh#I9^#FZ}*d_~?%3|T`{}jN8 z@gGZ+Z#01>PdcB^$tL2njLr@H^wAMl`AdV{BNelgBY6nPb}Kn3&jdRqE;> z@Aa%@AqH5{(*yY?s-8>1Ju1t~C)e3xbp;lSJ;M($rNV(Qu&AH-+>UVsj^@hCxe!nu zW`_JiL*clhfkcZaMW^#Qw5hkKf!SbII$$E$r2Gsu%1ZP~WgWL?yMvLtWwbQnWIum4 zMvg^F!5Hbzq5x4)7=k7I{Mpb5vkJ}G+kkGB6eOKeLgIS(Hx_BpGbu<|g@7!~vI~a| zrY~`lH10UNK&=mG;VnuYm>)S|IuR65HDL<}Xc3(N#?Occ!A$>5i2Z+`C;d;Y#s81f zr~hgF|I)bY4YDV8YqP48mKhBANsG&im5CSx{PXY)4i4`9@GU-qfC#kYw8@3$vsNzk z;2PeU1kbDJPwk8hkH)kPW?xlm0IlgH%@XYWGNh9a7f1zlTv%8-DjHfkdl27NsJ-l? z?|E+qk1P4}XTmbJTBCnYJ__ko70V}f*0rB!3GJu*!-!RegV}ED!lWz&2qfb7k<0QP zmd!d}Atb(FI`qgudBlJcgLHojkU!bxi5^TzEZmMFkX3!AEkpCAPDSoMmq~gPS>Q{h z{TRM5dZ_m|e;ayqT&*@iKvkUjCHwPY1x2+|e&ONV@vUa#LM$IsWWMUH+x**8LUVe+ zi6jjCzIa{ZLTl8Y1gyfU8ZoA4L-w7&ZFk>fdt$$5j}hZ2=`S#Xe$+BzqoaQjZykO` zx};u5@kT!&79^8wD9A$mZogPxym3a7(o9vj=hWD>aF2_6k1Iyd5HMEBfRk}MWfmR5 zSSJv|jI=a{F2|6B1fKT+TI^IsmTZD7gN&H|5`FSc`&V0{`c?e~F0%$APCP`h5Rw*szLju;r{}j8T zfM5qliBhT;n~|{v+hr;$YZqhGffI1CoHyEUaM1o~1Q)7|4x;lbh*fCe<73?X#rgeZ z`S0S-=LS|&^`&wK0gfCTZNJ`(twllgp6)l{I^-%TVYNEeaDhN2UNme6MzE`-P+rMV zB$lR)aY3TVz4g04QizXLY|n7qBBe^Q3+Qb5N*{J=MD(WZ5aI9Hp^KLx846)PFlyEQeMPb6eKl782aM&V#-I0bQvxlaOm(cC7k#6p)dRg}n3Hn>;phYv`X1I%IW zmOcx)5}JtO4t%JZe%)PjG^Bo|2?+3KZ(~KRc{4O+yjuy@*1KN&$yVlnXPa&+UkhH4 zoOTVKcjrL#wzV}%WxVOv6|Lu$Dk^iW>iq7+k0nRCKJ51w%M-5dI6gd=a}%_rIWwvS zqCRS5GwdF1YUc57j#*fZ3HISi#Sa{*e0*b+kdr>?!L9!7HT(;IFuGl}JSiwXd`yZ>w?nkT=?kB;)@Ut zgu|p%$=z3Eb5W$XIa?Km%Cq-wuF3l6>1$Ti=P4=yJI*)xtb#ndK|194#(J> zp(q7>wb)c!4Y!YH5xSe+$agAMJN$j@i;OKf3r^M3!zv?2vN*k7Vl_)sMvc1JigmkP z^d&%BM%_4yD;6n%O5JJle~pHd5{K2l8z~6%L@1}eGEK)i4t~lSuz{3WwKAuU|`ThU||2HN5$SX?7x4Az>TrJor|fR3xkKP z%}M%-(^3Og|Jf5J-bsymw)kOpVd*D~qNt9C;nxr#l!B**^SI_(6tXqTJWTcpT@L`2qiLcx; zmMqq;dY}>?0d93Y(rq8rriWao%GzA_DjQ>6_d@zcdeE-)j?s}{yyHS&QyJc0qbqRQ zrF(g?F~35kXcf|KEG&1WB=1&>s9f1`?a~VmZ%WMdo2wRh#N<{k7n{ z)}tkdZl)))E}5r=+{>zBmw?N%Dfl0@#-x(?$KPg~lwqj^%T^hmfApJ<=N&O1CyaO3 zT$}FJhM(XXI~O(y3oKAMEtM_V?vx|e_G=eMdw!;7RK2VJdMCX-E}7PQ1S27%)bfXpIE2j&H)P1`;e2EnN&8(@4LR5Yn6c$6S8G$q>G4GMr`mum| z%SnJK@Ul}~vzUL5BhImg+hsqex=8dBlyxx;cls{`GOG`~Ya%?ameh52cOkyk%7r)z z^&IERzsguMQ*T+MyZY(>h$OpQG1aLst40(KiL!{U&-P-<&P6m?Q1~C*^Yh{Pz z2@y?Ma6IiL*3{wmrD=RNSCk*0x)M3saSiNu-)WkT8Vl&Oil&WU#r{n;w{W|4M(;B+ zIh?PBlW$J5F4Fwq)d%BAhgRy@Da0JWN-W?CaVWWYQ_R;l9*+NDUHbG}+C%DRdEq&T zw-_yC^5u8Syeg4nFq;x~QI|hXhzOhZQZtCC=*GgRwGUakCk5jrGFSH5Cr?jLWAnNf z&+@YmR(ZSS!D1s(tefjX8Dlx{FOzD{df8+m)u8^b8mI=4Q*InLT@RJ9AFk zf}02Jg1IHRrQyfE(zzu^hP0W2(xsKj{1-f9sWTgFTW^))9h(+X*#u0roe&q$Mrd$% z>|aP{uY5wQ=5<-ckUW+M>1|AHnT$zY7yHm*g^804m#3FS;C?}2+D9w%6#3%WvT2FY zdWwF~>n#JTPplHfU700!ETRC0JbZgd9E;)eS|7Yfti-l&k@;e(JZHDbeh-}@zxZ-& zJ!;-=Dt>$^`Cj%qYQ_;qA}vUcbJ#@^b;jb- zny@i_HA~rhCfT%5lp6b;&T?Y=Mno(I+;)rCZTVMv=2K>_yt@q3UimX{t);^Co@ zB*ifKf{UU(g!r|cSHrWGFz3Z?bnW7*t#Kv^N9Rpc@MrgQ-u*?W*YRAB=% z1g5!#zX)G(yuOpn;W%X;)a=N>$OV`;8W0$~+I!fY+G!$=YS;#X{VEz)p1FK2=v7Q7 z)eSu*9t=i_Bu;!le zoVFS`mH?93ids5|Or4(keQ;k2%tFPdR3)FtFtyb(NDS9?+vf{A2Y$8tS_yal z(+ri$=+sxk(`Crv_4~WBhogt)k=0?QSVD zkAU}|vdx;RA2MfEJ`06q+a*{`9WRX$d20AQd+UFtXol$nYc$sv5=w9K(Vk52M>{E zroUGaciMXrZouBq+63EiSngOxYzCv9I>a+0{4@;ZCm9_n~g@*0#Y0a%p6S?Dw}q zqWB`d*T7KpMmjSmTJQ9rmQx+!B_Xyl-zQY`&>wV z4GJRM>&WO^_4~2d-I)=*IrsKrj;RERQT?<&SZG^xbxA*Nm2gt>WTB5r)UJD7OR;tg zB3rBZyvEj1Yvw|{Ce~)D(sn=slwsZ&50sa3+o=PbC$d#B_M~get8fqbx)1r_Eu1-! z?{%q{qa6Qi5ernmlT441BLX#}Cy_DsT0iZ5jdWg21LFimePwd6BkS*|(KpTUKM z9jXR2b{9(!MIrZa2hr^&el$WiXhJuMp^rraZ*utkKX{+NOscDaavf_gxG}_hi6+l^ z?am<;ZNdMtg3*9sJ^krWS*Je7^k^Cn%d5PO>mz4I+n4(T-yUz$;UUEBhbd%*7;_7r z3pPbT+`H$n?#$(v*P(21phr0?NJ+$%^P^0|px3#;zK|xXzH5LJH{gqK9?YL>Gi_y6TgHsKi13Q+wm)+=_nr(kP90Zekn2UZdK4}>as5tthA zSnI2JlNb3^xLw@iOT#pSC;I{o0QAnlzYu_^2-F$hR?rAEBGUnPk_Kl&Umz8%NBm- ztzTxQqQ?2~*aJBHkC&)b{uXWuCaVSRYmDL=`DZM%Mhto`^6yEzjt>Hww z7joB(qpvKtDr57fr=zVIq;RLucOusT-x7GYEDyjf1xM2;${t+oQG8)w1>ImllFvck zI$PKE92gta)$Y8Obu!e;0}1N+nN}(j!S0GiTh|58iSALKVZ%o|aldKj5S7a}8d2Cu zq&N$ed3YRsTt4z!J_;ox{HS{rf!xLO(U|PC1M7sDV{@z$=gG65@IJ+KR?L9=qp{#w zM?l)EpU%a3UBtQ|$HO>!2us6nkZYeng<{=IYZEX4?5{)STY}@?@@nWjygs$8alG+V z>^IJ|Kfc#>VLu-+y&wYFeYZOv8*8sJ^@H@$eh$6!SG+)LRA7=2_+9NN)9oF>{ik{% zwsI9DEo+PG2pmD*{E;{GVGs2Ux{ck-yXz?D(N^tk9iZ_A81EM4K~{EmCDWcmtiChe z4mW}8>Y0`+Rb7nH2ZuMw*jj-xMuW#LO=}(5?$iY$L3HTObMT>$azR!yaU@tr;rQWt z3@Q3;Ez%lJMAfq1jkroQ?K*8Qm%ZuKzk*N;N0zwB;jVERQ>xFnc|5n$8DHD%##5oQ zrO2Glkh-Lb5Zgv`)m2#-Q{v2BzJ^@HP{v8Qf?LHKlBs>?xS=P@AI zYdW-hU@_@~pz~EB)1_{nZr;G(!@uRZ)5u0-FtF$E;Qt-|#ZNL4f~J`;zu!Io7#Nwo zAd^nju#_I=B{V8y>-Eq31f7 zR}_mcPZ=SkB!o}i?txHzP&eq{4xR)~Pl><^$E}6xgMymE6uM2SM zv`oW-&siD`{$)Rcq2{CmJvd{g5We$_R)2j`)qz;iK zesGHI1WU@bB9S1n!2u6`aG+%M=guTG8Oydmr(F4^JmR@DgQ+s4cfO&AobPK$Qn)jh z0}ciz5BYzD@bQJrM4%k5kFV_t=#!;N^);CF0I6zT&Eo1z8QTh;>)kO3n=6R015PTB zMexq^w(wSZmLpN9W8Du!s;PjTwX?r}?=pSM*k=9WVbqzboGF4}TTps2oklLpo^<%) zgzBLF43xMxb#z<_t zdZ!)sIJs?TVz;PV4`;%+J1R?z{!V2jx8{|Vu?ErXQj73jk?hjO4l{Xd8_`5%&3p)5 zDVT7~6L}RDkQQp6pSpmEHs;`(7bDX)2Xd%zZ?P~OnQXueMZ>nS>aj}KT=8gRnR=?B znKPt_U7FG+iz-q$5lyh#@sYnr_xYL5Lj?XoyTF@MhuZ!{l(>aVK8q;T`d8L$hFeLv zo!@aN(iJL>u4?HtgJ%#oWwGAaJj_Ul+h$~q@H(vZAg;^9h~NV@XqAEU1R;SOl&~q; zF;a#hKV?kZO}|EQWy@F^`>E>=*$d<9W3dh2n1iU z@x&!`K<3S7`dCwx@s?mzO+RG}Z>RIrIA%)GGj?Y?f~uh9IJNjGscG8zql5!m=hK_@vlUbZaMbewr}@ema8D*@IOuG3W% zTY&h9ig08feZlnv6EO%Oo*xhn4J3^q)Hx!TOTu#&_P60yLh@F=HJBffJu~F8XcaLzL2tRYm#G55fkV8{uh{^i?D3L}R z#B$YmUYhJEU*j01xhMDbEaIbT{5)f#$-0rXww?#^3vD4 z%(va&gv^7<7!@Uy+_*2A<@|m1Tj1&_Ae{)el12vhB?{|W(Hdk6ZiN||q+%Ofy+CQY zG?j@axH+G*S!=8}5@W2JxTBdC?kCFK3!#{h5PNQEk|%^^`sectD&E%zYS>S35S+Dj zIuK^fR@ucWUeD#06_!fn+-R!oMfeO1+ z#;_oRcp6ZJuG_#4GH}MB(R9VMxKg!5TFUOOn;gICaWbTR>_bM&p%UUk*a$a~dzQo$ z`s6#asEX$uhgMWJmUk*9;HruTyj%Foa|?@@BZ!E|dIA1?)I;IO80D)SFKuMBnhe|r zSWJ;~1NKjM2a8e=XnRyjF+Dtyf*^?A!(qaJ0+ithVO@M07;2N=9%AtyemJ?G_CEzy z$Er$inn9OL;fgv$99~Lf-TzdfX8k@|{b*BxlNlC%k(`B-dGq69wZ6Bf6f!8=*AZHn z;p-Z+cwo5yd1%t!_RyJ`HQBoQjYjpN2@opN&612uL$ro*0898IC$X z2$S-J`zyzO7i|%pFqn9x49$-4#%=9#IEf=ew_cZkrn8^mh`0|T%&B`cP3uH3FBLxz z7Bj|yog|y?%-$~{RI!sM(lUNz`cisMFC@UN*x#PHKz^z^qNQ|3(G#H_Y9@M9-J`+L z4mIilbA}}Nz_hIVn8Rh-m^cX%+0`|!@SH>AJi`mv)y?r)wLM>Pp~FWGs0h8`HeU}@ z`l`BaXxgu;ju>`Q$gFCkfNWSPr}UY)t}w8SVmXCI_z zu0?JYoWDXpB^hXy`ChV$#{Z`?FL_qDx~Kt(OBq8J zfnIxkHtD2M`5 z`=85b5Cv2#+~T<6O$4kO1vJazGSwZ6Z(z+-Si82{=DYq`i| z;?LjDai+T#D2fELf{KFfbL0lR{n_d_P{N8Vw%vq3ZA+>@$V~8CZ-qHc_%HrBjy#6Z z(J6#JgNVWz!#bvvyLtMC3EYMMfSSow5R2GoxvM^h~C$y$XW< z>Vs6<4>wBMa*LKJK7REPr|1=noJV-`kkWmX{uNcFXT7{pzUGhBHT6S;!|TlE z;a)11+g>@7)oE%S6fwEcM~p8VcHQ(2kI*}R)8&zL`bX}SHcRb0CtSUgCdCF^>0k!O zDmO>tq3W28K#IAX%LiH4Z+SYwgf7Q&&*ZJdbH6__%;$`9c~KqxM3!m)qCeEPo#q^< z{|fHEgZ3QmAiG+)TfNc~G|ybeD9Pm>JMLDVULWBJ2MKo>#yafQIA5Cy*-t6RsPF5JNy2ky6{GY~1QrZVqON4UY$MU! z)?&M*b{BKy70*5mNUk23qAfP`ez$gN^=6hW99Gv?jKHFltzzt@wFy&JVqi3l2*5)h z-u#S33C6eVAlj!QAeJtuv&PHN&)9*I;j@tRbX{hg3Sb?I-*(| zV!7v4p?KS#rB+-|o(;xIQ)MF*jFGS^cT=Su(MjO&ARf{b3sFOCmEvN@V(jJmBkdS= zUo6QIMi+S9J_*wmO{4(_+=P|PN#Sv=7L7ERS71~Xnb!}e;BE%dnLJ1iUQzp+n%A7G$ zB9|>ohwuO5b2z}DJ+SQMDgCkZ74_ZQN3TzmI|a_;(xd+mZ@+q+pAQ`J{S62mAr9Do zzYQ@iqzL=3&ywSlg&6;H?Uq z{~M?OjU2-NumSFFnc_!9aroa^)!bQ3K?A{5AP`Lb_dp5w0oI0gmS(2TE(}g4X8#`O zztNo#$A{1sh(8ghCja-?-#dZ$S5H*`D*ss|3B>zJF#l&Y2qo|#&IIClBuL5r#qPh3 zU-ABnmLgtHocbRN0+500#tVpH$1{qf{rew?c)|DraY~~1+5B(1|7J26KOsg<{Quns zTqs^p?DIePT8R+=Pa$HI|CyV}f=LuH0F*cs7#P<7?gz|SD1JtQ3T9UL{onrw^auySmq-zyo5ykrZVip)kO};K0B1J0 zVnDmJxQMEI*14XSF6O|iz6v`=gYs3TC~-so*P@h_*xGhQ(+o*zWvy^?vw-5SEBl|^Wp%qg^TypSx#TeWzL4j`*wrHRF2zL zy4yjv2k~Zlx#Ph&u0$_hS$-1)ntve2Pav2i+LlzxLa_MZYXUoTPrS|L1N_cDDwd}4Q9?#+E)K`yp$8&=5 zoen#_Pft%Xg`YtOH8u6CcuCMuE&D^QQQu%RzD5-un+2(e6y*p%d_V)VtD(-oIvVhH~&Ed2+%xW_DB%T+<4Z54B=SvhWyP=KC z^~FY;7qb8p)5UN+Ig0yv>F8`-b-fKT?Ij!gYE`xUkoDbwcrH=TVq@;c( zZ-A4@-A}1dawaw{CW=@{pV{m#IJ@q2v8v7WTw8a(TJLpEL1-X2b&#tUs!AbO@QL5; zVm&A*NTu`(qh6~jHfIzVzsYO+2)Es=-}XBuc*mT%>C>#qs~v=F5kD`&$mn8wF-9$ zkTg5JpG)L3>FDSj1RQ^f6M}|6jLy!?L?GTQ{EVzys6dV=D=T}e{1VCB`7}%p#G0C# zx|}Xf$SUa@Kb);tw&AGXsfih6aXQDeTO&nD3m*)W*HY9g6P zCI51F?0mJ|V?L4b_I#MDKRVEk2v|&JjZp2(l`1?c=cW36Weua^`}MsJ7MUoDcOE2r zf-gsf8*Oe1*?ixgu68zM5BpaZt8_Y2%|FV!^lO=Py*;d*{pv+v?%x^$h=FzL*|D)P z;O%}1^ibb!r-TGiEg}9PWT$id)gSJ*@eP}y!>|V;_xIMXbc-DSL`56$rpMXw{P39C z%)Gk%m#6F9&II2H&ZYMIMV-!s1Ei?J@R+#r{(lrIud9yRZavHa&cC}zI?;N*?0VgK zO081;d_lwD?G&i#dU^wii}(BUAzUtz`?mj=Y`zv6kC6n*Ldocthc)}Ji{I1J)8Tg* z;{AV(r?dBkAR!|NF{`9Xn(6!R=RfbS%yfh>?uXfKt*+;zm*kS&{lH1uG=5d>)|Xs)Mx`V80rSxU^o8tb*h1{h-LTXpSw8)cJuM&Eb)^@7@37WbIAIFz!`>B6$IFns)wP~r9tx694* z)kb<6nlv`E50yybG=JV6iSIn_fSJ!T!b-wWPL{ZeFlHW)8*V#sFo-yc%E}3;sjypy z-9V8#-s{`r*5@v(xsnNd`}XU-M1_K~M(YJnkcqKt*-tsG>Dq+M*U4HOo(9S+&4a$-uz6asuBjgD&4EKvP>g0`9|L z=U##=m;GiG*6jrMmag~pz+|$=^M0yQ>(i6FZUfpx7BBk5N0|y@$;i<1o7>x=X#CLJ z?uaMeN~GqXHT$l&i?++bBNSX*tJlLWHyq~U`n|Yeieg1e{!X*z@ zmz5d*`DhI6JWikRyByWJ0hjtyLA{7LS1iK46gae%E8U#|huu0P#DEqZ_zMjk>N})~ zg{mqBjO@DoOaXL9>^m%ROiq77v0?4wrWZ02+(yT!nG6eJkj$LTx~hxUl7=t9W+Ij`+OC9SJ(IF3d(caY6I)aeFDcpUCeJE1ej*VadV z*O+P{5g^^kefDt=c)e&tzGaXM?_TMJ?*YT-vT+BsRL;XrK!zF=k z(hAqPGi$^iH4V5cX=~%H+gn>(gY<25bd;o}y`8|$ZviH10@`@{>HYO`#zCtU^M&;w zndM=-CvazQqpI33e|EV_yD@{`jY)MVE@aT_vg7flhLy^Lz>fLrg4PAdiI4hzeu)jss)m zi*##YW~M~Sz3u?nw#_8|rqJ-G!C!Bvzn@1*+CUW#|Ca5JI?5=_)jP+EzG;l(BVF`F zNzZ%SWPk>IpfI2;L1s9;wfw?n8CJylO&CnTd>lva7e(OWN)6u8Sl+*UxK-Mbkv@!x zEDTW9&?XufDbnY2=Osxj4Kra2g&mlZogGcqmla_;{Ye;w)sp45-Q$*xjcxh!NZvPB z4a>h(T#_lIVj+3_RMgb6|LP=3ipx<$g3GZh%w~xd@Lm)l-VHK+_h!>aYpgzrh}sri z)_KfC#8UZ9-C$M1}2_3 zqIRWv)sxOuk?Hihqywwv9brVp zBDIrT4}(L>Z%wpanLd+)=AhK)}33p9{gr z*V$IR?WY=$`3;IAFB$mUV~TQ)pJn~|pu*J;F_FRf*RBS^qig@PIaUvE|K0M(&>V)5 znHhP<*WA3sIPm#5DsIrT;#!A!k0(^=1IJe> z8J8x~LdHKL%*POwrloN%E&q+gReMU8Xx8CxI_(X!o2trY*(su!r221ddpDVGH?3#c z>HUPd`vP)ptd*W;bwd@u!-bc5`H&KVUq4j|7_zVjmbg!tQc_U~-p{Kv3m5%xJqNUR z3@!70+eyzLAlcb15%tlG5TC-Dy4$XD$?Fa8A#>vs69cz?+HdKToc-F}UD0swY;I0# z_~u|3Ve2gMCCez{!j94l4AeEkHoAI997jN$fU%^YAOJT!a6!S%4KqpoT&6Mk|BN}s>UZD21TLUUlhwg5x{jW{o&2h^vCTzb~d(Y6zJZM zZp#`G0y-KXPc)Fj<6P=05DL;oe`b|+>fRvuhAZcku8__c*KXYy;pG{i2I^;wKe~lK zh_T|$l`Pt|ESb*x^m-se!tb8PLZwCIU5xM_O<3}oX7SnmQzK3iWC-uO5Xx)$b*b7+ z+V*#^#DZhriau~&f=ReW+v$}HhD2~@n1we`uv`PxivZ(rYYqJxC@7Kdu^A=M3` z++<#GaBvSdfuJ{z{a%cJ_215-!8|f#ktp#WskCI3h zp+G9(>}SfN5ZVWwqVlcnNfOgreuY(c>2__z%y z%#i}5!rCy8sME5TiqA?4v?<5__9-Z@(rJoWg2`E$7n+2jfU=})|l~9n5)Q(c!pcifJ$<# zj36>w{C~UhH%}X=Urvb1C;_;OAjBh}KKmS@d%wE<;|GV)88<|-ImqYG(<4;DIxFb* z;m~{}Gi;)`!YfPojJ^odcAw(cGmfZjXUEjbQ&W4a~ z#2%uE?q$~Yj3u03-B(u*Mz$<6p%;^j7X_Tobc|Q{8%iJ>RMva>6NGOA%eb^7)l3hio9tl5Sr1y4xgM0E%`3acb{4HpixcI+S4)R9 zoSaV{%1=K>Pn?`i#0}wiKyCqpL&c^i09uuPv>asM3N{fC5IpE`DaXjj$ef&=^8ua9 z&5pIkucgbxZ`~CL(1){39e2u}dlkZcGbfmEJeHB7<+rOhH#bi$n00k^F7dUMgIx51 zlBA{)@Y*x%Dwsp2xSkLM46WPEj=LZS1&f3yj?1d9=bj_mS0)~-i%Bu}cNkTYpt9Rl zg5+T&lgwn1LKJsa5&C;2)C^Mq*I7fa)kOq5^qY~*XxQ}$T9G4>d>n(N6g-b*o81QA zH+_78hk{W8KF;y+JS9baL?X@U(V6se(S1Yfl#GnkGNnRL_TWCf{Cn&6Lkq`x{^#ls zd2Rc&4^RX@B-%6%8)rNGo$mH_(>L?;b;GmGT}ZWBGA5c&<5gF`E=0fZ9r^YcN;rXuSGiz6$H zO*|boOHfP?N(ER#(bCdBAutC^De$bRsl>p>A!<|JnN4rkvErBMG%;BdW$XC-JdGn2 z%NlkhOb|g&R)v_%%O9!FjAKS&^S=E=H)J9OBfm=?Y&xwA1hXDfjO0nD5x?Mr?hsLm zn4wc@NCWBxnrG7%1ujP{?hg%L1gYp3d98sBRM{4HcPaF(0|k;B%HoPDoin3=pc&|-R~If zzyQaS);>5hjF81&)Lp=+HweVe*0OxqQFrG>e~@xu?<6)rBqS!j-k&y^jbZf%!SQqE zI_l@1>1ZTfKYfR+WU-78Sc5+70U~vkl>>O_K7Gn+(7Phb0s*0k>@gb3p$p-)f&#Ms zFA?WO-R#*0dpv5`8+cdxR_V#vXWJP~zp;F@#SgzXzWlvdQ z9AV^r@V-h&1UsBnI-5b6G!QnGQGueivUE`JJ%LyIA+TimQY1vbdUIHg)CT*oh2UJ5 zibZQYdJgu9wGtvw654L{$H+)ewY6Cg?7?_?piD_d-sc{*T9wZWAmzeP4M8B!2kZ> z?IkH0QX&WnK!}?Bfg&61{ef1u%gK_(tn-NQa3gFvwb6J-tf;9$&UA)5VpkDdj(e-` zeuX9mgtUc%r+x{6M{g`bw}7=~k_f_V^mqkSE4pWDp?%eG9xWi!7O$1uJwG+l^p8CR znZp#22#!wo^FfV-P3vxLYqD924CZ;nX%3O%{va`*)^xQpGRkjN=Zs|l$rcJIX3l7= z@Gu3%j{#{SyNXK{C94S{2!b#Zn3ffcpdKdEIGVIXuzeiI+dX z`DSkQg#K^ z-~>7I@-h$Rh!?v2ofC-vxA0li-nb}OX4Bpfhwuh4K+wODI?_O%5nuQS7k)nL!Vo^H z%9TAUvzQe8(!{%TlqNxs5sC-%NM1Iy#dH>=Qt>IguVkR<^cfDv50)V1qk4B7=IHQn ztvX}qjo#eiXCs)L^z`sNRtk!sdYegXrIU{!L&$0w`jJrdb=!`hCQw7een-fD^OH9a z`QXoW{z4|R0n++-5fw3K1mLHxdYrk#7kM^IS46z*7}^R7wvRN42?+tm_^V82D_P71 z^B}V}_x{09x(CCBoV@}$^}rjo_yS~5n2rAF*BR8q%lWUM4KR6)6%pGD$pd3Y8{qN} zy`p>EIBbhDx)VA2?!xHWljv4PkR4wv!#X>7nO);pC|?g_LT@$8}pe{jYQ1M;C6 z-CoZSBcS{rZ-R=x{`>usLElLdi3)RH(J5avGKfIf)6-K##NSxQW#nQSIw8YpSzjC! zz!I~YBhm{}56_RW9JhYi?E`^SKlOs+L0sAr+R&D3kbS`c*l1~`vqKIn^-8b*3LknB z1}F!fL(Yrir}!I`B~}VRwEdzPa%?wogaEn`#N)^ab8EeFoY>)sO)ywH!t1cP?TJ~M z2oxx50QbML21qKh*fR)|i}druHA#eoh#j#-&q0}yaXpsLw>GJ)f2Xev3c0U8MIqH$iXGKNyxExv zi;9X$O2R}%ccI7vU$CuaZ}~uJHyYd@w=8ghSg5Fupv*l8BktJm4n||@^pb8=A;KXb z1m5y^Ke4EyeS(z-XbPeI(gqk4*aon4kckBe0)Ny}rpGA`B9MX5 zAWo==tel)UBpofS;|*dvf_{W6`5p^=B!`E{$x;pTziwHwtc|u5#BNED#cYx(b@OG) z6&D@LYBm7m@9=xZ^5EgkdUQ}g!pI9HPlIq0;BW-|lR^4_-~0Oi-WmJ<)7tw7()}UB zU#n5M84L^z3rt$#i+HuDVZgt(3gO`3{%#c}ZsQXJI?k&+7`|Hu@zgeGYfmU1GdneU5i3q3?JLioWl4 zmW^UkaD78bPfnhxO>a@^)Oc?#W@a7^p$uL1hYcTgpb5(At=V(xmCf9#M|&y~2mjnI z?g#4uNH0^4lB_V&pHDGW1>5E@u#(-@|N77)vtol2V$k~=`(&!V#kej_FZQBjHK{#s zrM!Tv;ZZ_K27rsevKjs!Y*q2X+18>_{gdKRwU9PBo5&UDa%#h@Z844W(=W=bJl_q| z)`};SMS$uf)>etB^6DBCC(yz<5rh&OP1?uHu+&WTCR!_ zXp)CXopO!w{E4mzAj;!o!#WM>4fXXW3__`&3>mL@@4b@9NyQAkRkv0>2ECC5cwydv z^G|#HCxzTHP~DIr@kffVMB3fO@6h@mef-amXQt-Iz+bZi5~5~(-n)8*R(Q8|Pk#y{ zG)r=WrBhb^Cfo{QU;4NhCQFa~iz>6ntxSy$>K=__BT3nwMhT5m3(6XTfS|xGtm5zl zY}_zO9|+gyLHFLCt=%u|8@E-8ASICjB%Z)O#dz=SyoaE2w@;pxhAi?O4%yPJ?fE+1 z)cHizLH}Nk)_ryL7y5l^iccL0rD`U?e)-H&0sD*K0@{#h*ReD#T{O4)`F6_dj`m59 zZZ<%W8Bs_yM)50#${#SiIhrshZPFU6rC_MDi~#iuu+(|TSR9V_!0z}rX*y9DfGJ4y zAOmCi@>zw%Q~?&2eySi1d3&cMGb|1q+(rti8~PK63tD_5c<13-Cj}=w%--zgHD6-`>V$V$hDliC#a7D$3q`8 zVf~TGAc2G5`SSiI!*`2;oqaEh8E?iK8FQb9XB2x7T1MPY1U=d-!$UL~t+O2(4z;vtBB?04rjc0`@U(r8+9DKsK1Lec2GIHJXr5n+VEXq z@cU3v?ZT2>A0%3&G~9-y0WxQsiig?SI6qHcc1;;~jRXlb)D%jr4zWp>SUn2p@N+Y%d_F+ z3#T*OAfnI&e#It>lk3-TqilhZMjqwB&7+49^G0i~NTj*%u84C!xIjzR zBxg4DNJbNNCWE~QJrDFbnX1!1Ih~i{KVTA)^kqwj;drdDaLadQYmfpV`>@8)+Q=GA%lpi8strx)RNWbVyjo#a|%FE)% zKT{>`BKzF_aqW0ES`oQ7u>3N2u{p=`45eJO63HT7Dv|vcee+!F9N4F zKNB+%A_(nE4 z^qKhtS78ztHJ?X8N^YR#Zc0lg(W>&+`}}sMWsp)-P&_y@mhMnT){{AsYw;WQYQowt z3nI12rjI|LJ41$JKC>tsjjW#i5YZ+>Kim`@PVl|%QfpU+ zkl?NPh3Ao;2wNbvx{XCu5P7aQmA5+EehMd3dI4!L(T8H`E7w}|^{Fm!zB70tMkF)p zyzmyi;Dh$ufNF7FA)<1>9#XM0&3}H=AYBA2`rT@qb1>8*S)%smDWLDuehte(bvwE< zmz>Rlnm}njrGtjkym zsOp@tXLl43>b^Ayx!@N9GSBXLa#@9jc5xt~!rvv8sopzP?R7P`@1F6jXnZhhE`PY3uPaEk75yPIsGq2J`W7MOiIOm=U}gQC zeXc0WG@(41`Yu}u5MqCg_GQxbpIToTp{oBpr_ETTghhRCHRhe4Nat3h8=^YzdGHD@&C)#9tq3BT;?qb~pY#D@%U0z2b)l_2wyKV`IhaqM()6#`%xN z%2`*>Sw36)(khkgu53=7H7owA$t~^dN!L|<4Q{*a$rR@u;5(n~`9liVxjK#*pT(Nx z?x``eMIWV61x1auw-okA%VlCI0hUsW)qF05NvLm{bbV>!UpgE2a5p3$Gn(52FAk*J z)~e(lGtxRTFXm2MYQhiOjvw?jigXed-US$=!i@&4+ z=@_mDi;JoeVn$qr(z$G?GR-dx#K@#b*I(pqLPZ?C?KxaG22}4(95$|Q+M48&F817~ zgwVKV>l|srE*=n=3UUuU$Z3iqk2sxPbuPonTSsvf-3(F3nnhv!{eXsCzUA!7;|McE*J#+MWG;mnmjhmZFTm07xofAT zrNfMo!=wcXLbHNTHhJvTEi#`^q@E+YdyX(ib6KXKNvSYE*he&7Eplka=rBAt2iHJR-VZtYH< zoMN<$oLIR6H!f7VOFy&o)qH?;p-V8K6L>2x8QbEZV&39NnbJu|6CxAUB&GQHJ+8<2 zO^_VFsK3BII@9~jIxyn&k^9ni`ubSK1GBVPO}905)2y;Rp!bj1o2DDylpt*J;W#1sN5la_$~C=UWYNI@4tD1(>#sS4APVDf{?X2~hW z{KwJ7><(NEKkYB7R=Jryu6HhS81GaARD?G|`4d?{kJHk*~Xv{gn)unNkvT3gngGO#1p(� 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 Date: Tue, 20 May 2014 09:29:46 +0200 Subject: [PATCH 30/30] README: new 'hex' command added. --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 32ec24f5..763433b8 100644 --- a/README +++ b/README @@ -16,6 +16,7 @@ Features - get fetch data from ebus participant - set adjust data of ebus participant - cyc fetch data from collected cycle messages + - hex send given hex value to ebus (ZZ PB SB NN Dx) - dump toggle dump on/off - log change loglevel - quit close connection