From e8689dcc806d5271f6baf06ec5122f35af5f3528 Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Sun, 18 Oct 2020 15:37:14 -0400 Subject: [PATCH 001/115] fix simpletest --- examples/bme680_simpletest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index 31ed526..c7df92e 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -16,7 +16,7 @@ temperature_offset = -5 while True: - print("\nTemperature: %0.1f C" % bme680.temperature + temperature_offset) + print("\nTemperature: %0.1f C" % (bme680.temperature + temperature_offset)) print("Gas: %d ohm" % bme680.gas) print("Humidity: %0.1f %%" % bme680.humidity) print("Pressure: %0.3f hPa" % bme680.pressure) From baa7e06afd9d125ec143abfe0fd07e44476b2eff Mon Sep 17 00:00:00 2001 From: anecdata <16617689+anecdata@users.noreply.github.com> Date: Tue, 24 Nov 2020 20:53:58 -0600 Subject: [PATCH 002/115] Add relative_humidity property --- adafruit_bme680.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 4971e21..fe3a975 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -260,6 +260,11 @@ def pressure(self): calc_pres += (var1 + var2 + var3 + (self._pressure_calibration[6] * 128)) / 16 return calc_pres / 100 + @property + def relative_humidity(self): + """The relative humidity in RH %""" + return self.humidity + @property def humidity(self): """The relative humidity in RH %""" From 8b7f032e8325542b54801e6b8bc11c5db5da22c5 Mon Sep 17 00:00:00 2001 From: anecdata <16617689+anecdata@users.noreply.github.com> Date: Tue, 24 Nov 2020 21:17:44 -0600 Subject: [PATCH 003/115] update simpletest and readme --- README.rst | 2 +- examples/bme680_simpletest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index c4c1f6c..1c65e4c 100644 --- a/README.rst +++ b/README.rst @@ -71,7 +71,7 @@ Usage Example while True: print("\nTemperature: %0.1f C" % bme680.temperature) print("Gas: %d ohm" % bme680.gas) - print("Humidity: %0.1f %%" % bme680.humidity) + print("Humidity: %0.1f %%" % bme680.relative_humidity) print("Pressure: %0.3f hPa" % bme680.pressure) print("Altitude = %0.2f meters" % bme680.altitude) diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index c7df92e..a72fc2a 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -18,7 +18,7 @@ while True: print("\nTemperature: %0.1f C" % (bme680.temperature + temperature_offset)) print("Gas: %d ohm" % bme680.gas) - print("Humidity: %0.1f %%" % bme680.humidity) + print("Humidity: %0.1f %%" % bme680.relative_humidity) print("Pressure: %0.3f hPa" % bme680.pressure) print("Altitude = %0.2f meters" % bme680.altitude) From 0fc4f484b05d611ae8ba382df5540fe4a18ee83b Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 11 Jan 2021 16:06:47 -0500 Subject: [PATCH 004/115] Added pre-commit-config file Signed-off-by: dherrada --- .pre-commit-config.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..aab5f1c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò +# +# SPDX-License-Identifier: Unlicense + +repos: +- repo: https://github.com/python/black + rev: stable + hooks: + - id: black +- repo: https://github.com/fsfe/reuse-tool + rev: latest + hooks: + - id: reuse +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace From 9bfc0f812922139ea70a900e77c645c6d16f55ba Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 4 Feb 2021 14:58:04 -0500 Subject: [PATCH 005/115] Ran pre-commit, added licenses --- .github/workflows/build.yml | 28 ++- .github/workflows/release.yml | 4 + .gitignore | 4 + .pylintrc | 4 + .readthedocs.yml | 4 + CODE_OF_CONDUCT.md | 14 +- LICENSES/CC-BY-4.0.txt | 324 +++++++++++++++++++++++++++++++ LICENSES/MIT.txt | 19 ++ LICENSES/Unlicense.txt | 20 ++ README.rst.license | 3 + adafruit_bme680.py | 54 ++---- docs/_static/favicon.ico.license | 3 + docs/api.rst.license | 3 + docs/conf.py | 4 + docs/examples.rst.license | 3 + docs/index.rst.license | 3 + examples/bme680_simpletest.py | 3 + requirements.txt | 4 + setup.py | 4 + 19 files changed, 461 insertions(+), 44 deletions(-) create mode 100644 LICENSES/CC-BY-4.0.txt create mode 100644 LICENSES/MIT.txt create mode 100644 LICENSES/Unlicense.txt create mode 100644 README.rst.license create mode 100644 docs/_static/favicon.ico.license create mode 100644 docs/api.rst.license create mode 100644 docs/examples.rst.license create mode 100644 docs/index.rst.license diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c742da4..59baa53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + name: Build CI on: [pull_request, push] @@ -38,20 +42,36 @@ jobs: # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | source actions-ci/install.sh - - name: Pip install pylint, black, & Sphinx + - name: Pip install pylint, Sphinx, pre-commit run: | - pip install pylint black==19.10b0 Sphinx sphinx-rtd-theme + pip install --force-reinstall pylint Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags - - name: Check formatting + - name: Pre-commit hooks run: | - black --check --target-version=py35 . + pre-commit run --all-files - name: PyLint run: | pylint $( find . -path './adafruit*.py' ) ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace $( find . -path "./examples/*.py" )) - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . + - name: Archive bundles + uses: actions/upload-artifact@v2 + with: + name: bundles + path: ${{ github.workspace }}/bundles/ - name: Build docs working-directory: docs run: sphinx-build -E -W -b html . _build/html + - name: Check For setup.py + id: need-pypi + run: | + echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) + - name: Build Python package + if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + run: | + pip install --upgrade setuptools wheel twine readme_renderer testresources + python setup.py sdist + python setup.py bdist_wheel --universal + twine check dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 18efb9c..6d0015a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + name: Release Actions on: diff --git a/.gitignore b/.gitignore index 92d3065..9101cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + __pycache__ _build *.pyc diff --git a/.pylintrc b/.pylintrc index d8f0ee8..5c31f66 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + [MASTER] # A comma-separated list of package or module names from where C extensions may diff --git a/.readthedocs.yml b/.readthedocs.yml index f4243ad..ffa84c4 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + python: version: 3 requirements_file: requirements.txt diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 134d510..8a55c07 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,9 @@ + + # Adafruit Community Code of Conduct ## Our Pledge @@ -43,7 +49,7 @@ Examples of unacceptable behavior by participants include: The goal of the standards and moderation guidelines outlined here is to build and maintain a respectful community. We ask that you don’t just aim to be -"technically unimpeachable", but rather try to be your best self. +"technically unimpeachable", but rather try to be your best self. We value many things beyond technical expertise, including collaboration and supporting others within our community. Providing a positive experience for @@ -74,9 +80,9 @@ You may report in the following ways: In any situation, you may send an email to . On the Adafruit Discord, you may send an open message from any channel -to all Community Moderators by tagging @community moderators. You may -also send an open message from any channel, or a direct message to -@kattni#1507, @tannewt#4653, @Dan Halbert#1614, @cater#2442, +to all Community Moderators by tagging @community moderators. You may +also send an open message from any channel, or a direct message to +@kattni#1507, @tannewt#4653, @Dan Halbert#1614, @cater#2442, @sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175. Email and direct message reports will be kept confidential. diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt new file mode 100644 index 0000000..3f92dfc --- /dev/null +++ b/LICENSES/CC-BY-4.0.txt @@ -0,0 +1,324 @@ +Creative Commons Attribution 4.0 International Creative Commons Corporation +("Creative Commons") is not a law firm and does not provide legal services +or legal advice. Distribution of Creative Commons public licenses does not +create a lawyer-client or other relationship. Creative Commons makes its licenses +and related information available on an "as-is" basis. Creative Commons gives +no warranties regarding its licenses, any material licensed under their terms +and conditions, or any related information. Creative Commons disclaims all +liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions +that creators and other rights holders may use to share original works of +authorship and other material subject to copyright and certain other rights +specified in the public license below. The following considerations are for +informational purposes only, are not exhaustive, and do not form part of our +licenses. + +Considerations for licensors: Our public licenses are intended for use by +those authorized to give the public permission to use material in ways otherwise +restricted by copyright and certain other rights. Our licenses are irrevocable. +Licensors should read and understand the terms and conditions of the license +they choose before applying it. Licensors should also secure all rights necessary +before applying our licenses so that the public can reuse the material as +expected. Licensors should clearly mark any material not subject to the license. +This includes other CC-licensed material, or material used under an exception +or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors + +Considerations for the public: By using one of our public licenses, a licensor +grants the public permission to use the licensed material under specified +terms and conditions. If the licensor's permission is not necessary for any +reason–for example, because of any applicable exception or limitation to copyright–then +that use is not regulated by the license. Our licenses grant only permissions +under copyright and certain other rights that a licensor has authority to +grant. Use of the licensed material may still be restricted for other reasons, +including because others have copyright or other rights in the material. A +licensor may make special requests, such as asking that all changes be marked +or described. Although not required by our licenses, you are encouraged to +respect those requests where reasonable. More considerations for the public +: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution +4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to +be bound by the terms and conditions of this Creative Commons Attribution +4.0 International Public License ("Public License"). To the extent this Public +License may be interpreted as a contract, You are granted the Licensed Rights +in consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the Licensor +receives from making the Licensed Material available under these terms and +conditions. + +Section 1 – Definitions. + +a. Adapted Material means material subject to Copyright and Similar Rights +that is derived from or based upon the Licensed Material and in which the +Licensed Material is translated, altered, arranged, transformed, or otherwise +modified in a manner requiring permission under the Copyright and Similar +Rights held by the Licensor. For purposes of this Public License, where the +Licensed Material is a musical work, performance, or sound recording, Adapted +Material is always produced where the Licensed Material is synched in timed +relation with a moving image. + +b. Adapter's License means the license You apply to Your Copyright and Similar +Rights in Your contributions to Adapted Material in accordance with the terms +and conditions of this Public License. + +c. Copyright and Similar Rights means copyright and/or similar rights closely +related to copyright including, without limitation, performance, broadcast, +sound recording, and Sui Generis Database Rights, without regard to how the +rights are labeled or categorized. For purposes of this Public License, the +rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + +d. Effective Technological Measures means those measures that, in the absence +of proper authority, may not be circumvented under laws fulfilling obligations +under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, +and/or similar international agreements. + +e. Exceptions and Limitations means fair use, fair dealing, and/or any other +exception or limitation to Copyright and Similar Rights that applies to Your +use of the Licensed Material. + +f. Licensed Material means the artistic or literary work, database, or other +material to which the Licensor applied this Public License. + +g. Licensed Rights means the rights granted to You subject to the terms and +conditions of this Public License, which are limited to all Copyright and +Similar Rights that apply to Your use of the Licensed Material and that the +Licensor has authority to license. + +h. Licensor means the individual(s) or entity(ies) granting rights under this +Public License. + +i. Share means to provide material to the public by any means or process that +requires permission under the Licensed Rights, such as reproduction, public +display, public performance, distribution, dissemination, communication, or +importation, and to make material available to the public including in ways +that members of the public may access the material from a place and at a time +individually chosen by them. + +j. Sui Generis Database Rights means rights other than copyright resulting +from Directive 96/9/EC of the European Parliament and of the Council of 11 +March 1996 on the legal protection of databases, as amended and/or succeeded, +as well as other essentially equivalent rights anywhere in the world. + +k. You means the individual or entity exercising the Licensed Rights under +this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + +1. Subject to the terms and conditions of this Public License, the Licensor +hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, +irrevocable license to exercise the Licensed Rights in the Licensed Material +to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + +2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions +and Limitations apply to Your use, this Public License does not apply, and +You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + +4. Media and formats; technical modifications allowed. The Licensor authorizes +You to exercise the Licensed Rights in all media and formats whether now known +or hereafter created, and to make technical modifications necessary to do +so. The Licensor waives and/or agrees not to assert any right or authority +to forbid You from making technical modifications necessary to exercise the +Licensed Rights, including technical modifications necessary to circumvent +Effective Technological Measures. For purposes of this Public License, simply +making modifications authorized by this Section 2(a)(4) never produces Adapted +Material. + + 5. Downstream recipients. + +A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed +Material automatically receives an offer from the Licensor to exercise the +Licensed Rights under the terms and conditions of this Public License. + +B. No downstream restrictions. You may not offer or impose any additional +or different terms or conditions on, or apply any Effective Technological +Measures to, the Licensed Material if doing so restricts exercise of the Licensed +Rights by any recipient of the Licensed Material. + +6. No endorsement. Nothing in this Public License constitutes or may be construed +as permission to assert or imply that You are, or that Your use of the Licensed +Material is, connected with, or sponsored, endorsed, or granted official status +by, the Licensor or others designated to receive attribution as provided in +Section 3(a)(1)(A)(i). + + b. Other rights. + +1. Moral rights, such as the right of integrity, are not licensed under this +Public License, nor are publicity, privacy, and/or other similar personality +rights; however, to the extent possible, the Licensor waives and/or agrees +not to assert any such rights held by the Licensor to the limited extent necessary +to allow You to exercise the Licensed Rights, but not otherwise. + +2. Patent and trademark rights are not licensed under this Public License. + +3. To the extent possible, the Licensor waives any right to collect royalties +from You for the exercise of the Licensed Rights, whether directly or through +a collecting society under any voluntary or waivable statutory or compulsory +licensing scheme. In all other cases the Licensor expressly reserves any right +to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following +conditions. + + a. Attribution. + +1. If You Share the Licensed Material (including in modified form), You must: + +A. retain the following if it is supplied by the Licensor with the Licensed +Material: + +i. identification of the creator(s) of the Licensed Material and any others +designated to receive attribution, in any reasonable manner requested by the +Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + +v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + +B. indicate if You modified the Licensed Material and retain an indication +of any previous modifications; and + +C. indicate the Licensed Material is licensed under this Public License, and +include the text of, or the URI or hyperlink to, this Public License. + +2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner +based on the medium, means, and context in which You Share the Licensed Material. +For example, it may be reasonable to satisfy the conditions by providing a +URI or hyperlink to a resource that includes the required information. + +3. If requested by the Licensor, You must remove any of the information required +by Section 3(a)(1)(A) to the extent reasonably practicable. + +4. If You Share Adapted Material You produce, the Adapter's License You apply +must not prevent recipients of the Adapted Material from complying with this +Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to +Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, +reuse, reproduce, and Share all or a substantial portion of the contents of +the database; + +b. if You include all or a substantial portion of the database contents in +a database in which You have Sui Generis Database Rights, then the database +in which You have Sui Generis Database Rights (but not its individual contents) +is Adapted Material; and + +c. You must comply with the conditions in Section 3(a) if You Share all or +a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace +Your obligations under this Public License where the Licensed Rights include +other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + +a. Unless otherwise separately undertaken by the Licensor, to the extent possible, +the Licensor offers the Licensed Material as-is and as-available, and makes +no representations or warranties of any kind concerning the Licensed Material, +whether express, implied, statutory, or other. This includes, without limitation, +warranties of title, merchantability, fitness for a particular purpose, non-infringement, +absence of latent or other defects, accuracy, or the presence or absence of +errors, whether or not known or discoverable. Where disclaimers of warranties +are not allowed in full or in part, this disclaimer may not apply to You. + +b. To the extent possible, in no event will the Licensor be liable to You +on any legal theory (including, without limitation, negligence) or otherwise +for any direct, special, indirect, incidental, consequential, punitive, exemplary, +or other losses, costs, expenses, or damages arising out of this Public License +or use of the Licensed Material, even if the Licensor has been advised of +the possibility of such losses, costs, expenses, or damages. Where a limitation +of liability is not allowed in full or in part, this limitation may not apply +to You. + +c. The disclaimer of warranties and limitation of liability provided above +shall be interpreted in a manner that, to the extent possible, most closely +approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + +a. This Public License applies for the term of the Copyright and Similar Rights +licensed here. However, if You fail to comply with this Public License, then +Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section +6(a), it reinstates: + +1. automatically as of the date the violation is cured, provided it is cured +within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + +c. For the avoidance of doubt, this Section 6(b) does not affect any right +the Licensor may have to seek remedies for Your violations of this Public +License. + +d. For the avoidance of doubt, the Licensor may also offer the Licensed Material +under separate terms or conditions or stop distributing the Licensed Material +at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + +a. The Licensor shall not be bound by any additional or different terms or +conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the Licensed +Material not stated herein are separate from and independent of the terms +and conditions of this Public License. + +Section 8 – Interpretation. + +a. For the avoidance of doubt, this Public License does not, and shall not +be interpreted to, reduce, limit, restrict, or impose conditions on any use +of the Licensed Material that could lawfully be made without permission under +this Public License. + +b. To the extent possible, if any provision of this Public License is deemed +unenforceable, it shall be automatically reformed to the minimum extent necessary +to make it enforceable. If the provision cannot be reformed, it shall be severed +from this Public License without affecting the enforceability of the remaining +terms and conditions. + +c. No term or condition of this Public License will be waived and no failure +to comply consented to unless expressly agreed to by the Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a limitation +upon, or waiver of, any privileges and immunities that apply to the Licensor +or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative +Commons may elect to apply one of its public licenses to material it publishes +and in those instances will be considered the "Licensor." The text of the +Creative Commons public licenses is dedicated to the public domain under the +CC0 Public Domain Dedication. Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as otherwise +permitted by the Creative Commons policies published at creativecommons.org/policies, +Creative Commons does not authorize the use of the trademark "Creative Commons" +or any other trademark or logo of Creative Commons without its prior written +consent including, without limitation, in connection with any unauthorized +modifications to any of its public licenses or any other arrangements, understandings, +or agreements concerning use of licensed material. For the avoidance of doubt, +this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 0000000..204b93d --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,19 @@ +MIT License Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICENSES/Unlicense.txt b/LICENSES/Unlicense.txt new file mode 100644 index 0000000..24a8f90 --- /dev/null +++ b/LICENSES/Unlicense.txt @@ -0,0 +1,20 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute +this software, either in source code form or as a compiled binary, for any +purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and +to the detriment of our heirs and successors. We intend this dedication to +be an overt act of relinquishment in perpetuity of all present and future +rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, +please refer to diff --git a/README.rst.license b/README.rst.license new file mode 100644 index 0000000..11cd75d --- /dev/null +++ b/README.rst.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries + +SPDX-License-Identifier: MIT diff --git a/adafruit_bme680.py b/adafruit_bme680.py index fe3a975..7ad5d35 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -1,24 +1,6 @@ -# The MIT License (MIT) +# SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries # -# Copyright (c) 2017 ladyada for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. +# SPDX-License-Identifier: MIT # We have a lot of attributes for this complex sensor. # pylint: disable=too-many-instance-attributes @@ -139,12 +121,12 @@ def _read24(arr): class Adafruit_BME680: """Driver from BME680 air quality sensor - :param int refresh_rate: Maximum number of readings per second. Faster property reads - will be from the previous reading.""" + :param int refresh_rate: Maximum number of readings per second. Faster property reads + will be from the previous reading.""" def __init__(self, *, refresh_rate=10): """Check the BME680 was found, read the coefficients and enable the sensor for continuous - reads.""" + reads.""" self._write(_BME680_REG_SOFTRESET, [0xB6]) time.sleep(0.005) @@ -307,7 +289,7 @@ def humidity(self): @property def altitude(self): """The altitude based on current ``pressure`` vs the sea level pressure - (``sea_level_pressure``) - which you must enter ahead of time)""" + (``sea_level_pressure``) - which you must enter ahead of time)""" pressure = self.pressure # in Si units for hPascal return 44330 * (1.0 - math.pow(pressure / self.sea_level_pressure, 0.1903)) @@ -325,7 +307,7 @@ def gas(self): def _perform_reading(self): """Perform a single-shot reading from the sensor and fill internal data structure for - calculations""" + calculations""" if time.monotonic() - self._last_reading < self._min_refresh_time: return @@ -401,10 +383,10 @@ def _write(self, register, values): class Adafruit_BME680_I2C(Adafruit_BME680): """Driver for I2C connected BME680. - :param int address: I2C device address - :param bool debug: Print debug statements when True. - :param int refresh_rate: Maximum number of readings per second. Faster property reads - will be from the previous reading.""" + :param int address: I2C device address + :param bool debug: Print debug statements when True. + :param int refresh_rate: Maximum number of readings per second. Faster property reads + will be from the previous reading.""" def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10): """Initialize the I2C device at the 'address' given""" @@ -441,13 +423,13 @@ def _write(self, register, values): class Adafruit_BME680_SPI(Adafruit_BME680): """Driver for SPI connected BME680. - :param busio.SPI spi: SPI device - :param digitalio.DigitalInOut cs: Chip Select - :param bool debug: Print debug statements when True. - :param int baudrate: Clock rate, default is 100000 - :param int refresh_rate: Maximum number of readings per second. Faster property reads - will be from the previous reading. - """ + :param busio.SPI spi: SPI device + :param digitalio.DigitalInOut cs: Chip Select + :param bool debug: Print debug statements when True. + :param int baudrate: Clock rate, default is 100000 + :param int refresh_rate: Maximum number of readings per second. Faster property reads + will be from the previous reading. + """ def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10): from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel diff --git a/docs/_static/favicon.ico.license b/docs/_static/favicon.ico.license new file mode 100644 index 0000000..86a3fbf --- /dev/null +++ b/docs/_static/favicon.ico.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2018 Phillip Torrone for Adafruit Industries + +SPDX-License-Identifier: CC-BY-4.0 diff --git a/docs/api.rst.license b/docs/api.rst.license new file mode 100644 index 0000000..9aae48d --- /dev/null +++ b/docs/api.rst.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT diff --git a/docs/conf.py b/docs/conf.py index f46f737..0f094c4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + import os import sys diff --git a/docs/examples.rst.license b/docs/examples.rst.license new file mode 100644 index 0000000..9aae48d --- /dev/null +++ b/docs/examples.rst.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT diff --git a/docs/index.rst.license b/docs/index.rst.license new file mode 100644 index 0000000..9aae48d --- /dev/null +++ b/docs/index.rst.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index a72fc2a..8e2c056 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT + import time import board from busio import I2C diff --git a/requirements.txt b/requirements.txt index 3031961..f675e3b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,6 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + Adafruit-Blinka adafruit-circuitpython-busdevice diff --git a/setup.py b/setup.py index a01a896..343a236 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + """A setuptools based setup module. See: From bfaba1373436cbac47781b50c635ed28841c10fc Mon Sep 17 00:00:00 2001 From: caternuson Date: Fri, 5 Feb 2021 09:39:34 -0800 Subject: [PATCH 006/115] add SPI example --- examples/bme680_spi.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 examples/bme680_spi.py diff --git a/examples/bme680_spi.py b/examples/bme680_spi.py new file mode 100644 index 0000000..708c49a --- /dev/null +++ b/examples/bme680_spi.py @@ -0,0 +1,27 @@ +import time +import board +import digitalio +from busio import SPI +import adafruit_bme680 + +# Create library object using our Bus SPI port +cs = digitalio.DigitalInOut(board.D10) +spi = SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) +bme680 = adafruit_bme680.Adafruit_BME680_SPI(spi, cs) + +# change this to match the location's pressure (hPa) at sea level +bme680.sea_level_pressure = 1013.25 + +# You will usually have to add an offset to account for the temperature of +# the sensor. This is usually around 5 degrees but varies by use. Use a +# separate temperature sensor to calibrate this one. +temperature_offset = -5 + +while True: + print("\nTemperature: %0.1f C" % (bme680.temperature + temperature_offset)) + print("Gas: %d ohm" % bme680.gas) + print("Humidity: %0.1f %%" % bme680.relative_humidity) + print("Pressure: %0.3f hPa" % bme680.pressure) + print("Altitude = %0.2f meters" % bme680.altitude) + + time.sleep(1) From 3f292023f8fb3785735804062fbee2964e6100f7 Mon Sep 17 00:00:00 2001 From: caternuson Date: Wed, 10 Feb 2021 08:05:43 -0800 Subject: [PATCH 007/115] add license --- examples/bme680_spi.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/bme680_spi.py b/examples/bme680_spi.py index 708c49a..40e5f84 100644 --- a/examples/bme680_spi.py +++ b/examples/bme680_spi.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021 Carter Nelson for Adafruit Industries +# SPDX-License-Identifier: MIT + import time import board import digitalio From 1c84f8b16c7d9db125244fd42d703addc11e83dd Mon Sep 17 00:00:00 2001 From: dherrada Date: Wed, 3 Feb 2021 16:38:51 -0500 Subject: [PATCH 008/115] Hardcoded Black and REUSE versions Signed-off-by: dherrada --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aab5f1c..07f886c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,11 +4,11 @@ repos: - repo: https://github.com/python/black - rev: stable + rev: 20.8b1 hooks: - id: black - repo: https://github.com/fsfe/reuse-tool - rev: latest + rev: v0.12.1 hooks: - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks From 5ceb5a5f54297ecd39a9cdcf4687947e2a5220ef Mon Sep 17 00:00:00 2001 From: dherrada Date: Tue, 2 Mar 2021 16:46:17 -0500 Subject: [PATCH 009/115] Removed pylint process from github workflow Signed-off-by: dherrada --- .github/workflows/build.yml | 8 ++------ .pre-commit-config.yaml | 15 +++++++++++++++ .pylintrc | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 59baa53..621d5ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,18 +42,14 @@ jobs: # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | source actions-ci/install.sh - - name: Pip install pylint, Sphinx, pre-commit + - name: Pip install Sphinx, pre-commit run: | - pip install --force-reinstall pylint Sphinx sphinx-rtd-theme pre-commit + pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags - name: Pre-commit hooks run: | pre-commit run --all-files - - name: PyLint - run: | - pylint $( find . -path './adafruit*.py' ) - ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace $( find . -path "./examples/*.py" )) - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - name: Archive bundles diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 07f886c..354c761 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,3 +17,18 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace +- repo: https://github.com/pycqa/pylint + rev: pylint-2.7.1 + hooks: + - id: pylint + name: pylint (library code) + types: [python] + exclude: "^(docs/|examples/|setup.py$)" +- repo: local + hooks: + - id: pylint_examples + name: pylint (examples code) + description: Run pylint rules on "examples/*.py" files + entry: /usr/bin/env bash -c + args: ['([[ ! -d "examples" ]] || for example in $(find . -path "./examples/*.py"); do pylint --disable=missing-docstring,invalid-name $example; done)'] + language: system diff --git a/.pylintrc b/.pylintrc index 5c31f66..9ed669e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -250,7 +250,7 @@ ignore-comments=yes ignore-docstrings=yes # Ignore imports when computing similarities. -ignore-imports=no +ignore-imports=yes # Minimum lines number of a similarity. min-similarity-lines=4 From 8f26c75cbef5cad29e58b925373b98e66852c70c Mon Sep 17 00:00:00 2001 From: dherrada Date: Tue, 2 Mar 2021 17:17:50 -0500 Subject: [PATCH 010/115] Re-added pylint install to build.yml Signed-off-by: dherrada --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 621d5ef..3baf502 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,9 +42,9 @@ jobs: # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | source actions-ci/install.sh - - name: Pip install Sphinx, pre-commit + - name: Pip install pylint, Sphinx, pre-commit run: | - pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit + pip install --force-reinstall pylint Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags - name: Pre-commit hooks From d8bb3234b6fab9a572b7e152a9605f28ba960584 Mon Sep 17 00:00:00 2001 From: dherrada Date: Fri, 19 Mar 2021 13:46:49 -0400 Subject: [PATCH 011/115] "Increase duplicate code check threshold " --- .pylintrc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.pylintrc b/.pylintrc index 9ed669e..0238b90 100644 --- a/.pylintrc +++ b/.pylintrc @@ -22,8 +22,7 @@ ignore-patterns= #init-hook= # Use multiple processes to speed up Pylint. -# jobs=1 -jobs=2 +jobs=1 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. @@ -253,7 +252,7 @@ ignore-docstrings=yes ignore-imports=yes # Minimum lines number of a similarity. -min-similarity-lines=4 +min-similarity-lines=12 [BASIC] From cf98bedd8ea5ad0262c6b52b63ba1124929982b4 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 24 Apr 2021 17:27:15 -0400 Subject: [PATCH 012/115] improving_docs --- .gitignore | 1 + README.rst | 5 +- adafruit_bme680.py | 97 +++++++++++++++++++++++++++++++---- docs/examples.rst | 9 ++++ docs/index.rst | 2 + examples/bme680_simpletest.py | 5 +- examples/bme680_spi.py | 5 +- 7 files changed, 104 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 9101cf0..0b009f2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ __pycache__ _build *.pyc +.idea diff --git a/README.rst b/README.rst index 1c65e4c..d8801e3 100644 --- a/README.rst +++ b/README.rst @@ -56,13 +56,12 @@ Usage Example .. code-block:: python - from busio import I2C import adafruit_bme680 import time import board - # Create library object using our Bus I2C port - i2c = I2C(board.SCL, board.SDA) + # Create sensor object, communicating over the board's default I2C bus + i2c = board.I2C() # uses board.SCL and board.SDA bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c) # change this to match the location's pressure (hPa) at sea level diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 7ad5d35..e2d63e0 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -142,7 +142,7 @@ def __init__(self, *, refresh_rate=10): self._write(_BME680_BME680_GAS_WAIT_0, [0x65]) self.sea_level_pressure = 1013.25 - """Pressure in hectoPascals at sea level. Used to calibrate ``altitude``.""" + """Pressure in hectoPascals at sea level. Used to calibrate :attr:`altitude`.""" # Default oversampling and filter register values. self._pressure_oversample = 0b011 @@ -210,7 +210,7 @@ def filter_size(self, size): @property def temperature(self): - """The compensated temperature in degrees celsius.""" + """The compensated temperature in degrees Celsius.""" self._perform_reading() calc_temp = ((self._t_fine * 5) + 128) / 256 return calc_temp / 100 @@ -288,8 +288,8 @@ def humidity(self): @property def altitude(self): - """The altitude based on current ``pressure`` vs the sea level pressure - (``sea_level_pressure``) - which you must enter ahead of time)""" + """The altitude based on current :attr:`pressure` vs the sea level pressure + (:attr:`sea_level_pressure`) - which you must enter ahead of time)""" pressure = self.pressure # in Si units for hPascal return 44330 * (1.0 - math.pow(pressure / self.sea_level_pressure, 0.1903)) @@ -383,10 +383,47 @@ def _write(self, register, values): class Adafruit_BME680_I2C(Adafruit_BME680): """Driver for I2C connected BME680. - :param int address: I2C device address - :param bool debug: Print debug statements when True. + :param ~busio.I2C i2c: The I2C bus the BME680 is connected to. + :param int address: I2C device address. Defaults to :const:`0x77` + :param bool debug: Print debug statements when `True`. Defaults to `False` :param int refresh_rate: Maximum number of readings per second. Faster property reads - will be from the previous reading.""" + will be from the previous reading. + + **Quickstart: Importing and using the BME680** + + Here is an example of using the :class:`BMP680_I2C` class. + First you will need to import the libraries to use the sensor + + .. code-block:: python + + import board + import adafruit_bme680 + + Once this is done you can define your `board.I2C` object and define your sensor object + + .. code-block:: python + + i2c = board.I2C() # uses board.SCL and board.SDA + bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c) + + You need to setup the pressure at sea level + + .. code-block:: python + + bme680.sea_level_pressure = 1013.25 + + Now you have access to the :attr:`temperature`, :attr:`gas`, :attr:`relative_humidity`, + :attr:`pressure` and :attr:`altitude` attributes + + .. code-block:: python + + temperature = bme680.temperature + gas = bme680.gas + relative_humidity = bme680.relative_humidity + pressure = bme680.pressure + altitude = bme680.altitude + + """ def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10): """Initialize the I2C device at the 'address' given""" @@ -423,12 +460,50 @@ def _write(self, register, values): class Adafruit_BME680_SPI(Adafruit_BME680): """Driver for SPI connected BME680. - :param busio.SPI spi: SPI device - :param digitalio.DigitalInOut cs: Chip Select - :param bool debug: Print debug statements when True. - :param int baudrate: Clock rate, default is 100000 + :param ~busio.SPI spi: SPI device + :param ~digitalio.DigitalInOut cs: Chip Select + :param bool debug: Print debug statements when `True`. Defaults to `False` + :param int baudrate: Clock rate, default is :const:`100000` :param int refresh_rate: Maximum number of readings per second. Faster property reads will be from the previous reading. + + + **Quickstart: Importing and using the BME680** + + Here is an example of using the :class:`BMP680_SPI` class. + First you will need to import the libraries to use the sensor + + .. code-block:: python + + import board + from digitalio import DigitalInOut, Direction + import adafruit_bme680 + + Once this is done you can define your `board.SPI` object and define your sensor object + + .. code-block:: python + + cs = digitalio.DigitalInOut(board.D10) + spi = board.SPI() + bme680 = adafruit_bme680.Adafruit_BME680_SPI(spi, cs) + + You need to setup the pressure at sea level + + .. code-block:: python + + bme680.sea_level_pressure = 1013.25 + + Now you have access to the :attr:`temperature`, :attr:`gas`, :attr:`relative_humidity`, + :attr:`pressure` and :attr:`altitude` attributes + + .. code-block:: python + + temperature = bme680.temperature + gas = bme680.gas + relative_humidity = bme680.relative_humidity + pressure = bme680.pressure + altitude = bme680.altitude + """ def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10): diff --git a/docs/examples.rst b/docs/examples.rst index 6f9ae55..375d90c 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -6,3 +6,12 @@ Ensure your device works with this simple test. .. literalinclude:: ../examples/bme680_simpletest.py :caption: examples/bme680_simpletest.py :linenos: + +SPI Example +----------- + +Showcase the use of the SPI bus to read the sensor data. + +.. literalinclude:: ../examples/bme680_spi.py + :caption: examples/bme680_spi.py + :linenos: diff --git a/docs/index.rst b/docs/index.rst index 8c4ff7e..8a9465b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,6 +23,8 @@ Table of Contents .. toctree:: :caption: Tutorials + Adafruit BME680 - Temperature, Humidity, Pressure and Gas Sensor Learning Guide + .. toctree:: :caption: Related Products diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index 8e2c056..5c1849e 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -3,11 +3,10 @@ import time import board -from busio import I2C import adafruit_bme680 -# Create library object using our Bus I2C port -i2c = I2C(board.SCL, board.SDA) +# Create sensor object, communicating over the board's default I2C bus +i2c = board.I2C() # uses board.SCL and board.SDA bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug=False) # change this to match the location's pressure (hPa) at sea level diff --git a/examples/bme680_spi.py b/examples/bme680_spi.py index 40e5f84..f8161dd 100644 --- a/examples/bme680_spi.py +++ b/examples/bme680_spi.py @@ -4,12 +4,11 @@ import time import board import digitalio -from busio import SPI import adafruit_bme680 -# Create library object using our Bus SPI port +# Create sensor object, communicating over the board's default SPI bus cs = digitalio.DigitalInOut(board.D10) -spi = SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) +spi = board.SPI() bme680 = adafruit_bme680.Adafruit_BME680_SPI(spi, cs) # change this to match the location's pressure (hPa) at sea level From 492b365b5feb7effdc41c5ad62d2cb960e2ed45b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 24 Apr 2021 19:26:31 -0400 Subject: [PATCH 013/115] adding_tab_space --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index d8801e3..1c11d6b 100644 --- a/README.rst +++ b/README.rst @@ -62,7 +62,7 @@ Usage Example # Create sensor object, communicating over the board's default I2C bus i2c = board.I2C() # uses board.SCL and board.SDA - bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c) + bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c) # change this to match the location's pressure (hPa) at sea level bme680.sea_level_pressure = 1013.25 From b0b6e7d3d1c4cf54db2c63cba2e4b69b1114d1a8 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 24 Apr 2021 19:47:34 -0400 Subject: [PATCH 014/115] Reformating_readme.rst usage example. --- README.rst | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.rst b/README.rst index 1c11d6b..b94cf60 100644 --- a/README.rst +++ b/README.rst @@ -54,27 +54,27 @@ To install in a virtual environment in your current project: Usage Example ============= -.. code-block:: python +.. code-block:: python3 - import adafruit_bme680 - import time - import board + import adafruit_bme680 + import time + import board - # Create sensor object, communicating over the board's default I2C bus + # Create sensor object, communicating over the board's default I2C bus i2c = board.I2C() # uses board.SCL and board.SDA bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c) - # change this to match the location's pressure (hPa) at sea level - bme680.sea_level_pressure = 1013.25 + # change this to match the location's pressure (hPa) at sea level + bme680.sea_level_pressure = 1013.25 - while True: - print("\nTemperature: %0.1f C" % bme680.temperature) - print("Gas: %d ohm" % bme680.gas) - print("Humidity: %0.1f %%" % bme680.relative_humidity) - print("Pressure: %0.3f hPa" % bme680.pressure) - print("Altitude = %0.2f meters" % bme680.altitude) + while True: + print("\nTemperature: %0.1f C" % bme680.temperature) + print("Gas: %d ohm" % bme680.gas) + print("Humidity: %0.1f %%" % bme680.relative_humidity) + print("Pressure: %0.3f hPa" % bme680.pressure) + print("Altitude = %0.2f meters" % bme680.altitude) - time.sleep(2) + time.sleep(2) Contributing From b97ecf571d27af887cd8bb2675a6cee6341db67c Mon Sep 17 00:00:00 2001 From: dherrada Date: Wed, 19 May 2021 13:32:42 -0400 Subject: [PATCH 015/115] Added pull request template Signed-off-by: dherrada --- .../adafruit_circuitpython_pr.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md diff --git a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md new file mode 100644 index 0000000..71ef8f8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: 2021 Adafruit Industries +# +# SPDX-License-Identifier: MIT + +Thank you for contributing! Before you submit a pull request, please read the following. + +Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://circuitpython.readthedocs.io/en/latest/docs/design_guide.html + +If your changes are to documentation, please verify that the documentation builds locally by following the steps found here: https://adafru.it/build-docs + +Before submitting the pull request, make sure you've run Pylint and Black locally on your code. You can do this manually or using pre-commit. Instructions are available here: https://adafru.it/check-your-code + +Please remove all of this text before submitting. Include an explanation or list of changes included in your PR, as well as, if applicable, a link to any related issues. From 6a5d29c5f805a9be80d16e992486231eb0392892 Mon Sep 17 00:00:00 2001 From: dherrada Date: Wed, 19 May 2021 13:35:18 -0400 Subject: [PATCH 016/115] Added help text and problem matcher Signed-off-by: dherrada --- .github/workflows/build.yml | 2 ++ .github/workflows/failure-help-text.yml | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 .github/workflows/failure-help-text.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3baf502..0ab7182 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,3 +71,5 @@ jobs: python setup.py sdist python setup.py bdist_wheel --universal twine check dist/* + - name: Setup problem matchers + uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 diff --git a/.github/workflows/failure-help-text.yml b/.github/workflows/failure-help-text.yml new file mode 100644 index 0000000..0b1194f --- /dev/null +++ b/.github/workflows/failure-help-text.yml @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2021 Scott Shawcroft for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Failure help text + +on: + workflow_run: + workflows: ["Build CI"] + types: + - completed + +jobs: + post-help: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.event == 'pull_request' }} + steps: + - name: Post comment to help + uses: adafruit/circuitpython-action-library-ci-failed@v1 From b6c8122cfbb9f22dfea2b59eb760f40c90152343 Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 24 May 2021 09:54:31 -0400 Subject: [PATCH 017/115] Moved CI to Python 3.7 Signed-off-by: dherrada --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0ab7182..c4c975d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,10 +22,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '_' '-' ) - - name: Set up Python 3.6 + - name: Set up Python 3.7 uses: actions/setup-python@v1 with: - python-version: 3.6 + python-version: 3.7 - name: Versions run: | python3 --version From 44a449864105bef8e3b8e47d145448f049a4824d Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 7 Jun 2021 13:29:02 -0400 Subject: [PATCH 018/115] Moved default branch to main --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b94cf60..0717f07 100644 --- a/README.rst +++ b/README.rst @@ -81,7 +81,7 @@ Contributing ============ Contributions are welcome! Please read our `Code of Conduct -`_ +`_ before contributing to help this project stay welcoming. Documentation From 28d9d2dce65943088e9d3f4772ab63894412d402 Mon Sep 17 00:00:00 2001 From: caternuson Date: Thu, 22 Jul 2021 11:38:07 -0700 Subject: [PATCH 019/115] update for bme688 --- adafruit_bme680.py | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index e2d63e0..5633883 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -47,6 +47,7 @@ _BME680_CHIPID = const(0x61) _BME680_REG_CHIPID = const(0xD0) +_BME68X_REG_VARIANT = const(0xF0) _BME680_BME680_COEFF_ADDR1 = const(0x89) _BME680_BME680_COEFF_ADDR2 = const(0xE1) _BME680_BME680_RES_HEAT_0 = const(0x5A) @@ -135,6 +136,9 @@ def __init__(self, *, refresh_rate=10): if chip_id != _BME680_CHIPID: raise RuntimeError("Failed to find BME680! Chip ID 0x%x" % chip_id) + # Get variant + self._chip_variant = self._read_byte(_BME68X_REG_VARIANT) + self._read_calibration() # set up heater @@ -297,12 +301,21 @@ def altitude(self): def gas(self): """The gas resistance in ohms""" self._perform_reading() - var1 = ( - (1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range]) - ) / 65536 - var2 = ((self._adc_gas * 32768) - 16777216) + var1 - var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512 - calc_gas_res = (var3 + (var2 / 2)) / var2 + if self._chip_variant == 0x01: + # taken from https://github.com/BoschSensortec/BME68x-Sensor-API + var1 = 262144 >> self._gas_range + var2 = self._adc_gas - 512 + var2 *= 3 + var2 = 4096 + var2 + calc_gas_res = (1000 * var1) / var2 + calc_gas_res = calc_gas_res * 100 + else: + var1 = ( + (1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range]) + ) / 65536 + var2 = ((self._adc_gas * 32768) - 16777216) + var1 + var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512 + calc_gas_res = (var3 + (var2 / 2)) / var2 return int(calc_gas_res) def _perform_reading(self): @@ -321,14 +334,16 @@ def _perform_reading(self): # turn on humidity oversample self._write(_BME680_REG_CTRL_HUM, [self._humidity_oversample]) # gas measurements enabled - self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS]) - + if self._chip_variant == 0x01: + self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS << 1]) + else: + self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS]) ctrl = self._read_byte(_BME680_REG_CTRL_MEAS) ctrl = (ctrl & 0xFC) | 0x01 # enable single shot! self._write(_BME680_REG_CTRL_MEAS, [ctrl]) new_data = False while not new_data: - data = self._read(_BME680_REG_MEAS_STATUS, 15) + data = self._read(_BME680_REG_MEAS_STATUS, 17) new_data = data[0] & 0x80 != 0 time.sleep(0.005) self._last_reading = time.monotonic() @@ -336,8 +351,12 @@ def _perform_reading(self): self._adc_pres = _read24(data[2:5]) / 16 self._adc_temp = _read24(data[5:8]) / 16 self._adc_hum = struct.unpack(">H", bytes(data[8:10]))[0] - self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64) - self._gas_range = data[14] & 0x0F + if self._chip_variant == 0x01: + self._adc_gas = int(struct.unpack(">H", bytes(data[15:17]))[0] / 64) + self._gas_range = data[16] & 0x0F + else: + self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64) + self._gas_range = data[14] & 0x0F var1 = (self._adc_temp / 8) - (self._temp_calibration[0] * 2) var2 = (var1 * self._temp_calibration[1]) / 2048 From 217de247ecc78258d44f63b3e140d981409b0cab Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 23 Sep 2021 17:52:55 -0400 Subject: [PATCH 020/115] Globally disabled consider-using-f-string pylint check Signed-off-by: dherrada --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 354c761..8810708 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,5 +30,5 @@ repos: name: pylint (examples code) description: Run pylint rules on "examples/*.py" files entry: /usr/bin/env bash -c - args: ['([[ ! -d "examples" ]] || for example in $(find . -path "./examples/*.py"); do pylint --disable=missing-docstring,invalid-name $example; done)'] + args: ['([[ ! -d "examples" ]] || for example in $(find . -path "./examples/*.py"); do pylint --disable=missing-docstring,invalid-name,consider-using-f-string $example; done)'] language: system From 08e4624ce672e9bf6f126ac6b26db6931454be07 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 25 Oct 2021 11:13:52 -0500 Subject: [PATCH 021/115] add docs link to readme --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 0717f07..b8113f5 100644 --- a/README.rst +++ b/README.rst @@ -77,6 +77,11 @@ Usage Example time.sleep(2) +Documentation +============= + +API documentation for this library can be found on `Read the Docs `_. + Contributing ============ From 8aef13f166f7be8a3eab921f3bc394cbc78663a8 Mon Sep 17 00:00:00 2001 From: dherrada Date: Wed, 3 Nov 2021 14:40:16 -0400 Subject: [PATCH 022/115] PATCH Pylint and readthedocs patch test Signed-off-by: dherrada --- .github/workflows/build.yml | 4 ++-- .pre-commit-config.yaml | 26 +++++++++++++++++--------- .pylintrc | 2 +- .readthedocs.yml | 2 +- docs/requirements.txt | 5 +++++ 5 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 docs/requirements.txt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4c975d..ca35544 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,9 +42,9 @@ jobs: # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | source actions-ci/install.sh - - name: Pip install pylint, Sphinx, pre-commit + - name: Pip install Sphinx, pre-commit run: | - pip install --force-reinstall pylint Sphinx sphinx-rtd-theme pre-commit + pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags - name: Pre-commit hooks diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8810708..1b9fadc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,17 +18,25 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: pylint-2.7.1 + rev: v2.11.1 hooks: - id: pylint name: pylint (library code) types: [python] - exclude: "^(docs/|examples/|setup.py$)" -- repo: local - hooks: - - id: pylint_examples - name: pylint (examples code) + args: + - --disable=consider-using-f-string + exclude: "^(docs/|examples/|tests/|setup.py$)" + - id: pylint + name: pylint (example code) description: Run pylint rules on "examples/*.py" files - entry: /usr/bin/env bash -c - args: ['([[ ! -d "examples" ]] || for example in $(find . -path "./examples/*.py"); do pylint --disable=missing-docstring,invalid-name,consider-using-f-string $example; done)'] - language: system + types: [python] + files: "^examples/" + args: + - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code + - id: pylint + name: pylint (test code) + description: Run pylint rules on "tests/*.py" files + types: [python] + files: "^tests/" + args: + - --disable=missing-docstring,consider-using-f-string,duplicate-code diff --git a/.pylintrc b/.pylintrc index 0238b90..e78bad2 100644 --- a/.pylintrc +++ b/.pylintrc @@ -252,7 +252,7 @@ ignore-docstrings=yes ignore-imports=yes # Minimum lines number of a similarity. -min-similarity-lines=12 +min-similarity-lines=4 [BASIC] diff --git a/.readthedocs.yml b/.readthedocs.yml index ffa84c4..49dcab3 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -4,4 +4,4 @@ python: version: 3 -requirements_file: requirements.txt +requirements_file: docs/requirements.txt diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..88e6733 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +sphinx>=4.0.0 From 462c2d88ca7dbbca445fd951b79d4850988f7c66 Mon Sep 17 00:00:00 2001 From: dherrada Date: Fri, 5 Nov 2021 14:49:30 -0400 Subject: [PATCH 023/115] Disabled unspecified-encoding pylint check Signed-off-by: dherrada --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index e78bad2..cfd1c41 100644 --- a/.pylintrc +++ b/.pylintrc @@ -55,7 +55,7 @@ confidence= # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" # disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call -disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation +disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation,unspecified-encoding # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option From 80d5401fb7db21a0abc1912d4cd40636a52cb6ef Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 8 Nov 2021 12:33:52 -0500 Subject: [PATCH 024/115] Linted --- adafruit_bme680.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index e2d63e0..9c66be1 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -280,10 +280,8 @@ def humidity(self): calc_hum = (((var3 + var6) / 1024) * 1000) / 4096 calc_hum /= 1000 # get back to RH - if calc_hum > 100: - calc_hum = 100 - if calc_hum < 0: - calc_hum = 0 + calc_hum = min(calc_hum, 100) + calc_hum = max(calc_hum, 0) return calc_hum @property From 11aded7a485ab757c357b8e27305e417a31dc3ae Mon Sep 17 00:00:00 2001 From: dherrada Date: Tue, 9 Nov 2021 13:31:14 -0500 Subject: [PATCH 025/115] Updated readthedocs file Signed-off-by: dherrada --- .readthedocs.yaml | 15 +++++++++++++++ .readthedocs.yml | 7 ------- 2 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 .readthedocs.yaml delete mode 100644 .readthedocs.yml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..95ec218 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +python: + version: "3.6" + install: + - requirements: docs/requirements.txt + - requirements: requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 49dcab3..0000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: Unlicense - -python: - version: 3 -requirements_file: docs/requirements.txt From 21161d61d0f2354f2a51f509be9550ef2e7ee0b6 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 23 Nov 2021 12:59:36 -0600 Subject: [PATCH 026/115] update rtd py version --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 95ec218..1335112 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 python: - version: "3.6" + version: "3.7" install: - requirements: docs/requirements.txt - requirements: requirements.txt From 0fe612e5356583f83c0827767936ff1feeadf428 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 22 Dec 2021 09:56:31 -0500 Subject: [PATCH 027/115] Remove obsolete reference to ustruct --- adafruit_bme680.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index d80e7c7..a8f269c 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -28,16 +28,11 @@ * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice """ - +import struct import time import math from micropython import const -try: - import struct -except ImportError: - import ustruct as struct - __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" From 0232ec9dd3dec9773a0209e394511f7dd770e152 Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 13 Jan 2022 16:27:30 -0500 Subject: [PATCH 028/115] First part of patch Signed-off-by: dherrada --- .../PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md | 2 +- .github/workflows/build.yml | 6 +++--- .github/workflows/release.yml | 8 ++++---- .readthedocs.yaml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md index 71ef8f8..8de294e 100644 --- a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md +++ b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md @@ -4,7 +4,7 @@ Thank you for contributing! Before you submit a pull request, please read the following. -Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://circuitpython.readthedocs.io/en/latest/docs/design_guide.html +Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://docs.circuitpython.org/en/latest/docs/design_guide.html If your changes are to documentation, please verify that the documentation builds locally by following the steps found here: https://adafru.it/build-docs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca35544..474520d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,10 +22,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '_' '-' ) - - name: Set up Python 3.7 - uses: actions/setup-python@v1 + - name: Set up Python 3.x + uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: "3.x" - name: Versions run: | python3 --version diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d0015a..a65e5de 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,10 +24,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '_' '-' ) - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.x + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: "3.x" - name: Versions run: | python3 --version @@ -67,7 +67,7 @@ jobs: echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) - name: Set up Python if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') - uses: actions/setup-python@v1 + uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 1335112..f8b2891 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 python: - version: "3.7" + version: "3.x" install: - requirements: docs/requirements.txt - requirements: requirements.txt From bb2d185ddcae2568b5f84965c91425402a1b37df Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 24 Jan 2022 16:46:16 -0500 Subject: [PATCH 029/115] Updated docs link, updated python docs link, updated setup.py --- README.rst | 4 ++-- docs/conf.py | 6 +++--- docs/index.rst | 2 +- setup.py | 2 -- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index b8113f5..54f1e20 100644 --- a/README.rst +++ b/README.rst @@ -3,7 +3,7 @@ Introduction ============ .. image:: https://readthedocs.org/projects/adafruit-circuitpython-bme680/badge/?version=latest - :target: https://circuitpython.readthedocs.io/projects/bme680/en/latest/ + :target: https://docs.circuitpython.org/projects/bme680/en/latest/ :alt: Documentation Status .. image :: https://img.shields.io/discord/327254708534116352.svg @@ -80,7 +80,7 @@ Usage Example Documentation ============= -API documentation for this library can be found on `Read the Docs `_. +API documentation for this library can be found on `Read the Docs `_. Contributing ============ diff --git a/docs/conf.py b/docs/conf.py index 0f094c4..f80566d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,12 +21,12 @@ ] intersphinx_mapping = { - "python": ("https://docs.python.org/3.4", None), + "python": ("https://docs.python.org/3", None), "BusDevice": ( - "https://circuitpython.readthedocs.io/projects/busdevice/en/latest/", + "https://docs.circuitpython.org/projects/busdevice/en/latest/", None, ), - "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None), + "CircuitPython": ("https://docs.circuitpython.org/en/latest/", None), } # Add any paths that contain templates here, relative to this directory. diff --git a/docs/index.rst b/docs/index.rst index 8a9465b..3cffe45 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -34,7 +34,7 @@ Table of Contents :caption: Other Links Download - CircuitPython Reference Documentation + CircuitPython Reference Documentation CircuitPython Support Forum Discord Chat Adafruit Learning System diff --git a/setup.py b/setup.py index 343a236..37116a4 100644 --- a/setup.py +++ b/setup.py @@ -45,8 +45,6 @@ "Topic :: System :: Hardware", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", ], # What does your project relate to? keywords="adafruit blinka circuitpython micropython bme680 hardware temperature pressure " From 0503784e09c2aaa4b806ccfefb1e3b2d684b8303 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Wed, 9 Feb 2022 12:41:43 -0500 Subject: [PATCH 030/115] Consolidate Documentation sections of README --- README.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 54f1e20..b74bef6 100644 --- a/README.rst +++ b/README.rst @@ -82,14 +82,11 @@ Documentation API documentation for this library can be found on `Read the Docs `_. +For information on building library documentation, please check out `this guide `_. + Contributing ============ Contributions are welcome! Please read our `Code of Conduct `_ before contributing to help this project stay welcoming. - -Documentation -============= - -For information on building library documentation, please check out `this guide `_. From 928f27c8a93e230f6aa06bdf0535267d5bb454fc Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 14 Feb 2022 15:35:02 -0500 Subject: [PATCH 031/115] Fixed readthedocs build Signed-off-by: dherrada --- .readthedocs.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index f8b2891..33c2a61 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,8 +8,12 @@ # Required version: 2 +build: + os: ubuntu-20.04 + tools: + python: "3" + python: - version: "3.x" install: - requirements: docs/requirements.txt - requirements: requirements.txt From 00ede082cdd7c8ad2a211e790ff67c7fb0c4761d Mon Sep 17 00:00:00 2001 From: Kattni Rembor Date: Mon, 28 Mar 2022 15:52:04 -0400 Subject: [PATCH 032/115] Update Black to latest. Signed-off-by: Kattni Rembor --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b9fadc..7467c1d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: - repo: https://github.com/python/black - rev: 20.8b1 + rev: 22.3.0 hooks: - id: black - repo: https://github.com/fsfe/reuse-tool From 72bc5842242cb0e2c67195419caa8c86eedca9b8 Mon Sep 17 00:00:00 2001 From: billvanleeuwen424 Date: Tue, 19 Apr 2022 08:24:16 -0400 Subject: [PATCH 033/115] argument and output type for outside class function --- adafruit_bme680.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index a8f269c..9bc33c6 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -104,7 +104,7 @@ ) -def _read24(arr): +def _read24(arr: bytearray) -> float: """Parse an unsigned 24-bit value as a floating point and return it.""" ret = 0.0 # print([hex(i) for i in arr]) From 06c76fe6524cf85865be95662f8011bc6633556e Mon Sep 17 00:00:00 2001 From: billvanleeuwen424 Date: Tue, 19 Apr 2022 08:27:48 -0400 Subject: [PATCH 034/115] argument and return types for functions in the base class --- adafruit_bme680.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 9bc33c6..0bd1532 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -120,7 +120,7 @@ class Adafruit_BME680: :param int refresh_rate: Maximum number of readings per second. Faster property reads will be from the previous reading.""" - def __init__(self, *, refresh_rate=10): + def __init__(self, *, refresh_rate: int = 10) -> None: """Check the BME680 was found, read the coefficients and enable the sensor for continuous reads.""" self._write(_BME680_REG_SOFTRESET, [0xB6]) @@ -160,62 +160,62 @@ def __init__(self, *, refresh_rate=10): self._min_refresh_time = 1 / refresh_rate @property - def pressure_oversample(self): + def pressure_oversample(self) -> int: """The oversampling for pressure sensor""" return _BME680_SAMPLERATES[self._pressure_oversample] @pressure_oversample.setter - def pressure_oversample(self, sample_rate): + def pressure_oversample(self, sample_rate: int) -> None: if sample_rate in _BME680_SAMPLERATES: self._pressure_oversample = _BME680_SAMPLERATES.index(sample_rate) else: raise RuntimeError("Invalid oversample") @property - def humidity_oversample(self): + def humidity_oversample(self) -> int: """The oversampling for humidity sensor""" return _BME680_SAMPLERATES[self._humidity_oversample] @humidity_oversample.setter - def humidity_oversample(self, sample_rate): + def humidity_oversample(self, sample_rate: int) -> None: if sample_rate in _BME680_SAMPLERATES: self._humidity_oversample = _BME680_SAMPLERATES.index(sample_rate) else: raise RuntimeError("Invalid oversample") @property - def temperature_oversample(self): + def temperature_oversample(self) -> int: """The oversampling for temperature sensor""" return _BME680_SAMPLERATES[self._temp_oversample] @temperature_oversample.setter - def temperature_oversample(self, sample_rate): + def temperature_oversample(self, sample_rate: int) -> None: if sample_rate in _BME680_SAMPLERATES: self._temp_oversample = _BME680_SAMPLERATES.index(sample_rate) else: raise RuntimeError("Invalid oversample") @property - def filter_size(self): + def filter_size(self) -> int: """The filter size for the built in IIR filter""" return _BME680_FILTERSIZES[self._filter] @filter_size.setter - def filter_size(self, size): + def filter_size(self, size: int) -> None: if size in _BME680_FILTERSIZES: self._filter = _BME680_FILTERSIZES.index(size) else: raise RuntimeError("Invalid size") @property - def temperature(self): + def temperature(self) -> float: """The compensated temperature in degrees Celsius.""" self._perform_reading() calc_temp = ((self._t_fine * 5) + 128) / 256 return calc_temp / 100 @property - def pressure(self): + def pressure(self) -> float: """The barometric pressure in hectoPascals""" self._perform_reading() var1 = (self._t_fine / 2) - 64000 @@ -242,12 +242,12 @@ def pressure(self): return calc_pres / 100 @property - def relative_humidity(self): + def relative_humidity(self) -> float: """The relative humidity in RH %""" return self.humidity @property - def humidity(self): + def humidity(self) -> float: """The relative humidity in RH %""" self._perform_reading() temp_scaled = ((self._t_fine * 5) + 128) / 256 @@ -284,14 +284,14 @@ def humidity(self): return calc_hum @property - def altitude(self): + def altitude(self) -> float: """The altitude based on current :attr:`pressure` vs the sea level pressure (:attr:`sea_level_pressure`) - which you must enter ahead of time)""" pressure = self.pressure # in Si units for hPascal return 44330 * (1.0 - math.pow(pressure / self.sea_level_pressure, 0.1903)) @property - def gas(self): + def gas(self) -> int: """The gas resistance in ohms""" self._perform_reading() if self._chip_variant == 0x01: @@ -311,7 +311,7 @@ def gas(self): calc_gas_res = (var3 + (var2 / 2)) / var2 return int(calc_gas_res) - def _perform_reading(self): + def _perform_reading(self) -> None: """Perform a single-shot reading from the sensor and fill internal data structure for calculations""" if time.monotonic() - self._last_reading < self._min_refresh_time: @@ -357,7 +357,7 @@ def _perform_reading(self): var3 = (var3 * self._temp_calibration[2] * 16) / 16384 self._t_fine = int(var2 + var3) - def _read_calibration(self): + def _read_calibration(self) -> None: """Read & save the calibration coefficients""" coeff = self._read(_BME680_BME680_COEFF_ADDR1, 25) coeff += self._read(_BME680_BME680_COEFF_ADDR2, 16) @@ -381,14 +381,14 @@ def _read_calibration(self): self._heat_val = self._read_byte(0x00) self._sw_err = (self._read_byte(0x04) & 0xF0) / 16 - def _read_byte(self, register): + def _read_byte(self, register: int) -> int: """Read a byte register value and return it""" return self._read(register, 1)[0] - def _read(self, register, length): + def _read(self, register: int, length: int) -> None: raise NotImplementedError() - def _write(self, register, values): + def _write(self, register: int, values) -> None: raise NotImplementedError() From 8df44bb326a3b2f5542fc0ea38ca807e47e96895 Mon Sep 17 00:00:00 2001 From: billvanleeuwen424 Date: Tue, 19 Apr 2022 08:34:06 -0400 Subject: [PATCH 035/115] added types for i2c class also added import for the i2c type inside of a try except --- adafruit_bme680.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 0bd1532..d017c80 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -33,6 +33,12 @@ import math from micropython import const +try: + # Used only for type annotations. + from busio import I2C +except ImportError: + pass + __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" @@ -437,7 +443,14 @@ class Adafruit_BME680_I2C(Adafruit_BME680): """ - def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10): + def __init__( + self, + i2c: I2C, + address: int = 0x77, + debug: bool = False, + *, + refresh_rate: int = 10 + ) -> None: """Initialize the I2C device at the 'address' given""" from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel i2c_device, @@ -447,7 +460,7 @@ def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10): self._debug = debug super().__init__(refresh_rate=refresh_rate) - def _read(self, register, length): + def _read(self, register: int, length: int) -> bytearray: """Returns an array of 'length' bytes from the 'register'""" with self._i2c as i2c: i2c.write(bytes([register & 0xFF])) @@ -457,7 +470,7 @@ def _read(self, register, length): print("\t$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write(self, register, values): + def _write(self, register: int, values: int) -> None: """Writes an array of 'length' bytes to the 'register'""" with self._i2c as i2c: buffer = bytearray(2 * len(values)) From b72365b66bbc5855c20f6fbd802e4d1a2a3a15d9 Mon Sep 17 00:00:00 2001 From: billvanleeuwen424 Date: Tue, 19 Apr 2022 08:37:52 -0400 Subject: [PATCH 036/115] added types for the functions in the SPI class. imported digtialio and SPI in try except --- adafruit_bme680.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index d017c80..cd86933 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -35,7 +35,8 @@ try: # Used only for type annotations. - from busio import I2C + from busio import I2C, SPI + from digitalio import DigitalInOut except ImportError: pass @@ -531,7 +532,15 @@ class Adafruit_BME680_SPI(Adafruit_BME680): """ - def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10): + def __init__( + self, + spi: SPI, + cs: DigitalInOut, + baudrate: int = 100000, + debug: bool = False, + *, + refresh_rate: int = 10 + ): from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel spi_device, ) @@ -540,7 +549,7 @@ def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10): self._debug = debug super().__init__(refresh_rate=refresh_rate) - def _read(self, register, length): + def _read(self, register: int, length: int): if register != _BME680_REG_STATUS: # _BME680_REG_STATUS exists in both SPI memory pages # For all other registers, we must set the correct memory page @@ -555,7 +564,7 @@ def _read(self, register, length): print("\t$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write(self, register, values): + def _write(self, register: int, values: int): if register != _BME680_REG_STATUS: # _BME680_REG_STATUS exists in both SPI memory pages # For all other registers, we must set the correct memory page @@ -570,7 +579,7 @@ def _write(self, register, values): if self._debug: print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]])) - def _set_spi_mem_page(self, register): + def _set_spi_mem_page(self, register: int): spi_mem_page = 0x00 if register < 0x80: spi_mem_page = 0x10 From 4cd2a03e20df91cbd17610576061c319d690979a Mon Sep 17 00:00:00 2001 From: billvanleeuwen424 Date: Tue, 19 Apr 2022 21:20:06 -0400 Subject: [PATCH 037/115] added requested changes from PR #49 --- adafruit_bme680.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index cd86933..f4ae54a 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -35,8 +35,13 @@ try: # Used only for type annotations. + + import typing # pylint: disable=unused-import + + from circuitpython_typing import ReadableBuffer from busio import I2C, SPI from digitalio import DigitalInOut + except ImportError: pass @@ -111,7 +116,7 @@ ) -def _read24(arr: bytearray) -> float: +def _read24(arr: ReadableBuffer) -> float: """Parse an unsigned 24-bit value as a floating point and return it.""" ret = 0.0 # print([hex(i) for i in arr]) @@ -392,10 +397,10 @@ def _read_byte(self, register: int) -> int: """Read a byte register value and return it""" return self._read(register, 1)[0] - def _read(self, register: int, length: int) -> None: + def _read(self, register: int, length: int) -> bytearray: raise NotImplementedError() - def _write(self, register: int, values) -> None: + def _write(self, register: int, values: bytearray) -> None: raise NotImplementedError() @@ -471,7 +476,7 @@ def _read(self, register: int, length: int) -> bytearray: print("\t$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write(self, register: int, values: int) -> None: + def _write(self, register: int, values: ReadableBuffer) -> None: """Writes an array of 'length' bytes to the 'register'""" with self._i2c as i2c: buffer = bytearray(2 * len(values)) @@ -540,7 +545,7 @@ def __init__( debug: bool = False, *, refresh_rate: int = 10 - ): + ) -> None: from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel spi_device, ) @@ -549,7 +554,7 @@ def __init__( self._debug = debug super().__init__(refresh_rate=refresh_rate) - def _read(self, register: int, length: int): + def _read(self, register: int, length: int) -> bytearray: if register != _BME680_REG_STATUS: # _BME680_REG_STATUS exists in both SPI memory pages # For all other registers, we must set the correct memory page @@ -564,7 +569,7 @@ def _read(self, register: int, length: int): print("\t$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write(self, register: int, values: int): + def _write(self, register: int, values: ReadableBuffer) -> None: if register != _BME680_REG_STATUS: # _BME680_REG_STATUS exists in both SPI memory pages # For all other registers, we must set the correct memory page @@ -579,7 +584,7 @@ def _write(self, register: int, values: int): if self._debug: print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]])) - def _set_spi_mem_page(self, register: int): + def _set_spi_mem_page(self, register: int) -> None: spi_mem_page = 0x00 if register < 0x80: spi_mem_page = 0x10 From f3a12732115f3107deab0bd401d92bfea3b76e59 Mon Sep 17 00:00:00 2001 From: Eva Herrada <33632497+evaherrada@users.noreply.github.com> Date: Thu, 21 Apr 2022 18:53:52 -0400 Subject: [PATCH 038/115] Update .gitignore --- .gitignore | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0b009f2..544ec4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,47 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2022 Kattni Rembor, written for Adafruit Industries # -# SPDX-License-Identifier: Unlicense +# SPDX-License-Identifier: MIT +# Do not include files and directories created by your personal work environment, such as the IDE +# you use, except for those already listed here. Pull requests including changes to this file will +# not be accepted. + +# This .gitignore file contains rules for files generated by working with CircuitPython libraries, +# including building Sphinx, testing with pip, and creating a virual environment, as well as the +# MacOS and IDE-specific files generated by using MacOS in general, or the PyCharm or VSCode IDEs. + +# If you find that there are files being generated on your machine that should not be included in +# your git commit, you should create a .gitignore_global file on your computer to include the +# files created by your personal setup. To do so, follow the two steps below. + +# First, create a file called .gitignore_global somewhere convenient for you, and add rules for +# the files you want to exclude from git commits. + +# Second, configure Git to use the exclude file for all Git repositories by running the +# following via commandline, replacing "path/to/your/" with the actual path to your newly created +# .gitignore_global file: +# git config --global core.excludesfile path/to/your/.gitignore_global + +# CircuitPython-specific files +*.mpy + +# Python-specific files __pycache__ -_build *.pyc + +# Sphinx build-specific files +_build + +# This file results from running `pip -e install .` in a local repository +*.egg-info + +# Virtual environment-specific files +.env + +# MacOS-specific files +*.DS_Store + +# IDE-specific files .idea +.vscode +*~ From fdc54d9d8bc8c11d41ab46f0954fbc78d1694e9a Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Apr 2022 15:58:27 -0400 Subject: [PATCH 039/115] Patch: Replaced discord badge image --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b74bef6..2ea1738 100644 --- a/README.rst +++ b/README.rst @@ -6,7 +6,7 @@ Introduction :target: https://docs.circuitpython.org/projects/bme680/en/latest/ :alt: Documentation Status -.. image :: https://img.shields.io/discord/327254708534116352.svg +.. image:: https://github.com/adafruit/Adafruit_CircuitPython_Bundle/blob/main/badges/adafruit_discord.svg :target: https://adafru.it/discord :alt: Discord From 7e6af1dd06cce269a38383ef9ed33cd3fcb44b63 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sun, 24 Apr 2022 13:49:35 -0500 Subject: [PATCH 040/115] change discord badge --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 2ea1738..ecedf5e 100644 --- a/README.rst +++ b/README.rst @@ -6,7 +6,7 @@ Introduction :target: https://docs.circuitpython.org/projects/bme680/en/latest/ :alt: Documentation Status -.. image:: https://github.com/adafruit/Adafruit_CircuitPython_Bundle/blob/main/badges/adafruit_discord.svg +.. image:: https://raw.githubusercontent.com/adafruit/Adafruit_CircuitPython_Bundle/main/badges/adafruit_discord.svg :target: https://adafru.it/discord :alt: Discord From 757e00a8cda6316f0a7b83cbca492056d1b8f1c6 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 15 May 2022 12:13:01 -0400 Subject: [PATCH 041/115] Patch .pre-commit-config.yaml --- .pre-commit-config.yaml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7467c1d..3343606 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,40 +3,40 @@ # SPDX-License-Identifier: Unlicense repos: -- repo: https://github.com/python/black + - repo: https://github.com/python/black rev: 22.3.0 hooks: - - id: black -- repo: https://github.com/fsfe/reuse-tool - rev: v0.12.1 + - id: black + - repo: https://github.com/fsfe/reuse-tool + rev: v0.14.0 hooks: - - id: reuse -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 + - id: reuse + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.2.0 hooks: - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace -- repo: https://github.com/pycqa/pylint + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/pycqa/pylint rev: v2.11.1 hooks: - - id: pylint + - id: pylint name: pylint (library code) types: [python] args: - --disable=consider-using-f-string exclude: "^(docs/|examples/|tests/|setup.py$)" - - id: pylint + - id: pylint name: pylint (example code) description: Run pylint rules on "examples/*.py" files types: [python] files: "^examples/" args: - - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code - - id: pylint + - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code + - id: pylint name: pylint (test code) description: Run pylint rules on "tests/*.py" files types: [python] files: "^tests/" args: - - --disable=missing-docstring,consider-using-f-string,duplicate-code + - --disable=missing-docstring,consider-using-f-string,duplicate-code From 6d344f094ab10c084796ad3dd321eddc746ed28f Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:55 -0400 Subject: [PATCH 042/115] Increase min lines similarity Signed-off-by: Alec Delaney --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index cfd1c41..f006a4a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -252,7 +252,7 @@ ignore-docstrings=yes ignore-imports=yes # Minimum lines number of a similarity. -min-similarity-lines=4 +min-similarity-lines=12 [BASIC] From 648d62c8e41e488994452c7e85ae7508527ad241 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:23 -0400 Subject: [PATCH 043/115] Switch to inclusive terminology Signed-off-by: Alec Delaney --- .pylintrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pylintrc b/.pylintrc index f006a4a..f772971 100644 --- a/.pylintrc +++ b/.pylintrc @@ -9,11 +9,11 @@ # run arbitrary code extension-pkg-whitelist= -# Add files or directories to the blacklist. They should be base names, not +# Add files or directories to the ignore-list. They should be base names, not # paths. ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The +# Add files or directories matching the regex patterns to the ignore-list. The # regex matches against base names, not paths. ignore-patterns= From 5bd8212405a1a7a7e0ee44cc74579a339f67aade Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 30 May 2022 14:25:04 -0400 Subject: [PATCH 044/115] Set language to "en" for documentation Signed-off-by: Alec Delaney --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index f80566d..beaadcd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -56,7 +56,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From 0a0fe2fe93898b26dd05b778b432af0bfb8c1ac9 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 7 Jun 2022 15:34:09 -0400 Subject: [PATCH 045/115] Added cp.org link to index.rst --- docs/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 3cffe45..2f38b47 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,7 +33,8 @@ Table of Contents .. toctree:: :caption: Other Links - Download + Download from GitHub + Download Library Bundle CircuitPython Reference Documentation CircuitPython Support Forum Discord Chat From e596db9cf51e9394ab673d3b1a52282285fba567 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Thu, 23 Jun 2022 23:44:03 -0400 Subject: [PATCH 046/115] Remove setup.py, requirements.txt for pyproject.toml --- pyproject.toml | 41 ++++++++++++++++++++++++++++++++++++ requirements.txt | 6 ------ setup.py | 55 ------------------------------------------------ 3 files changed, 41 insertions(+), 61 deletions(-) create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 setup.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e0ef2d4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = [ + "setuptools", + "wheel", + "setuptools-scm", +] + +[project] +name = "adafruit-circuitpython-bme680" +description = "CircuitPython driver for BME680 sensor over I2C" +readme = "README.rst" +keywords = [ + "adafruit", + "blinka", + "circuitpython", + "micropython", + "bme680", + "hardware", + "temperature", + "pressure", + "humidity", + "gas", +] +license = {text = "MIT"} +classifiers = [ + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Embedded Systems", + "Topic :: System :: Hardware", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", +] +dependencies = [ + "Adafruit-Blinka", + "adafruit-circuitpython-busdevice ~= 5.1", +] +dynamic = ["version"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index f675e3b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: Unlicense - -Adafruit-Blinka -adafruit-circuitpython-busdevice diff --git a/setup.py b/setup.py deleted file mode 100644 index 37116a4..0000000 --- a/setup.py +++ /dev/null @@ -1,55 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages - -# To use a consistent encoding -from codecs import open -from os import path - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.rst"), encoding="utf-8") as f: - long_description = f.read() - -setup( - name="adafruit-circuitpython-bme680", - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="CircuitPython library for BME680 temperature, pressure and humidity sensor.", - long_description=long_description, - long_description_content_type="text/x-rst", - # The project's main homepage. - url="https://github.com/adafruit/Adafruit_CircuitPython_BME680", - # Author details - author="Adafruit Industries", - author_email="circuitpython@adafruit.com", - install_requires=["Adafruit-Blinka", "adafruit-circuitpython-busdevice"], - # Choose your license - license="MIT", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Libraries", - "Topic :: System :: Hardware", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - ], - # What does your project relate to? - keywords="adafruit blinka circuitpython micropython bme680 hardware temperature pressure " - "humidity gas", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - py_modules=["adafruit_bme680"], -) From 2d2630d162a15af78b171ef2c3fdf10b2d1bd71d Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:10:01 -0400 Subject: [PATCH 047/115] Use auto versioning in pyproject.toml --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index e0ef2d4..eddce91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,3 +39,5 @@ dependencies = [ "adafruit-circuitpython-busdevice ~= 5.1", ] dynamic = ["version"] + +[tool.setuptools_scm] From 7054f9660e76ff82cf90357cf0c9130322b0bfa9 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:34:53 -0400 Subject: [PATCH 048/115] Update build.yml --- .github/workflows/build.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 474520d..44ceaa4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,10 +38,9 @@ jobs: with: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - - name: Install dependencies - # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) + - name: Install repo, dependencies run: | - source actions-ci/install.sh + pip install . - name: Pip install Sphinx, pre-commit run: | pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit @@ -60,16 +59,15 @@ jobs: - name: Build docs working-directory: docs run: sphinx-build -E -W -b html . _build/html - - name: Check For setup.py + - name: Check For pyproject.toml id: need-pypi run: | - echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) + echo ::set-output name=pyproject-toml::$( find . -wholename './setup.py' ) - name: Build Python package - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | - pip install --upgrade setuptools wheel twine readme_renderer testresources - python setup.py sdist - python setup.py bdist_wheel --universal + pip install --upgrade build twine + python -m build twine check dist/* - name: Setup problem matchers uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 From e02f692268ae6483d29a8726b036633c1aa34ce8 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:45:01 -0400 Subject: [PATCH 049/115] Fix installing dependencies (temporary) --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44ceaa4..379bf54 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,13 @@ jobs: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - name: Install repo, dependencies + # This is basically a modified version of actions-ci-circuitpython-libs + # so basically that will be what changes instead of it being here run: | + sudo apt-get update + sudo apt-get install libudev-dev libusb-1.0 + sudo apt-get install -y gettext + pip install circuitpython-build-tools pip install . - name: Pip install Sphinx, pre-commit run: | From 1edb735b2b94d4c41f3a443d40dc50affdd00809 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:52:58 -0400 Subject: [PATCH 050/115] Correct file being checked for --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 379bf54..db973af 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: - name: Check For pyproject.toml id: need-pypi run: | - echo ::set-output name=pyproject-toml::$( find . -wholename './setup.py' ) + echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - name: Build Python package if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | From 069ac5a297ab08646f3cf57b02fd60c2ae59dff5 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:53:10 -0400 Subject: [PATCH 051/115] Update release.yml --- .github/workflows/release.yml | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a65e5de..7016058 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,9 +40,15 @@ jobs: with: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - - name: Install deps + - name: Install repo, dependencies + # This is basically a modified version of actions-ci-circuitpython-libs + # so basically that will be what changes instead of it being here run: | - source actions-ci/install.sh + sudo apt-get update + sudo apt-get install libudev-dev libusb-1.0 + sudo apt-get install -y gettext + pip install circuitpython-build-tools + pip install . - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - name: Upload Release Assets @@ -61,25 +67,25 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - name: Check For setup.py + - - name: Check For pyproject.toml id: need-pypi run: | - echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) + echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - name: Set up Python - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools build twine - name: Build and publish - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') env: TWINE_USERNAME: ${{ secrets.pypi_username }} TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | - python setup.py sdist + python -m build twine upload dist/* From 87c6759f910e676bed191c49f421dd3b6cadb6c1 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 00:57:51 -0400 Subject: [PATCH 052/115] Fix release.yml extra hyphen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7016058..10b2815 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,7 +67,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - - name: Check For pyproject.toml + - name: Check For pyproject.toml id: need-pypi run: | echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) From 4ba2772192656f140b0e56e2c714b745ed3fa67e Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 01:07:46 -0400 Subject: [PATCH 053/115] Force py-modules (or packages) --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index eddce91..176f3a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,3 +41,6 @@ dependencies = [ dynamic = ["version"] [tool.setuptools_scm] + +[tools.setuptools] +py-modules = ["adafruit_bme680"] From e3607f83f2d58399e63774407cf808b4a5dc9cd2 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 01:17:24 -0400 Subject: [PATCH 054/115] Fix typo in header --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 176f3a9..7d53de1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,5 +42,5 @@ dynamic = ["version"] [tool.setuptools_scm] -[tools.setuptools] +[tool.setuptools] py-modules = ["adafruit_bme680"] From 9b32e64290afb493d4d0b866285ec7f9c3f99728 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 09:40:23 -0400 Subject: [PATCH 055/115] Make release.yml build identical to build.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 10b2815..c4e0ae4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,7 +80,7 @@ jobs: if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | python -m pip install --upgrade pip - pip install setuptools build twine + pip install --upgrade build twine - name: Build and publish if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') env: From 9b3c9605186ac1064dc0a88dcbef1fe95b859059 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 24 Jun 2022 09:43:29 -0400 Subject: [PATCH 056/115] Swap tool headers --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7d53de1..9525970 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ dependencies = [ ] dynamic = ["version"] -[tool.setuptools_scm] - [tool.setuptools] py-modules = ["adafruit_bme680"] + +[tool.setuptools_scm] From 53ac03465eb03bab22d4eb1c1128cc05262728bc Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 27 Jun 2022 22:51:14 -0400 Subject: [PATCH 057/115] Read dependencies dynamically from requirements.txt --- pyproject.toml | 9 ++++----- requirements.txt | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 requirements.txt diff --git a/pyproject.toml b/pyproject.toml index 9525970..e8079d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,13 +34,12 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", ] -dependencies = [ - "Adafruit-Blinka", - "adafruit-circuitpython-busdevice ~= 5.1", -] -dynamic = ["version"] +dynamic = ["version", "dependencies"] [tool.setuptools] py-modules = ["adafruit_bme680"] +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} + [tool.setuptools_scm] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f675e3b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +Adafruit-Blinka +adafruit-circuitpython-busdevice From 53513965f2c1f18299f1cc1f4402550413062a0c Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 27 Jun 2022 22:59:14 -0400 Subject: [PATCH 058/115] Revert workflows back to using requirements.txt --- .github/workflows/build.yml | 9 ++------- .github/workflows/release.yml | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index db973af..9af99d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,14 +39,9 @@ jobs: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - name: Install repo, dependencies - # This is basically a modified version of actions-ci-circuitpython-libs - # so basically that will be what changes instead of it being here + # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | - sudo apt-get update - sudo apt-get install libudev-dev libusb-1.0 - sudo apt-get install -y gettext - pip install circuitpython-build-tools - pip install . + source actions-ci/install.sh - name: Pip install Sphinx, pre-commit run: | pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c4e0ae4..e710c8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,14 +41,9 @@ jobs: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - name: Install repo, dependencies - # This is basically a modified version of actions-ci-circuitpython-libs - # so basically that will be what changes instead of it being here + # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | - sudo apt-get update - sudo apt-get install libudev-dev libusb-1.0 - sudo apt-get install -y gettext - pip install circuitpython-build-tools - pip install . + source actions-ci/install.sh - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - name: Upload Release Assets From a4c6f226e55c39c23f9a51957e06942a25173a93 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 27 Jun 2022 23:00:13 -0400 Subject: [PATCH 059/115] Revert previous changes to dependency installation in workflows --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9af99d3..2957d4e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: with: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - - name: Install repo, dependencies + - name: Install dependencies # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) run: | source actions-ci/install.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e710c8d..530909e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,8 +40,7 @@ jobs: with: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - - name: Install repo, dependencies - # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) + - name: Install dependencies run: | source actions-ci/install.sh - name: Build assets From 5e9c802c3eff81b34336c2e652db99a2459acc79 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 27 Jun 2022 23:00:45 -0400 Subject: [PATCH 060/115] Change dependencies to deps --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 530909e..8d8218f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,7 +40,7 @@ jobs: with: repository: adafruit/actions-ci-circuitpython-libs path: actions-ci - - name: Install dependencies + - name: Install deps run: | source actions-ci/install.sh - name: Build assets From 3d13679d4d19f56b8f1915270309004086eae7ba Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Mon, 4 Jul 2022 15:36:12 -0400 Subject: [PATCH 061/115] Add authors and urls fields to pyproject.toml --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index e8079d0..c920c3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,10 @@ requires = [ name = "adafruit-circuitpython-bme680" description = "CircuitPython driver for BME680 sensor over I2C" readme = "README.rst" +authors = [ + {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} +] +urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_BME680"} keywords = [ "adafruit", "blinka", From 37a6a20fb2532ee69994f9d758b500a7b968f893 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Mon, 4 Jul 2022 15:39:56 -0400 Subject: [PATCH 062/115] Trim trailing whitespace --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c920c3d..1fd4cc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ readme = "README.rst" authors = [ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} ] -urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_BME680"} +urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_BME680"} keywords = [ "adafruit", "blinka", From 2a7780859063be17bc62c7e8a66a29309e73d659 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Thu, 21 Jul 2022 19:05:59 -0400 Subject: [PATCH 063/115] Allow __version__ population, fix problem matchers --- .github/workflows/build.yml | 7 +++++-- .github/workflows/release.yml | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2957d4e..22f6582 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,6 +47,8 @@ jobs: pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags + - name: Setup problem matchers + uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 - name: Pre-commit hooks run: | pre-commit run --all-files @@ -68,7 +70,8 @@ jobs: if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | pip install --upgrade build twine + for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do + sed -i -e "s/0.0.0-auto.0/1.2.3/" $file; + done; python -m build twine check dist/* - - name: Setup problem matchers - uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d8218f..d1b4f8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,5 +81,8 @@ jobs: TWINE_USERNAME: ${{ secrets.pypi_username }} TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | + for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do + sed -i -e "s/0.0.0-auto.0/${{github.event.release.tag_name}}/" $file; + done; python -m build twine upload dist/* From 84d4368456a20a9145648b43ca1583efe8c06c0e Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Jul 2022 13:58:36 -0400 Subject: [PATCH 064/115] Changed .env to .venv in README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ecedf5e..c2df922 100644 --- a/README.rst +++ b/README.rst @@ -47,8 +47,8 @@ To install in a virtual environment in your current project: .. code-block:: shell mkdir project-name && cd project-name - python3 -m venv .env - source .env/bin/activate + python3 -m venv .venv + source .venv/bin/activate pip3 install adafruit-circuitpython-bme680 Usage Example From e4ce154bbff691e6911d4c4978a7519c526f520e Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Fri, 22 Jul 2022 19:06:47 -0400 Subject: [PATCH 065/115] Fix pyproject.toml for dynamic __version population --- pyproject.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1fd4cc0..37652e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ requires = [ [project] name = "adafruit-circuitpython-bme680" description = "CircuitPython driver for BME680 sensor over I2C" +version = "0.0.0-auto.0" readme = "README.rst" authors = [ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} @@ -38,12 +39,10 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", ] -dynamic = ["version", "dependencies"] +dynamic = ["dependencies"] [tool.setuptools] py-modules = ["adafruit_bme680"] [tool.setuptools.dynamic] dependencies = {file = ["requirements.txt"]} - -[tool.setuptools_scm] From 6287dd166c18b89f46cb80ca6d4d8d64feafd645 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 2 Aug 2022 17:00:25 -0400 Subject: [PATCH 066/115] Added Black formatting badge --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index c2df922..d430106 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,10 @@ Introduction :target: https://github.com/adafruit/Adafruit_CircuitPython_BME680/actions/ :alt: Build Status +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code Style: Black + CircuitPython driver for BME680 sensor over I2C Dependencies From 11191e138341ad6faf6d973efb46676ec8d90167 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 8 Aug 2022 22:05:52 -0400 Subject: [PATCH 067/115] Switched to pyproject.toml --- optional_requirements.txt | 3 +++ requirements.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 optional_requirements.txt diff --git a/optional_requirements.txt b/optional_requirements.txt new file mode 100644 index 0000000..d4e27c4 --- /dev/null +++ b/optional_requirements.txt @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense diff --git a/requirements.txt b/requirements.txt index f675e3b..a45c547 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries # # SPDX-License-Identifier: Unlicense From 8ee9291c7bfef5cc4573991f39a5788e6974ae3d Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 18:09:13 -0400 Subject: [PATCH 068/115] Update version string --- adafruit_bme680.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index f4ae54a..a43ffe6 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -45,7 +45,7 @@ except ImportError: pass -__version__ = "0.0.0-auto.0" +__version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" diff --git a/pyproject.toml b/pyproject.toml index 37652e7..fa8f232 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ requires = [ [project] name = "adafruit-circuitpython-bme680" description = "CircuitPython driver for BME680 sensor over I2C" -version = "0.0.0-auto.0" +version = "0.0.0+auto.0" readme = "README.rst" authors = [ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} From 800ecd0f6b3e8fb5233c41881cbd905a41cc1cd1 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 21:09:13 -0400 Subject: [PATCH 069/115] Fix version strings in workflow files --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22f6582..cb2f60e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,7 +71,7 @@ jobs: run: | pip install --upgrade build twine for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0-auto.0/1.2.3/" $file; + sed -i -e "s/0.0.0+auto.0/1.2.3/" $file; done; python -m build twine check dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d1b4f8d..f3a0325 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,7 +82,7 @@ jobs: TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0-auto.0/${{github.event.release.tag_name}}/" $file; + sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" $file; done; python -m build twine upload dist/* From 8629457f29dbf1b213b734e0030b07deec2db84e Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 22 Aug 2022 21:36:29 -0400 Subject: [PATCH 070/115] Keep copyright up to date in documentation --- docs/conf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index beaadcd..ffdc668 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,6 +6,7 @@ import os import sys +import datetime sys.path.insert(0, os.path.abspath("..")) @@ -39,7 +40,8 @@ # General information about the project. project = "Adafruit BME680 Library" -copyright = "2017 ladyada" +current_year = str(datetime.datetime.now().year) +copyright = current_year + " ladyada" author = "ladyada" # The version info for the project you're documenting, acts as replacement for From 38d9689da0e6c4bb637b090dd220973e4d4760e8 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 23 Aug 2022 17:26:20 -0400 Subject: [PATCH 071/115] Use year duration range for copyright attribution --- docs/conf.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index ffdc668..9272579 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,8 +40,14 @@ # General information about the project. project = "Adafruit BME680 Library" +creation_year = "2017" current_year = str(datetime.datetime.now().year) -copyright = current_year + " ladyada" +year_duration = ( + current_year + if current_year == creation_year + else creation_year + " - " + current_year +) +copyright = year_duration + " ladyada" author = "ladyada" # The version info for the project you're documenting, acts as replacement for From 40b4dc4c2dd364639649d197ae7d0a703cfc7983 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 00:02:49 -0400 Subject: [PATCH 072/115] Switching to composite actions --- .github/workflows/build.yml | 67 +---------------------- .github/workflows/release.yml | 88 ------------------------------ .github/workflows/release_gh.yml | 14 +++++ .github/workflows/release_pypi.yml | 14 +++++ 4 files changed, 30 insertions(+), 153 deletions(-) delete mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/release_gh.yml create mode 100644 .github/workflows/release_pypi.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb2f60e..041a337 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,68 +10,5 @@ jobs: test: runs-on: ubuntu-latest steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Translate Repo Name For Build Tools filename_prefix - id: repo-name - run: | - echo ::set-output name=repo-name::$( - echo ${{ github.repository }} | - awk -F '\/' '{ print tolower($2) }' | - tr '_' '-' - ) - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - name: Versions - run: | - python3 --version - - name: Checkout Current Repo - uses: actions/checkout@v1 - with: - submodules: true - - name: Checkout tools repo - uses: actions/checkout@v2 - with: - repository: adafruit/actions-ci-circuitpython-libs - path: actions-ci - - name: Install dependencies - # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) - run: | - source actions-ci/install.sh - - name: Pip install Sphinx, pre-commit - run: | - pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - - name: Library version - run: git describe --dirty --always --tags - - name: Setup problem matchers - uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 - - name: Pre-commit hooks - run: | - pre-commit run --all-files - - name: Build assets - run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - - name: Archive bundles - uses: actions/upload-artifact@v2 - with: - name: bundles - path: ${{ github.workspace }}/bundles/ - - name: Build docs - working-directory: docs - run: sphinx-build -E -W -b html . _build/html - - name: Check For pyproject.toml - id: need-pypi - run: | - echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - - name: Build Python package - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - run: | - pip install --upgrade build twine - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/1.2.3/" $file; - done; - python -m build - twine check dist/* + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index f3a0325..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,88 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -name: Release Actions - -on: - release: - types: [published] - -jobs: - upload-release-assets: - runs-on: ubuntu-latest - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Translate Repo Name For Build Tools filename_prefix - id: repo-name - run: | - echo ::set-output name=repo-name::$( - echo ${{ github.repository }} | - awk -F '\/' '{ print tolower($2) }' | - tr '_' '-' - ) - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - name: Versions - run: | - python3 --version - - name: Checkout Current Repo - uses: actions/checkout@v1 - with: - submodules: true - - name: Checkout tools repo - uses: actions/checkout@v2 - with: - repository: adafruit/actions-ci-circuitpython-libs - path: actions-ci - - name: Install deps - run: | - source actions-ci/install.sh - - name: Build assets - run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - - name: Upload Release Assets - # the 'official' actions version does not yet support dynamically - # supplying asset names to upload. @csexton's version chosen based on - # discussion in the issue below, as its the simplest to implement and - # allows for selecting files with a pattern. - # https://github.com/actions/upload-release-asset/issues/4 - #uses: actions/upload-release-asset@v1.0.1 - uses: csexton/release-asset-action@master - with: - pattern: "bundles/*" - github-token: ${{ secrets.GITHUB_TOKEN }} - - upload-pypi: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Check For pyproject.toml - id: need-pypi - run: | - echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - - name: Set up Python - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: Install dependencies - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - run: | - python -m pip install --upgrade pip - pip install --upgrade build twine - - name: Build and publish - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - env: - TWINE_USERNAME: ${{ secrets.pypi_username }} - TWINE_PASSWORD: ${{ secrets.pypi_password }} - run: | - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" $file; - done; - python -m build - twine upload dist/* diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml new file mode 100644 index 0000000..041a337 --- /dev/null +++ b/.github/workflows/release_gh.yml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Build CI + +on: [pull_request, push] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml new file mode 100644 index 0000000..041a337 --- /dev/null +++ b/.github/workflows/release_pypi.yml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Build CI + +on: [pull_request, push] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main From 8f3fb49b2c321ac9d9da535df7ea1a33a91ce44a Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 00:46:59 -0400 Subject: [PATCH 073/115] Updated pylint version to 2.13.0 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3343606..4c43710 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.11.1 + rev: v2.13.0 hooks: - id: pylint name: pylint (library code) From 50f67c5818837ac1eacbeff6380477db2f7d0bc2 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 08:15:19 -0400 Subject: [PATCH 074/115] Update pylint to 2.15.5 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4c43710..0e5fccc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.13.0 + rev: v2.15.5 hooks: - id: pylint name: pylint (library code) From 7468f9db4cf7bc5c440141be919a0e12ac4c3478 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 09:12:43 -0400 Subject: [PATCH 075/115] Fix release CI files --- .github/workflows/release_gh.yml | 14 +++++++++----- .github/workflows/release_pypi.yml | 15 ++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml index 041a337..b8aa8d6 100644 --- a/.github/workflows/release_gh.yml +++ b/.github/workflows/release_gh.yml @@ -2,13 +2,17 @@ # # SPDX-License-Identifier: MIT -name: Build CI +name: GitHub Release Actions -on: [pull_request, push] +on: + release: + types: [published] jobs: - test: + upload-release-assets: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: adafruit/workflows-circuitpython-libs/build@main + - name: Run GitHub Release CI workflow + uses: adafruit/workflows-circuitpython-libs/release-gh@main + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml index 041a337..65775b7 100644 --- a/.github/workflows/release_pypi.yml +++ b/.github/workflows/release_pypi.yml @@ -2,13 +2,18 @@ # # SPDX-License-Identifier: MIT -name: Build CI +name: PyPI Release Actions -on: [pull_request, push] +on: + release: + types: [published] jobs: - test: + upload-release-assets: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: adafruit/workflows-circuitpython-libs/build@main + - name: Run PyPI Release CI workflow + uses: adafruit/workflows-circuitpython-libs/release-pypi@main + with: + pypi-username: ${{ secrets.pypi_username }} + pypi-password: ${{ secrets.pypi_password }} From aeeba8a767f5456e3bf30ac005a936c44bd00fde Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 18:34:32 -0400 Subject: [PATCH 076/115] Update .pylintrc for v2.15.5 --- .pylintrc | 45 ++++----------------------------------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/.pylintrc b/.pylintrc index f772971..40208c3 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries # # SPDX-License-Identifier: Unlicense @@ -26,7 +26,7 @@ jobs=1 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. -load-plugins= +load-plugins=pylint.extensions.no_self_use # Pickle collected data for later comparisons. persistent=yes @@ -54,8 +54,8 @@ confidence= # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call -disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation,unspecified-encoding +# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call +disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -225,12 +225,6 @@ max-line-length=100 # Maximum number of lines in a module max-module-lines=1000 -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma,dict-separator - # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no @@ -257,38 +251,22 @@ min-similarity-lines=12 [BASIC] -# Naming hint for argument names -argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct argument names argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -# Naming hint for attribute names -attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct attribute names attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ -# Naming hint for class names -# class-name-hint=[A-Z_][a-zA-Z0-9]+$ -class-name-hint=[A-Z_][a-zA-Z0-9_]+$ - # Regular expression matching correct class names # class-rgx=[A-Z_][a-zA-Z0-9]+$ class-rgx=[A-Z_][a-zA-Z0-9_]+$ -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ @@ -296,9 +274,6 @@ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # ones are exempt. docstring-min-length=-1 -# Naming hint for function names -function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct function names function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ @@ -309,21 +284,12 @@ good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_ # Include a hint for the correct naming format with invalid-name include-naming-hint=no -# Naming hint for inline iteration names -inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ - # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ -# Naming hint for method names -method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct method names method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -# Naming hint for module names -module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ @@ -339,9 +305,6 @@ no-docstring-rgx=^_ # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty -# Naming hint for variable names -variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct variable names variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ From 9da16da05239662ef843d0bf0e4cefdccf76526b Mon Sep 17 00:00:00 2001 From: dherrada Date: Fri, 18 Nov 2022 13:05:21 -0500 Subject: [PATCH 077/115] Added commented out board.STEMMA_I2C with explanation --- examples/bme680_simpletest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index 5c1849e..ff77675 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -7,6 +7,7 @@ # Create sensor object, communicating over the board's default I2C bus i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug=False) # change this to match the location's pressure (hPa) at sea level From 84f91666ffa4330bdcc26eca906b79fa94a3d824 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Thu, 1 Sep 2022 20:16:31 -0400 Subject: [PATCH 078/115] Add .venv to .gitignore Signed-off-by: Alec Delaney <89490472+tekktrik@users.noreply.github.com> --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 544ec4a..db3d538 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ _build # Virtual environment-specific files .env +.venv # MacOS-specific files *.DS_Store From ae1a338f64ac196bcb549f310f187ba35e9bd704 Mon Sep 17 00:00:00 2001 From: patcher-ms <113395549+patcher-ms@users.noreply.github.com> Date: Wed, 14 Dec 2022 23:52:21 +0000 Subject: [PATCH 079/115] Use correct value to compute gas resistance This code is supposed to be a 1:1 translation from Bosch C library https://github.com/boschsensortec/BME68x-Sensor-API/blob/6dab330cb5727006d5046f9eebf357f8909c0ef6/bme68x.c#L971. There they do: ```C /* multiplying 10000 then dividing then multiplying by 100 instead of multiplying by 1000000 to prevent overflow */ calc_gas_res = (UINT32_C(10000) * var1) / (uint32_t)var2; calc_gas_res = calc_gas_res * 100; ``` With the current code resistance is off by a factor of 10 --- adafruit_bme680.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index a43ffe6..81cd738 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -312,7 +312,7 @@ def gas(self) -> int: var2 = self._adc_gas - 512 var2 *= 3 var2 = 4096 + var2 - calc_gas_res = (1000 * var1) / var2 + calc_gas_res = (10000 * var1) / var2 calc_gas_res = calc_gas_res * 100 else: var1 = ( From fc01ef0d312b7d6b524c7fbc078b2c5cd717e48f Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Thu, 19 Jan 2023 23:39:55 -0500 Subject: [PATCH 080/115] Add upload url to release action Signed-off-by: Alec Delaney <89490472+tekktrik@users.noreply.github.com> --- .github/workflows/release_gh.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml index b8aa8d6..9acec60 100644 --- a/.github/workflows/release_gh.yml +++ b/.github/workflows/release_gh.yml @@ -16,3 +16,4 @@ jobs: uses: adafruit/workflows-circuitpython-libs/release-gh@main with: github-token: ${{ secrets.GITHUB_TOKEN }} + upload-url: ${{ github.event.release.upload_url }} From 76e7e0adbfb375bfee1dc350273928acea6fef5e Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sat, 4 Feb 2023 13:13:29 -0500 Subject: [PATCH 081/115] Add optional dependencies to pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fa8f232..2092d51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,10 +39,11 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", ] -dynamic = ["dependencies"] +dynamic = ["dependencies", "optional-dependencies"] [tool.setuptools] py-modules = ["adafruit_bme680"] [tool.setuptools.dynamic] dependencies = {file = ["requirements.txt"]} +optional-dependencies = {optional = {file = ["optional_requirements.txt"]}} From 0cda97724c774384e3bcf1324e6ba6a996eaeb62 Mon Sep 17 00:00:00 2001 From: William Garber Date: Wed, 15 Mar 2023 21:28:13 -0700 Subject: [PATCH 082/115] Added set_gas_heater() which was previously available for arduino but not CircuitPython. --- adafruit_bme680.py | 282 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 281 insertions(+), 1 deletion(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index a43ffe6..b162fe0 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -1,6 +1,45 @@ # SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries # # SPDX-License-Identifier: MIT +# garberw added begin =========================== +# +# BOSCH LICENSE +# +# Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved. +# +# BSD-3-Clause +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# @file bme68x_defs.h +# @date 2021-05-24 +# @version v4.4.6 +# garberw added end =========================== # We have a lot of attributes for this complex sensor. # pylint: disable=too-many-instance-attributes @@ -14,6 +53,10 @@ * Author(s): Limor Fried + +original Adafruit_BME680 with addition of set_gas_heater(). Other new members are private. + + Implementation Notes -------------------- @@ -33,6 +76,11 @@ import math from micropython import const + +def delay_microseconds(nusec): + """fixme must be same as dev->delay_us""" + time.sleep(nusec / 1000000.0) + try: # Used only for type annotations. @@ -45,10 +93,34 @@ except ImportError: pass -__version__ = "0.0.0+auto.0" +__version__ = "3.4.12" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" +# garberw added begin =========================== +# I2C ADDRESS/BITS/SETTINGS NEW +# ----------------------------------------------------------------------- +_BME68X_ENABLE_HEATER = const(0x00) +_BME68X_DISABLE_HEATER = const(0x01) +_BME68X_DISABLE_GAS_MEAS = const(0x00) +_BME68X_ENABLE_GAS_MEAS_L = const(0x01) +_BME68X_ENABLE_GAS_MEAS_H = const(0x02) +_BME68X_SLEEP_MODE = const(0) +_BME68X_FORCED_MODE = const(1) +_BME68X_VARIANT_GAS_LOW = const(0x00) +_BME68X_VARIANT_GAS_HIGH = const(0x01) +_BME68X_HCTRL_MSK = const(0x08) +_BME68X_HCTRL_POS = const(3) +_BME68X_NBCONV_MSK = const(0x0f) +_BME68X_RUN_GAS_MSK = const(0x30) +_BME68X_RUN_GAS_POS = const(4) +_BME68X_MODE_MSK = const(0x03) +_BME68X_PERIOD_POLL = const(10000) +_BME68X_REG_CTRL_GAS_0 = const(0x70) +_BME68X_REG_CTRL_GAS_1 = const(0x71) + + +# garberw added end =========================== # I2C ADDRESS/BITS/SETTINGS # ----------------------------------------------------------------------- _BME680_CHIPID = const(0x61) @@ -116,6 +188,41 @@ ) +# garberw added begin =========================== +INT32 = int +INT16 = int +INT8 = int +UINT32 = int +UINT16 = int +UINT8 = int + + +def bme_set_bits(reg_data, bitname_msk, bitname_pos, data): + """ + Macro to set bits + data2 = data << bitname_pos + set masked bits from data2 in reg_data + """ + return (reg_data & ~bitname_msk) | ((data << bitname_pos) & bitname_msk) + +def bme_set_bits_pos_0(reg_data, bitname_msk, data): + """ + Macro to set bits starting from position 0 + set masked bits from data in reg_data + """ + return (reg_data & ~bitname_msk) | (data & bitname_msk) + + +class GasHeaterException(Exception): + """ + Error during set_gas_heater() + """ + def __init__(self, msg = "GasHeaterException default"): + self.msg = msg + super().__init__(msg) + + +# garberw added end =========================== def _read24(arr: ReadableBuffer) -> float: """Parse an unsigned 24-bit value as a floating point and return it.""" ret = 0.0 @@ -171,6 +278,11 @@ def __init__(self, *, refresh_rate: int = 10) -> None: self._last_reading = 0 self._min_refresh_time = 1 / refresh_rate + # garberw added begin =========================== + self._amb_temp = 25 # Copy required parameters from reference bme68x_dev struct + self.set_gas_heater(320, 150) # heater 320 deg C for 150 msec + + # garberw added end =========================== @property def pressure_oversample(self) -> int: """The oversampling for pressure sensor""" @@ -403,6 +515,174 @@ def _read(self, register: int, length: int) -> bytearray: def _write(self, register: int, values: bytearray) -> None: raise NotImplementedError() + # garberw added begin =========================== + def set_gas_heater(self, heater_temp: UINT16, heater_time: UINT16) -> bool: + """ + * @brief Enable and configure gas reading + heater + * @param heater_temp + * Desired temperature in degrees Centigrade + * @param heater_time + * Time to keep heater on in milliseconds + * @return True on success, False on failure + """ + if (heater_temp == 0) or (heater_time == 0): + return False + # enable = BME68X_ENABLE + try: + self._set_heatr_conf(heater_temp, heater_time) + except GasHeaterException: + return False + return True + + def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: + # restrict to BME68X_FORCED_MODE + op_mode: UINT8 = _BME68X_FORCED_MODE + # restrict to enable = True + enable: bool = True + nb_conv: UINT8 = 0 + hctrl: UINT8 = _BME68X_ENABLE_HEATER + run_gas: UINT8 = 0 + ctrl_gas_data_0: UINT8 = 0 + ctrl_gas_data_1: UINT8 = 0 + ctrl_gas_addr_0: UINT8 = _BME68X_REG_CTRL_GAS_0 + ctrl_gas_addr_1: UINT8 = _BME68X_REG_CTRL_GAS_1 + try: + self._set_op_mode(_BME68X_SLEEP_MODE) + self._set_conf(heater_temp, heater_time, op_mode) + ctrl_gas_data_0 = self._read_byte(ctrl_gas_addr_0) + ctrl_gas_data_1 = self._read_byte(ctrl_gas_addr_1) + if enable: + hctrl = _BME68X_ENABLE_HEATER + if self._chip_variant == _BME68X_VARIANT_GAS_HIGH: + run_gas = _BME68X_ENABLE_GAS_MEAS_H + else: + run_gas = _BME68X_ENABLE_GAS_MEAS_L + else: + hctrl = _BME68X_DISABLE_HEATER + run_gas = _BME68X_DISABLE_GAS_MEAS + + ctrl_gas_data_0 = bme_set_bits(ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, + hctrl) + ctrl_gas_data_1 = bme_set_bits_pos_0(ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv) + ctrl_gas_data_1 = bme_set_bits(ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, + _BME68X_RUN_GAS_POS, run_gas) + self._write(ctrl_gas_addr_0, [ ctrl_gas_data_0 ]) + self._write(ctrl_gas_addr_1, [ ctrl_gas_data_1 ]) + # fixme check this + self._set_op_mode(_BME68X_FORCED_MODE) + except GasHeaterException as exc: + self._set_op_mode(_BME68X_FORCED_MODE) + raise exc + + def _set_op_mode(self, op_mode: UINT8) -> None: + """ + * @brief This API is used to set the operation mode of the sensor + """ + tmp_pow_mode: UINT8 = 0 + pow_mode: UINT8 = _BME68X_FORCED_MODE + reg_addr: UINT8 = _BME680_REG_CTRL_MEAS + # Call until in sleep + try: + # was a do {} while() loop + while pow_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode = self._read_byte(_BME680_REG_CTRL_MEAS) + # Put to sleep before changing mode + pow_mode = (tmp_pow_mode & _BME68X_MODE_MSK) + if pow_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode &= ~_BME68X_MODE_MSK # Set to sleep + self._write(reg_addr, [ tmp_pow_mode ]) + # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # fixme + delay_microseconds(_BME68X_PERIOD_POLL) + # Already in sleep + if op_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | (op_mode & _BME68X_MODE_MSK) + self._write(reg_addr, [ tmp_pow_mode ]) + except GasHeaterException as exc: + raise exc + + def _set_conf(self, heater_temp: UINT16, heater_time: UINT16, op_mode: UINT8) -> None: + """ + This internal API is used to set heater configurations + """ + try: + if op_mode != _BME68X_FORCED_MODE: + raise GasHeaterException("_set_conf not forced mode") + rh_reg_addr: UINT8 = _BME680_BME680_RES_HEAT_0 + rh_reg_data: UINT8 = self._calc_res_heat(heater_temp) + gw_reg_addr: UINT8 = _BME680_BME680_GAS_WAIT_0 + gw_reg_data: UINT8 = self._calc_gas_wait(heater_time) + self._write(rh_reg_addr, [ rh_reg_data ]) + self._write(gw_reg_addr, [ gw_reg_data ]) + except GasHeaterException as exc: + raise exc + + def _calc_res_heat(self, temp: UINT16) -> UINT8: + """ + This internal API is used to calculate the heater resistance value using float + """ + gh1: INT8 = self._gas_calibration[0] + gh2: INT16 = self._gas_calibration[1] + gh3: INT8 = self._gas_calibration[2] + htr: UINT8 = self._heat_range + htv: INT8 = self._heat_val + amb: UINT8 = self._amb_temp + + if temp > 400: # Cap temperature + temp = 400 + + var1: INT32 = ((INT32(amb) * gh3) / 1000) * 256 + var2: INT32 = (gh1 + 784) * (((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10) + var3: INT32 = var1 + (var2 / 2) + var4: INT32 = (var3 / (htr + 4)) + var5: INT32 = (131 * htv) + 65536 + heatr_res_x100: INT32 = INT32(((var4 / var5) - 250) * 34) + heatr_res: UINT8 = UINT8((heatr_res_x100 + 50) / 100) + + return heatr_res + + def _calc_res_heat(self, temp: UINT16) -> UINT8: + """ + This internal API is used to calculate the heater resistance value + """ + gh1: float = float(self._gas_calibration[0]) + gh2: float = float(self._gas_calibration[1]) + gh3: float = float(self._gas_calibration[2]) + htr: float = float(self._heat_range) + htv: float = float(self._heat_val) + amb: float = float(self._amb_temp) + + if temp > 400: # Cap temperature + temp = 400 + + var1: float = ((gh1 / (16.0)) + 49.0) + var2: float = (((gh2 / (32768.0)) * (0.0005)) + 0.00235) + var3: float = (gh3 / (1024.0)) + var4: float = (var1 * (1.0 + (var2 * float(temp)))) + var5: float = (var4 + (var3 * amb)) + res_heat: UINT8 = UINT8(3.4 * ( + (var5 * + (4 / (4 + htr)) * + (1 / (1 + (htv * 0.002))) + ) + - 25)) + return res_heat + + def _calc_gas_wait(self, dur: UINT16) -> UINT8: + """ + This internal API is used to calculate the gas wait + """ + factor: UINT8 = 0 + durval: UINT8 = 0xff # Max duration + + if dur < 0xfc0: + return durval + while dur > 0x3F: + dur = dur / 4 + factor += 1 + durval = UINT8(dur + (factor * 64)) + return durval + # garberw added end =========================== + class Adafruit_BME680_I2C(Adafruit_BME680): """Driver for I2C connected BME680. From 3ca336e4464f1e5b747ef45f6984d0aab0cfa60f Mon Sep 17 00:00:00 2001 From: William Garber Date: Wed, 15 Mar 2023 22:09:24 -0700 Subject: [PATCH 083/115] added name to contributors. --- contributors.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 contributors.md diff --git a/contributors.md b/contributors.md new file mode 100644 index 0000000..8ae6676 --- /dev/null +++ b/contributors.md @@ -0,0 +1,6 @@ + +Contributors to Adafruit_CircuitPython_BME680_modified +============================================================= + +William Garber + From a2b2414b1c774aed1dc221e7805224997caf111d Mon Sep 17 00:00:00 2001 From: William Garber Date: Wed, 15 Mar 2023 22:41:25 -0700 Subject: [PATCH 084/115] fixed mistakes found by lint on pull request. --- adafruit_bme680.py | 13 ++++++------- contributors.md | 7 ++++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index b162fe0..3185bfd 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries # # SPDX-License-Identifier: MIT + # garberw added begin =========================== # # BOSCH LICENSE @@ -78,7 +79,7 @@ def delay_microseconds(nusec): - """fixme must be same as dev->delay_us""" + """HELP must be same as dev->delay_us""" time.sleep(nusec / 1000000.0) try: @@ -568,7 +569,7 @@ def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: _BME68X_RUN_GAS_POS, run_gas) self._write(ctrl_gas_addr_0, [ ctrl_gas_data_0 ]) self._write(ctrl_gas_addr_1, [ ctrl_gas_data_1 ]) - # fixme check this + # HELP check this self._set_op_mode(_BME68X_FORCED_MODE) except GasHeaterException as exc: self._set_op_mode(_BME68X_FORCED_MODE) @@ -591,7 +592,7 @@ def _set_op_mode(self, op_mode: UINT8) -> None: if pow_mode != _BME68X_SLEEP_MODE: tmp_pow_mode &= ~_BME68X_MODE_MSK # Set to sleep self._write(reg_addr, [ tmp_pow_mode ]) - # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # fixme + # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # HELP delay_microseconds(_BME68X_PERIOD_POLL) # Already in sleep if op_mode != _BME68X_SLEEP_MODE: @@ -627,8 +628,7 @@ def _calc_res_heat(self, temp: UINT16) -> UINT8: htv: INT8 = self._heat_val amb: UINT8 = self._amb_temp - if temp > 400: # Cap temperature - temp = 400 + temp = min(temp, 400) # Cap temperature var1: INT32 = ((INT32(amb) * gh3) / 1000) * 256 var2: INT32 = (gh1 + 784) * (((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10) @@ -651,8 +651,7 @@ def _calc_res_heat(self, temp: UINT16) -> UINT8: htv: float = float(self._heat_val) amb: float = float(self._amb_temp) - if temp > 400: # Cap temperature - temp = 400 + temp = min(temp, 400) # Cap temperature var1: float = ((gh1 / (16.0)) + 49.0) var2: float = (((gh2 / (32768.0)) * (0.0005)) + 0.00235) diff --git a/contributors.md b/contributors.md index 8ae6676..c5f9f88 100644 --- a/contributors.md +++ b/contributors.md @@ -1,6 +1,11 @@ +# SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT Contributors to Adafruit_CircuitPython_BME680_modified ============================================================= -William Garber +Limor (Ladyada) Fried +William Garber +many others From c31b1f60665dde7e54488bc150d0db7d97c60bd2 Mon Sep 17 00:00:00 2001 From: William Garber Date: Thu, 16 Mar 2023 00:25:01 -0700 Subject: [PATCH 085/115] trying to get checker to accept pull request --- adafruit_bme680.py | 90 ++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 3185bfd..fc2f087 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -44,6 +44,8 @@ # We have a lot of attributes for this complex sensor. # pylint: disable=too-many-instance-attributes +# pylint: disable=no_self_use +# pylint: disable=consider-using-f-string """ `adafruit_bme680` @@ -82,6 +84,7 @@ def delay_microseconds(nusec): """HELP must be same as dev->delay_us""" time.sleep(nusec / 1000000.0) + try: # Used only for type annotations. @@ -112,7 +115,7 @@ def delay_microseconds(nusec): _BME68X_VARIANT_GAS_HIGH = const(0x01) _BME68X_HCTRL_MSK = const(0x08) _BME68X_HCTRL_POS = const(3) -_BME68X_NBCONV_MSK = const(0x0f) +_BME68X_NBCONV_MSK = const(0x0F) _BME68X_RUN_GAS_MSK = const(0x30) _BME68X_RUN_GAS_POS = const(4) _BME68X_MODE_MSK = const(0x03) @@ -206,6 +209,7 @@ def bme_set_bits(reg_data, bitname_msk, bitname_pos, data): """ return (reg_data & ~bitname_msk) | ((data << bitname_pos) & bitname_msk) + def bme_set_bits_pos_0(reg_data, bitname_msk, data): """ Macro to set bits starting from position 0 @@ -218,7 +222,8 @@ class GasHeaterException(Exception): """ Error during set_gas_heater() """ - def __init__(self, msg = "GasHeaterException default"): + + def __init__(self, msg="GasHeaterException default"): self.msg = msg super().__init__(msg) @@ -281,9 +286,10 @@ def __init__(self, *, refresh_rate: int = 10) -> None: # garberw added begin =========================== self._amb_temp = 25 # Copy required parameters from reference bme68x_dev struct - self.set_gas_heater(320, 150) # heater 320 deg C for 150 msec + self.set_gas_heater(320, 150) # heater 320 deg C for 150 msec # garberw added end =========================== + @property def pressure_oversample(self) -> int: """The oversampling for pressure sensor""" @@ -562,13 +568,17 @@ def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: hctrl = _BME68X_DISABLE_HEATER run_gas = _BME68X_DISABLE_GAS_MEAS - ctrl_gas_data_0 = bme_set_bits(ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, - hctrl) - ctrl_gas_data_1 = bme_set_bits_pos_0(ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv) - ctrl_gas_data_1 = bme_set_bits(ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, - _BME68X_RUN_GAS_POS, run_gas) - self._write(ctrl_gas_addr_0, [ ctrl_gas_data_0 ]) - self._write(ctrl_gas_addr_1, [ ctrl_gas_data_1 ]) + ctrl_gas_data_0 = bme_set_bits( + ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl + ) + ctrl_gas_data_1 = bme_set_bits_pos_0( + ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv + ) + ctrl_gas_data_1 = bme_set_bits( + ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas + ) + self._write(ctrl_gas_addr_0, [ctrl_gas_data_0]) + self._write(ctrl_gas_addr_1, [ctrl_gas_data_1]) # HELP check this self._set_op_mode(_BME68X_FORCED_MODE) except GasHeaterException as exc: @@ -588,20 +598,24 @@ def _set_op_mode(self, op_mode: UINT8) -> None: while pow_mode != _BME68X_SLEEP_MODE: tmp_pow_mode = self._read_byte(_BME680_REG_CTRL_MEAS) # Put to sleep before changing mode - pow_mode = (tmp_pow_mode & _BME68X_MODE_MSK) + pow_mode = tmp_pow_mode & _BME68X_MODE_MSK if pow_mode != _BME68X_SLEEP_MODE: tmp_pow_mode &= ~_BME68X_MODE_MSK # Set to sleep - self._write(reg_addr, [ tmp_pow_mode ]) + self._write(reg_addr, [tmp_pow_mode]) # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # HELP delay_microseconds(_BME68X_PERIOD_POLL) # Already in sleep if op_mode != _BME68X_SLEEP_MODE: - tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | (op_mode & _BME68X_MODE_MSK) - self._write(reg_addr, [ tmp_pow_mode ]) + tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | ( + op_mode & _BME68X_MODE_MSK + ) + self._write(reg_addr, [tmp_pow_mode]) except GasHeaterException as exc: raise exc - def _set_conf(self, heater_temp: UINT16, heater_time: UINT16, op_mode: UINT8) -> None: + def _set_conf( + self, heater_temp: UINT16, heater_time: UINT16, op_mode: UINT8 + ) -> None: """ This internal API is used to set heater configurations """ @@ -612,8 +626,8 @@ def _set_conf(self, heater_temp: UINT16, heater_time: UINT16, op_mode: UINT8) -> rh_reg_data: UINT8 = self._calc_res_heat(heater_temp) gw_reg_addr: UINT8 = _BME680_BME680_GAS_WAIT_0 gw_reg_data: UINT8 = self._calc_gas_wait(heater_time) - self._write(rh_reg_addr, [ rh_reg_data ]) - self._write(gw_reg_addr, [ gw_reg_data ]) + self._write(rh_reg_addr, [rh_reg_data]) + self._write(gw_reg_addr, [gw_reg_data]) except GasHeaterException as exc: raise exc @@ -621,19 +635,21 @@ def _calc_res_heat(self, temp: UINT16) -> UINT8: """ This internal API is used to calculate the heater resistance value using float """ - gh1: INT8 = self._gas_calibration[0] + gh1: INT8 = self._gas_calibration[0] gh2: INT16 = self._gas_calibration[1] - gh3: INT8 = self._gas_calibration[2] + gh3: INT8 = self._gas_calibration[2] htr: UINT8 = self._heat_range - htv: INT8 = self._heat_val + htv: INT8 = self._heat_val amb: UINT8 = self._amb_temp - temp = min(temp, 400) # Cap temperature + temp = min(temp, 400) # Cap temperature var1: INT32 = ((INT32(amb) * gh3) / 1000) * 256 - var2: INT32 = (gh1 + 784) * (((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10) + var2: INT32 = (gh1 + 784) * ( + ((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10 + ) var3: INT32 = var1 + (var2 / 2) - var4: INT32 = (var3 / (htr + 4)) + var4: INT32 = var3 / (htr + 4) var5: INT32 = (131 * htv) + 65536 heatr_res_x100: INT32 = INT32(((var4 / var5) - 250) * 34) heatr_res: UINT8 = UINT8((heatr_res_x100 + 50) / 100) @@ -651,19 +667,16 @@ def _calc_res_heat(self, temp: UINT16) -> UINT8: htv: float = float(self._heat_val) amb: float = float(self._amb_temp) - temp = min(temp, 400) # Cap temperature - - var1: float = ((gh1 / (16.0)) + 49.0) - var2: float = (((gh2 / (32768.0)) * (0.0005)) + 0.00235) - var3: float = (gh3 / (1024.0)) - var4: float = (var1 * (1.0 + (var2 * float(temp)))) - var5: float = (var4 + (var3 * amb)) - res_heat: UINT8 = UINT8(3.4 * ( - (var5 * - (4 / (4 + htr)) * - (1 / (1 + (htv * 0.002))) - ) - - 25)) + temp = min(temp, 400) # Cap temperature + + var1: float = (gh1 / (16.0)) + 49.0 + var2: float = ((gh2 / (32768.0)) * (0.0005)) + 0.00235 + var3: float = gh3 / (1024.0) + var4: float = var1 * (1.0 + (var2 * float(temp))) + var5: float = var4 + (var3 * amb) + res_heat: UINT8 = UINT8( + 3.4 * ((var5 * (4 / (4 + htr)) * (1 / (1 + (htv * 0.002)))) - 25) + ) return res_heat def _calc_gas_wait(self, dur: UINT16) -> UINT8: @@ -671,15 +684,16 @@ def _calc_gas_wait(self, dur: UINT16) -> UINT8: This internal API is used to calculate the gas wait """ factor: UINT8 = 0 - durval: UINT8 = 0xff # Max duration + durval: UINT8 = 0xFF # Max duration - if dur < 0xfc0: + if dur < 0xFC0: return durval while dur > 0x3F: dur = dur / 4 factor += 1 durval = UINT8(dur + (factor * 64)) return durval + # garberw added end =========================== From 8a2e5c03069be6a2d533899c748d99db511a019e Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Tue, 9 May 2023 20:26:25 -0400 Subject: [PATCH 086/115] Update pre-commit hooks Signed-off-by: Tekktrik --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e5fccc..70ade69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,21 +4,21 @@ repos: - repo: https://github.com/python/black - rev: 22.3.0 + rev: 23.3.0 hooks: - id: black - repo: https://github.com/fsfe/reuse-tool - rev: v0.14.0 + rev: v1.1.2 hooks: - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v4.4.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.15.5 + rev: v2.17.4 hooks: - id: pylint name: pylint (library code) From d02eaf52c822a1d3ac5d647003fe100a4d3a4234 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Tue, 23 May 2023 22:18:46 -0400 Subject: [PATCH 087/115] Update .pylintrc, fix jQuery for docs --- .pylintrc | 2 +- docs/conf.py | 1 + docs/requirements.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 40208c3..f945e92 100644 --- a/.pylintrc +++ b/.pylintrc @@ -396,4 +396,4 @@ min-public-methods=1 # Exceptions that will emit a warning when being caught. Defaults to # "Exception" -overgeneral-exceptions=Exception +overgeneral-exceptions=builtins.Exception diff --git a/docs/conf.py b/docs/conf.py index 9272579..5bc3cc8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,7 @@ # ones. extensions = [ "sphinx.ext.autodoc", + "sphinxcontrib.jquery", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", ] diff --git a/docs/requirements.txt b/docs/requirements.txt index 88e6733..797aa04 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,3 +3,4 @@ # SPDX-License-Identifier: Unlicense sphinx>=4.0.0 +sphinxcontrib-jquery From 72dfc381cbbb6e20be901fec1a20b1a7dac24414 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 5 Jun 2023 15:45:24 -0500 Subject: [PATCH 088/115] seperate bsd-3-clause to it's own file --- LICENSES/BSD-3-Clause.txt | 36 ++++++++++++++++++++++++++++++++ adafruit_bme680.py | 44 ++------------------------------------- 2 files changed, 38 insertions(+), 42 deletions(-) create mode 100644 LICENSES/BSD-3-Clause.txt diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..d06aa07 --- /dev/null +++ b/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,36 @@ +BOSCH LICENSE + +Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved. + +BSD-3-Clause + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +@file bme68x_defs.h +@date 2021-05-24 +@version v4.4.6 diff --git a/adafruit_bme680.py b/adafruit_bme680.py index fc2f087..8867584 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -1,46 +1,6 @@ # SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries # -# SPDX-License-Identifier: MIT - -# garberw added begin =========================== -# -# BOSCH LICENSE -# -# Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved. -# -# BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# @file bme68x_defs.h -# @date 2021-05-24 -# @version v4.4.6 -# garberw added end =========================== +# SPDX-License-Identifier: MIT AND BSD-3-Clause # We have a lot of attributes for this complex sensor. # pylint: disable=too-many-instance-attributes @@ -97,7 +57,7 @@ def delay_microseconds(nusec): except ImportError: pass -__version__ = "3.4.12" +__version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" From 4b4818c681de174070d7c48b1972ef81d64637ab Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 12 Jun 2023 09:36:51 -0500 Subject: [PATCH 089/115] feedback from pr61 --- LICENSES/BSD-3-Clause.txt | 4 - adafruit_bme680.py | 184 ++++++++++++++------------------------ contributors.md | 11 --- 3 files changed, 68 insertions(+), 131 deletions(-) delete mode 100644 contributors.md diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt index d06aa07..c2c2cf2 100644 --- a/LICENSES/BSD-3-Clause.txt +++ b/LICENSES/BSD-3-Clause.txt @@ -30,7 +30,3 @@ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -@file bme68x_defs.h -@date 2021-05-24 -@version v4.4.6 diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 8867584..b16874e 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -5,7 +5,6 @@ # We have a lot of attributes for this complex sensor. # pylint: disable=too-many-instance-attributes # pylint: disable=no_self_use -# pylint: disable=consider-using-f-string """ `adafruit_bme680` @@ -14,10 +13,7 @@ CircuitPython library for BME680 temperature, pressure and humidity sensor. -* Author(s): Limor Fried - - -original Adafruit_BME680 with addition of set_gas_heater(). Other new members are private. +* Author(s): Limor Fried, William Garber, many others Implementation Notes @@ -61,7 +57,6 @@ def delay_microseconds(nusec): __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git" -# garberw added begin =========================== # I2C ADDRESS/BITS/SETTINGS NEW # ----------------------------------------------------------------------- _BME68X_ENABLE_HEATER = const(0x00) @@ -83,8 +78,6 @@ def delay_microseconds(nusec): _BME68X_REG_CTRL_GAS_0 = const(0x70) _BME68X_REG_CTRL_GAS_1 = const(0x71) - -# garberw added end =========================== # I2C ADDRESS/BITS/SETTINGS # ----------------------------------------------------------------------- _BME680_CHIPID = const(0x61) @@ -152,15 +145,6 @@ def delay_microseconds(nusec): ) -# garberw added begin =========================== -INT32 = int -INT16 = int -INT8 = int -UINT32 = int -UINT16 = int -UINT8 = int - - def bme_set_bits(reg_data, bitname_msk, bitname_pos, data): """ Macro to set bits @@ -178,17 +162,6 @@ def bme_set_bits_pos_0(reg_data, bitname_msk, data): return (reg_data & ~bitname_msk) | (data & bitname_msk) -class GasHeaterException(Exception): - """ - Error during set_gas_heater() - """ - - def __init__(self, msg="GasHeaterException default"): - self.msg = msg - super().__init__(msg) - - -# garberw added end =========================== def _read24(arr: ReadableBuffer) -> float: """Parse an unsigned 24-bit value as a floating point and return it.""" ret = 0.0 @@ -244,12 +217,9 @@ def __init__(self, *, refresh_rate: int = 10) -> None: self._last_reading = 0 self._min_refresh_time = 1 / refresh_rate - # garberw added begin =========================== self._amb_temp = 25 # Copy required parameters from reference bme68x_dev struct self.set_gas_heater(320, 150) # heater 320 deg C for 150 msec - # garberw added end =========================== - @property def pressure_oversample(self) -> int: """The oversampling for pressure sensor""" @@ -482,42 +452,37 @@ def _read(self, register: int, length: int) -> bytearray: def _write(self, register: int, values: bytearray) -> None: raise NotImplementedError() - # garberw added begin =========================== - def set_gas_heater(self, heater_temp: UINT16, heater_time: UINT16) -> bool: + def set_gas_heater(self, heater_temp: int, heater_time: int) -> bool: """ - * @brief Enable and configure gas reading + heater - * @param heater_temp - * Desired temperature in degrees Centigrade - * @param heater_time - * Time to keep heater on in milliseconds - * @return True on success, False on failure + Enable and configure gas reading + heater + :param heater_temp: Desired temperature in degrees Centigrade + :param heater_time: Time to keep heater on in milliseconds + :return: True on success, False on failure """ - if (heater_temp == 0) or (heater_time == 0): + if not heater_temp or not heater_time: return False # enable = BME68X_ENABLE try: self._set_heatr_conf(heater_temp, heater_time) - except GasHeaterException: + except OSError: return False return True - def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: + def _set_heatr_conf(self, heater_temp: int, heater_time: int) -> None: # restrict to BME68X_FORCED_MODE - op_mode: UINT8 = _BME68X_FORCED_MODE + op_mode: int = _BME68X_FORCED_MODE # restrict to enable = True enable: bool = True - nb_conv: UINT8 = 0 - hctrl: UINT8 = _BME68X_ENABLE_HEATER - run_gas: UINT8 = 0 - ctrl_gas_data_0: UINT8 = 0 - ctrl_gas_data_1: UINT8 = 0 - ctrl_gas_addr_0: UINT8 = _BME68X_REG_CTRL_GAS_0 - ctrl_gas_addr_1: UINT8 = _BME68X_REG_CTRL_GAS_1 + nb_conv: int = 0 + hctrl: int = _BME68X_ENABLE_HEATER + run_gas: int = 0 + ctrl_gas_data_0: int = 0 + ctrl_gas_data_1: int = 0 try: self._set_op_mode(_BME68X_SLEEP_MODE) self._set_conf(heater_temp, heater_time, op_mode) - ctrl_gas_data_0 = self._read_byte(ctrl_gas_addr_0) - ctrl_gas_data_1 = self._read_byte(ctrl_gas_addr_1) + ctrl_gas_data_0 = self._read_byte(_BME68X_REG_CTRL_GAS_0) + ctrl_gas_data_1 = self._read_byte(_BME68X_REG_CTRL_GAS_1) if enable: hctrl = _BME68X_ENABLE_HEATER if self._chip_variant == _BME68X_VARIANT_GAS_HIGH: @@ -537,86 +502,75 @@ def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: ctrl_gas_data_1 = bme_set_bits( ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas ) - self._write(ctrl_gas_addr_0, [ctrl_gas_data_0]) - self._write(ctrl_gas_addr_1, [ctrl_gas_data_1]) + self._write(_BME68X_REG_CTRL_GAS_0, [ctrl_gas_data_0]) + self._write(_BME68X_REG_CTRL_GAS_1, [ctrl_gas_data_1]) # HELP check this self._set_op_mode(_BME68X_FORCED_MODE) - except GasHeaterException as exc: + except OSError as exc: self._set_op_mode(_BME68X_FORCED_MODE) raise exc - def _set_op_mode(self, op_mode: UINT8) -> None: + def _set_op_mode(self, op_mode: int) -> None: """ * @brief This API is used to set the operation mode of the sensor """ - tmp_pow_mode: UINT8 = 0 - pow_mode: UINT8 = _BME68X_FORCED_MODE - reg_addr: UINT8 = _BME680_REG_CTRL_MEAS + tmp_pow_mode: int = 0 + pow_mode: int = _BME68X_FORCED_MODE # Call until in sleep - try: - # was a do {} while() loop - while pow_mode != _BME68X_SLEEP_MODE: - tmp_pow_mode = self._read_byte(_BME680_REG_CTRL_MEAS) - # Put to sleep before changing mode - pow_mode = tmp_pow_mode & _BME68X_MODE_MSK - if pow_mode != _BME68X_SLEEP_MODE: - tmp_pow_mode &= ~_BME68X_MODE_MSK # Set to sleep - self._write(reg_addr, [tmp_pow_mode]) - # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # HELP - delay_microseconds(_BME68X_PERIOD_POLL) - # Already in sleep - if op_mode != _BME68X_SLEEP_MODE: - tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | ( - op_mode & _BME68X_MODE_MSK - ) - self._write(reg_addr, [tmp_pow_mode]) - except GasHeaterException as exc: - raise exc - def _set_conf( - self, heater_temp: UINT16, heater_time: UINT16, op_mode: UINT8 - ) -> None: + # was a do {} while() loop + while pow_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode = self._read_byte(_BME680_REG_CTRL_MEAS) + # Put to sleep before changing mode + pow_mode = tmp_pow_mode & _BME68X_MODE_MSK + if pow_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode &= ~_BME68X_MODE_MSK # Set to sleep + self._write(_BME680_REG_CTRL_MEAS, [tmp_pow_mode]) + # dev->delay_us(_BME68X_PERIOD_POLL, dev->intf_ptr) # HELP + delay_microseconds(_BME68X_PERIOD_POLL) + # Already in sleep + if op_mode != _BME68X_SLEEP_MODE: + tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | ( + op_mode & _BME68X_MODE_MSK + ) + self._write(_BME680_REG_CTRL_MEAS, [tmp_pow_mode]) + + def _set_conf(self, heater_temp: int, heater_time: int, op_mode: int) -> None: """ This internal API is used to set heater configurations """ - try: - if op_mode != _BME68X_FORCED_MODE: - raise GasHeaterException("_set_conf not forced mode") - rh_reg_addr: UINT8 = _BME680_BME680_RES_HEAT_0 - rh_reg_data: UINT8 = self._calc_res_heat(heater_temp) - gw_reg_addr: UINT8 = _BME680_BME680_GAS_WAIT_0 - gw_reg_data: UINT8 = self._calc_gas_wait(heater_time) - self._write(rh_reg_addr, [rh_reg_data]) - self._write(gw_reg_addr, [gw_reg_data]) - except GasHeaterException as exc: - raise exc - def _calc_res_heat(self, temp: UINT16) -> UINT8: + if op_mode != _BME68X_FORCED_MODE: + raise OSError("GasHeaterException: _set_conf not forced mode") + rh_reg_data: int = self._calc_res_heat(heater_temp) + gw_reg_data: int = self._calc_gas_wait(heater_time) + self._write(_BME680_BME680_RES_HEAT_0, [rh_reg_data]) + self._write(_BME680_BME680_GAS_WAIT_0, [gw_reg_data]) + + def _calc_res_heat(self, temp: int) -> int: """ This internal API is used to calculate the heater resistance value using float """ - gh1: INT8 = self._gas_calibration[0] - gh2: INT16 = self._gas_calibration[1] - gh3: INT8 = self._gas_calibration[2] - htr: UINT8 = self._heat_range - htv: INT8 = self._heat_val - amb: UINT8 = self._amb_temp + gh1: int = self._gas_calibration[0] + gh2: int = self._gas_calibration[1] + gh3: int = self._gas_calibration[2] + htr: int = self._heat_range + htv: int = self._heat_val + amb: int = self._amb_temp temp = min(temp, 400) # Cap temperature - var1: INT32 = ((INT32(amb) * gh3) / 1000) * 256 - var2: INT32 = (gh1 + 784) * ( - ((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10 - ) - var3: INT32 = var1 + (var2 / 2) - var4: INT32 = var3 / (htr + 4) - var5: INT32 = (131 * htv) + 65536 - heatr_res_x100: INT32 = INT32(((var4 / var5) - 250) * 34) - heatr_res: UINT8 = UINT8((heatr_res_x100 + 50) / 100) + var1: int = ((int(amb) * gh3) / 1000) * 256 + var2: int = (gh1 + 784) * (((((gh2 + 154009) * temp * 5) / 100) + 3276800) / 10) + var3: int = var1 + (var2 / 2) + var4: int = var3 / (htr + 4) + var5: int = (131 * htv) + 65536 + heatr_res_x100: int = int(((var4 / var5) - 250) * 34) + heatr_res: int = int((heatr_res_x100 + 50) / 100) return heatr_res - def _calc_res_heat(self, temp: UINT16) -> UINT8: + def _calc_res_heat(self, temp: int) -> int: """ This internal API is used to calculate the heater resistance value """ @@ -634,28 +588,26 @@ def _calc_res_heat(self, temp: UINT16) -> UINT8: var3: float = gh3 / (1024.0) var4: float = var1 * (1.0 + (var2 * float(temp))) var5: float = var4 + (var3 * amb) - res_heat: UINT8 = UINT8( + res_heat: int = int( 3.4 * ((var5 * (4 / (4 + htr)) * (1 / (1 + (htv * 0.002)))) - 25) ) return res_heat - def _calc_gas_wait(self, dur: UINT16) -> UINT8: + def _calc_gas_wait(self, dur: int) -> int: """ This internal API is used to calculate the gas wait """ - factor: UINT8 = 0 - durval: UINT8 = 0xFF # Max duration + factor: int = 0 + durval: int = 0xFF # Max duration if dur < 0xFC0: return durval while dur > 0x3F: dur = dur / 4 factor += 1 - durval = UINT8(dur + (factor * 64)) + durval = int(dur + (factor * 64)) return durval - # garberw added end =========================== - class Adafruit_BME680_I2C(Adafruit_BME680): """Driver for I2C connected BME680. diff --git a/contributors.md b/contributors.md deleted file mode 100644 index c5f9f88..0000000 --- a/contributors.md +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: 2017 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -Contributors to Adafruit_CircuitPython_BME680_modified -============================================================= - -Limor (Ladyada) Fried - -William Garber -many others From 53b814fe9e49b7d71271a95f043732f775f4a669 Mon Sep 17 00:00:00 2001 From: Graeme Winter Date: Sun, 18 Jun 2023 16:10:10 +0100 Subject: [PATCH 090/115] Add method to disable gas heater Setting either of temperature or heat time to zero will disable Fixes adafruit/Adafruit_CircuitPython_BME680#63 --- adafruit_bme680.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 8867584..a3fdeab 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -482,30 +482,29 @@ def _read(self, register: int, length: int) -> bytearray: def _write(self, register: int, values: bytearray) -> None: raise NotImplementedError() - # garberw added begin =========================== def set_gas_heater(self, heater_temp: UINT16, heater_time: UINT16) -> bool: """ - * @brief Enable and configure gas reading + heater + * @brief Enable and configure gas reading + heater (0 disables) * @param heater_temp * Desired temperature in degrees Centigrade * @param heater_time * Time to keep heater on in milliseconds * @return True on success, False on failure """ - if (heater_temp == 0) or (heater_time == 0): - return False - # enable = BME68X_ENABLE try: - self._set_heatr_conf(heater_temp, heater_time) + if (heater_temp == 0) or (heater_time == 0): + self._set_heatr_conf(heater_temp, heater_time, enable=False) + else: + self._set_heatr_conf(heater_temp, heater_time) except GasHeaterException: return False return True - def _set_heatr_conf(self, heater_temp: UINT16, heater_time: UINT16) -> None: + def _set_heatr_conf( + self, heater_temp: UINT16, heater_time: UINT16, enable: bool = True + ) -> None: # restrict to BME68X_FORCED_MODE op_mode: UINT8 = _BME68X_FORCED_MODE - # restrict to enable = True - enable: bool = True nb_conv: UINT8 = 0 hctrl: UINT8 = _BME68X_ENABLE_HEATER run_gas: UINT8 = 0 From 554523e8070999ecaf6109a35cfc41a06b561cc7 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 7 Aug 2023 15:27:34 -0500 Subject: [PATCH 091/115] simplify exceptions --- adafruit_bme680.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index b16874e..c0fa2a4 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -505,10 +505,8 @@ def _set_heatr_conf(self, heater_temp: int, heater_time: int) -> None: self._write(_BME68X_REG_CTRL_GAS_0, [ctrl_gas_data_0]) self._write(_BME68X_REG_CTRL_GAS_1, [ctrl_gas_data_1]) # HELP check this + finally: self._set_op_mode(_BME68X_FORCED_MODE) - except OSError as exc: - self._set_op_mode(_BME68X_FORCED_MODE) - raise exc def _set_op_mode(self, op_mode: int) -> None: """ From 8f884ce59cc1ac70723be530d4e7619cd23cc227 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 11 Sep 2023 16:49:20 -0500 Subject: [PATCH 092/115] use None instead of 0 for disable. --- adafruit_bme680.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index a3fdeab..4cac0f5 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -484,7 +484,7 @@ def _write(self, register: int, values: bytearray) -> None: def set_gas_heater(self, heater_temp: UINT16, heater_time: UINT16) -> bool: """ - * @brief Enable and configure gas reading + heater (0 disables) + * @brief Enable and configure gas reading + heater (None disables) * @param heater_temp * Desired temperature in degrees Centigrade * @param heater_time @@ -492,8 +492,8 @@ def set_gas_heater(self, heater_temp: UINT16, heater_time: UINT16) -> bool: * @return True on success, False on failure """ try: - if (heater_temp == 0) or (heater_time == 0): - self._set_heatr_conf(heater_temp, heater_time, enable=False) + if (heater_temp is None) or (heater_time is None): + self._set_heatr_conf(heater_temp or 0, heater_time or 0, enable=False) else: self._set_heatr_conf(heater_temp, heater_time) except GasHeaterException: From b08654fdf14d3ccb7fb4bbece7b72916337212d7 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 18 Sep 2023 16:24:18 -0500 Subject: [PATCH 093/115] "fix rtd theme " --- docs/conf.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5bc3cc8..432529a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -96,19 +96,10 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] - except: - html_theme = "default" - html_theme_path = ["."] -else: - html_theme_path = ["."] +import sphinx_rtd_theme + +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From d744cd4b0fc431f64bc4547e3cacdbc99e5704fd Mon Sep 17 00:00:00 2001 From: CTho9305 <44120853+CTho9305@users.noreply.github.com> Date: Sun, 26 Nov 2023 21:34:39 -0600 Subject: [PATCH 094/115] Fix https://github.com/adafruit/Adafruit_CircuitPython_BME680/issues/67 and allow for disabling gas sampling entirely --- adafruit_bme680.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 9facea6..3ac85d2 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -207,6 +207,9 @@ def __init__(self, *, refresh_rate: int = 10) -> None: self._humidity_oversample = 0b010 self._filter = 0b010 + # Gas measurements, as a mask applied to _BME680_RUNGAS + self._run_gas = 0xFF + self._adc_pres = None self._adc_temp = None self._adc_hum = None @@ -389,9 +392,9 @@ def _perform_reading(self) -> None: self._write(_BME680_REG_CTRL_HUM, [self._humidity_oversample]) # gas measurements enabled if self._chip_variant == 0x01: - self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS << 1]) + self._write(_BME680_REG_CTRL_GAS, [(self._run_gas & _BME680_RUNGAS) << 1]) else: - self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS]) + self._write(_BME680_REG_CTRL_GAS, [(self._run_gas & _BME680_RUNGAS)]) ctrl = self._read_byte(_BME680_REG_CTRL_MEAS) ctrl = (ctrl & 0xFC) | 0x01 # enable single shot! self._write(_BME680_REG_CTRL_MEAS, [ctrl]) @@ -492,6 +495,7 @@ def _set_heatr_conf( else: hctrl = _BME68X_DISABLE_HEATER run_gas = _BME68X_DISABLE_GAS_MEAS + self._run_gas = ~(run_gas - 1) ctrl_gas_data_0 = bme_set_bits( ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl @@ -598,7 +602,7 @@ def _calc_gas_wait(self, dur: int) -> int: factor: int = 0 durval: int = 0xFF # Max duration - if dur < 0xFC0: + if dur > 0xFC0: return durval while dur > 0x3F: dur = dur / 4 From 08cab898a869d6085023ba9fe05a1c119d2fbc74 Mon Sep 17 00:00:00 2001 From: CTho9305 <44120853+CTho9305@users.noreply.github.com> Date: Mon, 27 Nov 2023 21:39:32 -0600 Subject: [PATCH 095/115] fix review feedback from FoamyGuy - get code closer to Bosch reference. --- adafruit_bme680.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 3ac85d2..b3651e3 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -602,7 +602,7 @@ def _calc_gas_wait(self, dur: int) -> int: factor: int = 0 durval: int = 0xFF # Max duration - if dur > 0xFC0: + if dur >= 0xFC0: return durval while dur > 0x3F: dur = dur / 4 From 467981eff00bbf914196d96cdac9aed159a7b09a Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 16 Oct 2023 14:30:31 -0500 Subject: [PATCH 096/115] unpin sphinx and add sphinx-rtd-theme to docs reqs Signed-off-by: foamyguy --- docs/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 797aa04..979f568 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,5 +2,6 @@ # # SPDX-License-Identifier: Unlicense -sphinx>=4.0.0 +sphinx sphinxcontrib-jquery +sphinx-rtd-theme From 9a2a49c2ff08b98918684d0245995cf1dffe1919 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 07:52:24 -0700 Subject: [PATCH 097/115] Add ruff formatter --- .gitattributes | 5 +++++ .pre-commit-config.yaml | 41 +++++++++-------------------------------- adafruit_bme680.py | 4 ++-- pyproject.toml | 6 ++++++ 4 files changed, 22 insertions(+), 34 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d54c593 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +* text eol=lf diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 70ade69..0981ef3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,42 +1,19 @@ -# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò +# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries # # SPDX-License-Identifier: Unlicense repos: - - repo: https://github.com/python/black - rev: 23.3.0 - hooks: - - id: black - - repo: https://github.com/fsfe/reuse-tool - rev: v1.1.2 - hooks: - - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - - repo: https://github.com/pycqa/pylint - rev: v2.17.4 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.3.4 hooks: - - id: pylint - name: pylint (library code) - types: [python] - args: - - --disable=consider-using-f-string - exclude: "^(docs/|examples/|tests/|setup.py$)" - - id: pylint - name: pylint (example code) - description: Run pylint rules on "examples/*.py" files - types: [python] - files: "^examples/" - args: - - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code - - id: pylint - name: pylint (test code) - description: Run pylint rules on "tests/*.py" files - types: [python] - files: "^tests/" - args: - - --disable=missing-docstring,consider-using-f-string,duplicate-code + - id: ruff-format + - repo: https://github.com/fsfe/reuse-tool + rev: v3.0.1 + hooks: + - id: reuse diff --git a/adafruit_bme680.py b/adafruit_bme680.py index b3651e3..4e502b4 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -662,7 +662,7 @@ def __init__( address: int = 0x77, debug: bool = False, *, - refresh_rate: int = 10 + refresh_rate: int = 10, ) -> None: """Initialize the I2C device at the 'address' given""" from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel @@ -751,7 +751,7 @@ def __init__( baudrate: int = 100000, debug: bool = False, *, - refresh_rate: int = 10 + refresh_rate: int = 10, ) -> None: from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel spi_device, diff --git a/pyproject.toml b/pyproject.toml index 2092d51..e83f188 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,12 @@ classifiers = [ ] dynamic = ["dependencies", "optional-dependencies"] +[tool.ruff] +target-version = "py38" + +[tool.ruff.format] +line-ending = "lf" + [tool.setuptools] py-modules = ["adafruit_bme680"] From 1db71cca7401cf61b8183847d6d5757948e53289 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 08:08:30 -0700 Subject: [PATCH 098/115] Add ruff isort --- .pre-commit-config.yaml | 2 ++ adafruit_bme680.py | 5 +++-- docs/conf.py | 2 +- examples/bme680_simpletest.py | 2 ++ examples/bme680_spi.py | 2 ++ pyproject.toml | 3 +++ 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0981ef3..ff19dde 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,6 +13,8 @@ repos: rev: v0.3.4 hooks: - id: ruff-format + - id: ruff + args: ["--fix"] - repo: https://github.com/fsfe/reuse-tool rev: v3.0.1 hooks: diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 4e502b4..97cf01a 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -30,9 +30,10 @@ * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice """ +import math import struct import time -import math + from micropython import const @@ -46,8 +47,8 @@ def delay_microseconds(nusec): import typing # pylint: disable=unused-import - from circuitpython_typing import ReadableBuffer from busio import I2C, SPI + from circuitpython_typing import ReadableBuffer from digitalio import DigitalInOut except ImportError: diff --git a/docs/conf.py b/docs/conf.py index 432529a..d4ded73 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,9 +4,9 @@ # # SPDX-License-Identifier: MIT +import datetime import os import sys -import datetime sys.path.insert(0, os.path.abspath("..")) diff --git a/examples/bme680_simpletest.py b/examples/bme680_simpletest.py index ff77675..5b8c984 100644 --- a/examples/bme680_simpletest.py +++ b/examples/bme680_simpletest.py @@ -2,7 +2,9 @@ # SPDX-License-Identifier: MIT import time + import board + import adafruit_bme680 # Create sensor object, communicating over the board's default I2C bus diff --git a/examples/bme680_spi.py b/examples/bme680_spi.py index f8161dd..eb699a9 100644 --- a/examples/bme680_spi.py +++ b/examples/bme680_spi.py @@ -2,8 +2,10 @@ # SPDX-License-Identifier: MIT import time + import board import digitalio + import adafruit_bme680 # Create sensor object, communicating over the board's default SPI bus diff --git a/pyproject.toml b/pyproject.toml index e83f188..23b6dba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,9 @@ dynamic = ["dependencies", "optional-dependencies"] [tool.ruff] target-version = "py38" +[tool.ruff.lint] +select = ["I"] + [tool.ruff.format] line-ending = "lf" From a692e477fcf236f968e7549570aba2c0aa57367c Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 09:13:26 -0700 Subject: [PATCH 099/115] Add ruff lint --- .pylintrc | 399 --------------------------------------------- adafruit_bme680.py | 17 +- pyproject.toml | 3 +- 3 files changed, 9 insertions(+), 410 deletions(-) delete mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index f945e92..0000000 --- a/.pylintrc +++ /dev/null @@ -1,399 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries -# -# SPDX-License-Identifier: Unlicense - -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist= - -# Add files or directories to the ignore-list. They should be base names, not -# paths. -ignore=CVS - -# Add files or directories matching the regex patterns to the ignore-list. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. -jobs=1 - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins=pylint.extensions.no_self_use - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call -disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable= - - -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio).You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[SPELLING] - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -# notes=FIXME,XXX,TODO -notes=FIXME,XXX - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=board - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_,_cb - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,future.builtins - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -# expected-line-ending-format= -expected-line-ending-format=LF - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module -max-module-lines=1000 - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=yes - -# Minimum lines number of a similarity. -min-similarity-lines=12 - - -[BASIC] - -# Regular expression matching correct argument names -argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Regular expression matching correct attribute names -attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata - -# Regular expression matching correct class attribute names -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression matching correct class names -# class-rgx=[A-Z_][a-zA-Z0-9]+$ -class-rgx=[A-Z_][a-zA-Z0-9_]+$ - -# Regular expression matching correct constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Regular expression matching correct function names -function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Good variable names which should always be accepted, separated by a comma -# good-names=i,j,k,ex,Run,_ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_ - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# Regular expression matching correct inline iteration names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Regular expression matching correct method names -method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Regular expression matching correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty - -# Regular expression matching correct variable names -variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict,_fields,_replace,_source,_make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Maximum number of attributes for a class (see R0902). -# max-attributes=7 -max-attributes=11 - -# Maximum number of boolean expressions in a if statement -max-bool-expr=5 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of statements in function / method body -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=1 - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=builtins.Exception diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 97cf01a..11abdc3 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -2,9 +2,6 @@ # # SPDX-License-Identifier: MIT AND BSD-3-Clause -# We have a lot of attributes for this complex sensor. -# pylint: disable=too-many-instance-attributes -# pylint: disable=no_self_use """ `adafruit_bme680` @@ -45,7 +42,7 @@ def delay_microseconds(nusec): try: # Used only for type annotations. - import typing # pylint: disable=unused-import + import typing from busio import I2C, SPI from circuitpython_typing import ReadableBuffer @@ -666,7 +663,7 @@ def __init__( refresh_rate: int = 10, ) -> None: """Initialize the I2C device at the 'address' given""" - from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel + from adafruit_bus_device import ( i2c_device, ) @@ -745,7 +742,7 @@ class Adafruit_BME680_SPI(Adafruit_BME680): """ - def __init__( + def __init__( # noqa: PLR0913 Too many arguments in function definition self, spi: SPI, cs: DigitalInOut, @@ -754,7 +751,7 @@ def __init__( *, refresh_rate: int = 10, ) -> None: - from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel + from adafruit_bus_device import ( spi_device, ) @@ -770,9 +767,9 @@ def _read(self, register: int, length: int) -> bytearray: register = (register | 0x80) & 0xFF # Read single, bit 7 high. with self._spi as spi: - spi.write(bytearray([register])) # pylint: disable=no-member + spi.write(bytearray([register])) result = bytearray(length) - spi.readinto(result) # pylint: disable=no-member + spi.readinto(result) if self._debug: print("\t$%02X => %s" % (register, [hex(i) for i in result])) return result @@ -788,7 +785,7 @@ def _write(self, register: int, values: ReadableBuffer) -> None: for i, value in enumerate(values): buffer[2 * i] = register + i buffer[2 * i + 1] = value & 0xFF - spi.write(buffer) # pylint: disable=no-member + spi.write(buffer) if self._debug: print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]])) diff --git a/pyproject.toml b/pyproject.toml index 23b6dba..51fe85e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,8 @@ dynamic = ["dependencies", "optional-dependencies"] target-version = "py38" [tool.ruff.lint] -select = ["I"] +select = ["I", "PL"] +ignore = ["PLR2004"] [tool.ruff.format] line-ending = "lf" From 12f3d14db7c04ead9dfdd4d8cb62acb8a0d499c8 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 09:32:29 -0700 Subject: [PATCH 100/115] Add ruff upgrade --- docs/conf.py | 2 -- pyproject.toml | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d4ded73..c8c8cbc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # # SPDX-License-Identifier: MIT diff --git a/pyproject.toml b/pyproject.toml index 51fe85e..ab10cbe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,8 +45,8 @@ dynamic = ["dependencies", "optional-dependencies"] target-version = "py38" [tool.ruff.lint] -select = ["I", "PL"] -ignore = ["PLR2004"] +select = ["I", "PL", "UP"] +ignore = ["PLR2004", "UP028", "UP030", "UP031", "UP032"] [tool.ruff.format] line-ending = "lf" From 3c91cd1304bf6206f567864207158dadb12e6ff9 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 09:47:28 -0700 Subject: [PATCH 101/115] remove upgrade UP028 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ab10cbe..1c28a2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ target-version = "py38" [tool.ruff.lint] select = ["I", "PL", "UP"] -ignore = ["PLR2004", "UP028", "UP030", "UP031", "UP032"] +ignore = ["PLR2004", "UP030", "UP031", "UP032"] [tool.ruff.format] line-ending = "lf" From e9f2da40312ecb8b205fcd35c66377a3f7f16b89 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 09:52:20 -0700 Subject: [PATCH 102/115] remove upgrade UP031 --- adafruit_bme680.py | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 11abdc3..8f3a569 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -678,7 +678,7 @@ def _read(self, register: int, length: int) -> bytearray: result = bytearray(length) i2c.readinto(result) if self._debug: - print("\t$%02X => %s" % (register, [hex(i) for i in result])) + print("\t${:02X} => {}".format(register, [hex(i) for i in result])) return result def _write(self, register: int, values: ReadableBuffer) -> None: @@ -690,7 +690,7 @@ def _write(self, register: int, values: ReadableBuffer) -> None: buffer[2 * i + 1] = value i2c.write(buffer) if self._debug: - print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]])) + print("\t${:02X} <= {}".format(values[0], [hex(i) for i in values[1:]])) class Adafruit_BME680_SPI(Adafruit_BME680): @@ -771,7 +771,7 @@ def _read(self, register: int, length: int) -> bytearray: result = bytearray(length) spi.readinto(result) if self._debug: - print("\t$%02X => %s" % (register, [hex(i) for i in result])) + print("\t${:02X} => {}".format(register, [hex(i) for i in result])) return result def _write(self, register: int, values: ReadableBuffer) -> None: @@ -787,7 +787,7 @@ def _write(self, register: int, values: ReadableBuffer) -> None: buffer[2 * i + 1] = value & 0xFF spi.write(buffer) if self._debug: - print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]])) + print("\t${:02X} <= {}".format(values[0], [hex(i) for i in values[1:]])) def _set_spi_mem_page(self, register: int) -> None: spi_mem_page = 0x00 diff --git a/pyproject.toml b/pyproject.toml index 1c28a2d..1fa3b41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ target-version = "py38" [tool.ruff.lint] select = ["I", "PL", "UP"] -ignore = ["PLR2004", "UP030", "UP031", "UP032"] +ignore = ["PLR2004", "UP030", "UP032"] [tool.ruff.format] line-ending = "lf" From 7084383bd1cd2cfa5a6814bb9550d0340ca10aa8 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sat, 23 Mar 2024 09:56:03 -0700 Subject: [PATCH 103/115] remove upgrade UP032 --- adafruit_bme680.py | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 8f3a569..52b7b47 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -678,7 +678,7 @@ def _read(self, register: int, length: int) -> bytearray: result = bytearray(length) i2c.readinto(result) if self._debug: - print("\t${:02X} => {}".format(register, [hex(i) for i in result])) + print(f"\t${register:02X} => {[hex(i) for i in result]}") return result def _write(self, register: int, values: ReadableBuffer) -> None: @@ -690,7 +690,7 @@ def _write(self, register: int, values: ReadableBuffer) -> None: buffer[2 * i + 1] = value i2c.write(buffer) if self._debug: - print("\t${:02X} <= {}".format(values[0], [hex(i) for i in values[1:]])) + print(f"\t${values[0]:02X} <= {[hex(i) for i in values[1:]]}") class Adafruit_BME680_SPI(Adafruit_BME680): @@ -771,7 +771,7 @@ def _read(self, register: int, length: int) -> bytearray: result = bytearray(length) spi.readinto(result) if self._debug: - print("\t${:02X} => {}".format(register, [hex(i) for i in result])) + print(f"\t${register:02X} => {[hex(i) for i in result]}") return result def _write(self, register: int, values: ReadableBuffer) -> None: @@ -787,7 +787,7 @@ def _write(self, register: int, values: ReadableBuffer) -> None: buffer[2 * i + 1] = value & 0xFF spi.write(buffer) if self._debug: - print("\t${:02X} <= {}".format(values[0], [hex(i) for i in values[1:]])) + print(f"\t${values[0]:02X} <= {[hex(i) for i in values[1:]]}") def _set_spi_mem_page(self, register: int) -> None: spi_mem_page = 0x00 diff --git a/pyproject.toml b/pyproject.toml index 1fa3b41..50a8a0e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ target-version = "py38" [tool.ruff.lint] select = ["I", "PL", "UP"] -ignore = ["PLR2004", "UP030", "UP032"] +ignore = ["PLR2004", "UP030"] [tool.ruff.format] line-ending = "lf" From 057cbb030be2cb4c404817fdeb8587f0a129d976 Mon Sep 17 00:00:00 2001 From: Justin Myers Date: Sun, 24 Mar 2024 07:41:07 -0700 Subject: [PATCH 104/115] Update README badge --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index d430106..c498d76 100644 --- a/README.rst +++ b/README.rst @@ -14,9 +14,9 @@ Introduction :target: https://github.com/adafruit/Adafruit_CircuitPython_BME680/actions/ :alt: Build Status -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - :alt: Code Style: Black +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Code Style: Ruff CircuitPython driver for BME680 sensor over I2C From 55025c682cd54c598191bb085e4079934d42d7ac Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 15 Apr 2024 16:33:42 -0500 Subject: [PATCH 105/115] remove forced mode --- adafruit_bme680.py | 53 ++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index b3651e3..2194eee 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -481,36 +481,33 @@ def _set_heatr_conf( run_gas: int = 0 ctrl_gas_data_0: int = 0 ctrl_gas_data_1: int = 0 - try: - self._set_op_mode(_BME68X_SLEEP_MODE) - self._set_conf(heater_temp, heater_time, op_mode) - ctrl_gas_data_0 = self._read_byte(_BME68X_REG_CTRL_GAS_0) - ctrl_gas_data_1 = self._read_byte(_BME68X_REG_CTRL_GAS_1) - if enable: - hctrl = _BME68X_ENABLE_HEATER - if self._chip_variant == _BME68X_VARIANT_GAS_HIGH: - run_gas = _BME68X_ENABLE_GAS_MEAS_H - else: - run_gas = _BME68X_ENABLE_GAS_MEAS_L + + self._set_op_mode(_BME68X_SLEEP_MODE) + self._set_conf(heater_temp, heater_time, op_mode) + ctrl_gas_data_0 = self._read_byte(_BME68X_REG_CTRL_GAS_0) + ctrl_gas_data_1 = self._read_byte(_BME68X_REG_CTRL_GAS_1) + if enable: + hctrl = _BME68X_ENABLE_HEATER + if self._chip_variant == _BME68X_VARIANT_GAS_HIGH: + run_gas = _BME68X_ENABLE_GAS_MEAS_H else: - hctrl = _BME68X_DISABLE_HEATER - run_gas = _BME68X_DISABLE_GAS_MEAS - self._run_gas = ~(run_gas - 1) + run_gas = _BME68X_ENABLE_GAS_MEAS_L + else: + hctrl = _BME68X_DISABLE_HEATER + run_gas = _BME68X_DISABLE_GAS_MEAS + self._run_gas = ~(run_gas - 1) - ctrl_gas_data_0 = bme_set_bits( - ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl - ) - ctrl_gas_data_1 = bme_set_bits_pos_0( - ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv - ) - ctrl_gas_data_1 = bme_set_bits( - ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas - ) - self._write(_BME68X_REG_CTRL_GAS_0, [ctrl_gas_data_0]) - self._write(_BME68X_REG_CTRL_GAS_1, [ctrl_gas_data_1]) - # HELP check this - finally: - self._set_op_mode(_BME68X_FORCED_MODE) + ctrl_gas_data_0 = bme_set_bits( + ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl + ) + ctrl_gas_data_1 = bme_set_bits_pos_0( + ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv + ) + ctrl_gas_data_1 = bme_set_bits( + ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas + ) + self._write(_BME68X_REG_CTRL_GAS_0, [ctrl_gas_data_0]) + self._write(_BME68X_REG_CTRL_GAS_1, [ctrl_gas_data_1]) def _set_op_mode(self, op_mode: int) -> None: """ From 1370df1b007fc666283c407d26ec6a27141dd900 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 29 Apr 2024 09:55:04 -0500 Subject: [PATCH 106/115] displayio example --- examples/bme680_displayio_simpletest.py | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/bme680_displayio_simpletest.py diff --git a/examples/bme680_displayio_simpletest.py b/examples/bme680_displayio_simpletest.py new file mode 100644 index 0000000..41272b4 --- /dev/null +++ b/examples/bme680_displayio_simpletest.py @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time +import board +from adafruit_display_text.bitmap_label import Label +from terminalio import FONT +from displayio import Group +import adafruit_bme680 + +# create a main_group to hold anything we want to show on the display. +main_group = Group() + +# Create sensor object, communicating over the board's default I2C bus +i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller +bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug=False) + +# change this to match the location's pressure (hPa) at sea level +bme680.sea_level_pressure = 1013.25 + +# You will usually have to add an offset to account for the temperature of +# the sensor. This is usually around 5 degrees but varies by use. Use a +# separate temperature sensor to calibrate this one. +temperature_offset = -5 + +# Create a Label to show the readings. If you have a very small +# display you may need to change to scale=1. +display_output_label = Label(FONT, text="", scale=2) + +# place the label near the top left corner with anchored positioning +display_output_label.anchor_point = (0, 0) +display_output_label.anchored_position = (4, 4) + +# add the label to the main_group +main_group.append(display_output_label) + +# set the main_group as the root_group of the built-in DISPLAY +board.DISPLAY.root_group = main_group + +# begin main loop +while True: + # Update the label.text property to change the text on the display + display_output_label.text = """Temperature: {:.1f} C +Humidity: {:.1f} %""".format( + bme680.temperature + temperature_offset, bme680.relative_humidity + ) + + # wait for a bit + time.sleep(1) From 95336a4708c327b6e36eb74ae6b6a5f3301cde8f Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 15 Jul 2024 16:35:50 -0500 Subject: [PATCH 107/115] move ruff config to it's own file --- adafruit_bme680.py | 44 ++++++--------------- docs/conf.py | 4 +- pyproject.toml | 10 ----- ruff.toml | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 46 deletions(-) create mode 100644 ruff.toml diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 52b7b47..ca2d6c9 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -285,19 +285,15 @@ def pressure(self) -> float: var2 = (var2 * self._pressure_calibration[5]) / 4 var2 = var2 + (var1 * self._pressure_calibration[4] * 2) var2 = (var2 / 4) + (self._pressure_calibration[3] * 65536) - var1 = ( - (((var1 / 4) * (var1 / 4)) / 8192) - * (self._pressure_calibration[2] * 32) - / 8 - ) + ((self._pressure_calibration[1] * var1) / 2) + var1 = ((((var1 / 4) * (var1 / 4)) / 8192) * (self._pressure_calibration[2] * 32) / 8) + ( + (self._pressure_calibration[1] * var1) / 2 + ) var1 = var1 / 262144 var1 = ((32768 + var1) * self._pressure_calibration[0]) / 32768 calc_pres = 1048576 - self._adc_pres calc_pres = (calc_pres - (var2 / 4096)) * 3125 calc_pres = (calc_pres / var1) * 2 - var1 = ( - self._pressure_calibration[8] * (((calc_pres / 8) * (calc_pres / 8)) / 8192) - ) / 4096 + var1 = (self._pressure_calibration[8] * (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096 var2 = ((calc_pres / 4) * self._pressure_calibration[7]) / 8192 var3 = (((calc_pres / 256) ** 3) * self._pressure_calibration[9]) / 131072 calc_pres += (var1 + var2 + var3 + (self._pressure_calibration[6] * 128)) / 16 @@ -321,13 +317,7 @@ def humidity(self) -> float: * ( ((temp_scaled * self._humidity_calibration[3]) / 100) + ( - ( - ( - temp_scaled - * ((temp_scaled * self._humidity_calibration[4]) / 100) - ) - / 64 - ) + ((temp_scaled * ((temp_scaled * self._humidity_calibration[4]) / 100)) / 64) / 100 ) + 16384 @@ -365,9 +355,7 @@ def gas(self) -> int: calc_gas_res = (10000 * var1) / var2 calc_gas_res = calc_gas_res * 100 else: - var1 = ( - (1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range]) - ) / 65536 + var1 = ((1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range])) / 65536 var2 = ((self._adc_gas * 32768) - 16777216) + var1 var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512 calc_gas_res = (var3 + (var2 / 2)) / var2 @@ -428,9 +416,7 @@ def _read_calibration(self) -> None: # print("\n\n",coeff) coeff = [float(i) for i in coeff] self._temp_calibration = [coeff[x] for x in [23, 0, 1]] - self._pressure_calibration = [ - coeff[x] for x in [3, 4, 5, 7, 8, 10, 9, 12, 13, 14] - ] + self._pressure_calibration = [coeff[x] for x in [3, 4, 5, 7, 8, 10, 9, 12, 13, 14]] self._humidity_calibration = [coeff[x] for x in [17, 16, 18, 19, 20, 21, 22]] self._gas_calibration = [coeff[x] for x in [25, 24, 26]] @@ -469,9 +455,7 @@ def set_gas_heater(self, heater_temp: int, heater_time: int) -> bool: return False return True - def _set_heatr_conf( - self, heater_temp: int, heater_time: int, enable: bool = True - ) -> None: + def _set_heatr_conf(self, heater_temp: int, heater_time: int, enable: bool = True) -> None: # restrict to BME68X_FORCED_MODE op_mode: int = _BME68X_FORCED_MODE nb_conv: int = 0 @@ -498,9 +482,7 @@ def _set_heatr_conf( ctrl_gas_data_0 = bme_set_bits( ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl ) - ctrl_gas_data_1 = bme_set_bits_pos_0( - ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv - ) + ctrl_gas_data_1 = bme_set_bits_pos_0(ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv) ctrl_gas_data_1 = bme_set_bits( ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas ) @@ -530,9 +512,7 @@ def _set_op_mode(self, op_mode: int) -> None: delay_microseconds(_BME68X_PERIOD_POLL) # Already in sleep if op_mode != _BME68X_SLEEP_MODE: - tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | ( - op_mode & _BME68X_MODE_MSK - ) + tmp_pow_mode = (tmp_pow_mode & ~_BME68X_MODE_MSK) | (op_mode & _BME68X_MODE_MSK) self._write(_BME680_REG_CTRL_MEAS, [tmp_pow_mode]) def _set_conf(self, heater_temp: int, heater_time: int, op_mode: int) -> None: @@ -588,9 +568,7 @@ def _calc_res_heat(self, temp: int) -> int: var3: float = gh3 / (1024.0) var4: float = var1 * (1.0 + (var2 * float(temp))) var5: float = var4 + (var3 * amb) - res_heat: int = int( - 3.4 * ((var5 * (4 / (4 + htr)) * (1 / (1 + (htv * 0.002)))) - 25) - ) + res_heat: int = int(3.4 * ((var5 * (4 / (4 + htr)) * (1 / (1 + (htv * 0.002)))) - 25)) return res_heat def _calc_gas_wait(self, dur: int) -> int: diff --git a/docs/conf.py b/docs/conf.py index c8c8cbc..b60a1c2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,9 +42,7 @@ creation_year = "2017" current_year = str(datetime.datetime.now().year) year_duration = ( - current_year - if current_year == creation_year - else creation_year + " - " + current_year + current_year if current_year == creation_year else creation_year + " - " + current_year ) copyright = year_duration + " ladyada" author = "ladyada" diff --git a/pyproject.toml b/pyproject.toml index 50a8a0e..2092d51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,16 +41,6 @@ classifiers = [ ] dynamic = ["dependencies", "optional-dependencies"] -[tool.ruff] -target-version = "py38" - -[tool.ruff.lint] -select = ["I", "PL", "UP"] -ignore = ["PLR2004", "UP030"] - -[tool.ruff.format] -line-ending = "lf" - [tool.setuptools] py-modules = ["adafruit_bme680"] diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..db37c83 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +target-version = "py38" +line-length = 100 + +[lint] +select = ["I", "PL", "UP"] + +extend-select = [ + "D419", # empty-docstring + "E501", # line-too-long + "W291", # trailing-whitespace + "PLC0414", # useless-import-alias + "PLC2401", # non-ascii-name + "PLC2801", # unnecessary-dunder-call + "PLC3002", # unnecessary-direct-lambda-call + "E999", # syntax-error + "PLE0101", # return-in-init + "F706", # return-outside-function + "F704", # yield-outside-function + "PLE0116", # continue-in-finally + "PLE0117", # nonlocal-without-binding + "PLE0241", # duplicate-bases + "PLE0302", # unexpected-special-method-signature + "PLE0604", # invalid-all-object + "PLE0605", # invalid-all-format + "PLE0643", # potential-index-error + "PLE0704", # misplaced-bare-raise + "PLE1141", # dict-iter-missing-items + "PLE1142", # await-outside-async + "PLE1205", # logging-too-many-args + "PLE1206", # logging-too-few-args + "PLE1307", # bad-string-format-type + "PLE1310", # bad-str-strip-call + "PLE1507", # invalid-envvar-value + "PLE2502", # bidirectional-unicode + "PLE2510", # invalid-character-backspace + "PLE2512", # invalid-character-sub + "PLE2513", # invalid-character-esc + "PLE2514", # invalid-character-nul + "PLE2515", # invalid-character-zero-width-space + "PLR0124", # comparison-with-itself + "PLR0202", # no-classmethod-decorator + "PLR0203", # no-staticmethod-decorator + "UP004", # useless-object-inheritance + "PLR0206", # property-with-parameters + "PLR0904", # too-many-public-methods + "PLR0911", # too-many-return-statements + "PLR0912", # too-many-branches + "PLR0913", # too-many-arguments + "PLR0914", # too-many-locals + "PLR0915", # too-many-statements + "PLR0916", # too-many-boolean-expressions + "PLR1702", # too-many-nested-blocks + "PLR1704", # redefined-argument-from-local + "PLR1711", # useless-return + "C416", # unnecessary-comprehension + "PLR1733", # unnecessary-dict-index-lookup + "PLR1736", # unnecessary-list-index-lookup + + # ruff reports this rule is unstable + #"PLR6301", # no-self-use + + "PLW0108", # unnecessary-lambda + "PLW0120", # useless-else-on-loop + "PLW0127", # self-assigning-variable + "PLW0129", # assert-on-string-literal + "B033", # duplicate-value + "PLW0131", # named-expr-without-context + "PLW0245", # super-without-brackets + "PLW0406", # import-self + "PLW0602", # global-variable-not-assigned + "PLW0603", # global-statement + "PLW0604", # global-at-module-level + + # fails on the try: import typing used by libraries + #"F401", # unused-import + + "F841", # unused-variable + "E722", # bare-except + "PLW0711", # binary-op-exception + "PLW1501", # bad-open-mode + "PLW1508", # invalid-envvar-default + "PLW1509", # subprocess-popen-preexec-fn + "PLW2101", # useless-with-lock + "PLW3301", # nested-min-max +] + +ignore = [ + "PLR2004", # magic-value-comparison + "UP030", # format literals + "PLW1514", # unspecified-encoding + +] + +[format] +line-ending = "lf" From db9a0d60c0809bf394851e72946e102bfe3e65a7 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 15 Jul 2024 16:40:37 -0500 Subject: [PATCH 108/115] merge main --- adafruit_bme680.py | 8 ++------ examples/bme680_displayio_simpletest.py | 10 +++++----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index a353123..f484f97 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -479,12 +479,8 @@ def _set_heatr_conf(self, heater_temp: int, heater_time: int, enable: bool = Tru run_gas = _BME68X_DISABLE_GAS_MEAS self._run_gas = ~(run_gas - 1) - ctrl_gas_data_0 = bme_set_bits( - ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl - ) - ctrl_gas_data_1 = bme_set_bits_pos_0( - ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv - ) + ctrl_gas_data_0 = bme_set_bits(ctrl_gas_data_0, _BME68X_HCTRL_MSK, _BME68X_HCTRL_POS, hctrl) + ctrl_gas_data_1 = bme_set_bits_pos_0(ctrl_gas_data_1, _BME68X_NBCONV_MSK, nb_conv) ctrl_gas_data_1 = bme_set_bits( ctrl_gas_data_1, _BME68X_RUN_GAS_MSK, _BME68X_RUN_GAS_POS, run_gas ) diff --git a/examples/bme680_displayio_simpletest.py b/examples/bme680_displayio_simpletest.py index 41272b4..fd5ff81 100644 --- a/examples/bme680_displayio_simpletest.py +++ b/examples/bme680_displayio_simpletest.py @@ -2,10 +2,12 @@ # SPDX-License-Identifier: MIT import time + import board from adafruit_display_text.bitmap_label import Label -from terminalio import FONT from displayio import Group +from terminalio import FONT + import adafruit_bme680 # create a main_group to hold anything we want to show on the display. @@ -41,10 +43,8 @@ # begin main loop while True: # Update the label.text property to change the text on the display - display_output_label.text = """Temperature: {:.1f} C -Humidity: {:.1f} %""".format( - bme680.temperature + temperature_offset, bme680.relative_humidity - ) + display_output_label.text = f"""Temperature: {bme680.temperature + temperature_offset:.1f} C +Humidity: {bme680.relative_humidity:.1f} %""" # wait for a bit time.sleep(1) From c789ca03041efe0c1f7f49aaaad834d037161f7c Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 15 Jul 2024 16:48:15 -0500 Subject: [PATCH 109/115] fix docs build --- adafruit_bme680.py | 4 ++-- docs/conf.py | 6 ++++++ docs/requirements.txt | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index f484f97..e38198e 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -601,7 +601,7 @@ class Adafruit_BME680_I2C(Adafruit_BME680): import board import adafruit_bme680 - Once this is done you can define your `board.I2C` object and define your sensor object + Once this is done you can define your ``board.I2C`` object and define your sensor object .. code-block:: python @@ -688,7 +688,7 @@ class Adafruit_BME680_SPI(Adafruit_BME680): from digitalio import DigitalInOut, Direction import adafruit_bme680 - Once this is done you can define your `board.SPI` object and define your sensor object + Once this is done you can define your ``board.SPI`` object and define your sensor object .. code-block:: python diff --git a/docs/conf.py b/docs/conf.py index b60a1c2..5c68f93 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -20,6 +20,12 @@ "sphinx.ext.viewcode", ] +# Uncomment the below if you use native CircuitPython modules such as +# digitalio, micropython and busio. List the modules you use. Without it, the +# autodoc module docs will fail to generate with a warning. +autodoc_mock_imports = ["micropython"] + + intersphinx_mapping = { "python": ("https://docs.python.org/3", None), "BusDevice": ( diff --git a/docs/requirements.txt b/docs/requirements.txt index 979f568..2887ca5 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -5,3 +5,4 @@ sphinx sphinxcontrib-jquery sphinx-rtd-theme +adafruit-circuitpython-typing From 3d430498bf299ab801edfa2b0f8966834ccb86aa Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 29 Jul 2024 11:16:43 -0500 Subject: [PATCH 110/115] fix precommit copyright --- .pre-commit-config.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ff19dde..f27b786 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries +# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò +# SPDX-FileCopyrightText: 2024 Justin Myers # # SPDX-License-Identifier: Unlicense From b3699460d165875c8542812caf6c8c7b50d17328 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 7 Oct 2024 09:24:05 -0500 Subject: [PATCH 111/115] remove deprecated get_html_theme_path() call Signed-off-by: foamyguy --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 5c68f93..ab4c1a0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,7 +101,6 @@ import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From a04e9ed37830e8ac4125f30e863a499adee26a64 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 7 Nov 2024 09:40:26 -0600 Subject: [PATCH 112/115] timeout if we don't receive new data after too long --- adafruit_bme680.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index e38198e..144b877 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -385,10 +385,13 @@ def _perform_reading(self) -> None: ctrl = (ctrl & 0xFC) | 0x01 # enable single shot! self._write(_BME680_REG_CTRL_MEAS, [ctrl]) new_data = False + start_time = time.monotonic() while not new_data: data = self._read(_BME680_REG_MEAS_STATUS, 17) new_data = data[0] & 0x80 != 0 time.sleep(0.005) + if start_time >= time.monotonic() - 3.0: + raise RuntimeError("Timeout while reading sensor data") self._last_reading = time.monotonic() self._adc_pres = _read24(data[2:5]) / 16 From 42cfd8da712b87ac8cf37a81a6ffeb6865e81794 Mon Sep 17 00:00:00 2001 From: savannahcofer <31944130+savannahcofer@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:32:13 -0500 Subject: [PATCH 113/115] Fix timeout error in adafruit_bme680.py This fixes #76. Line 393 of the library adafruit_bme680.py is written, if start_time >= time.monotonic() - 3.0: raise RuntimeError("Timeout while reading sensor data") However, this is always going to return true and raise a Runtime Error regardless of your timing rate. This commit replaces line of code with the inverse of that, which is looking at the difference between the time.monotonic (the overall time) and the start_time (when you are looking at a new sensor data): if time.monotonic() - start_time >= 3.0: raise RuntimeError("Timeout while reading sensor data") --- adafruit_bme680.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bme680.py b/adafruit_bme680.py index 144b877..0151ad0 100644 --- a/adafruit_bme680.py +++ b/adafruit_bme680.py @@ -390,7 +390,7 @@ def _perform_reading(self) -> None: data = self._read(_BME680_REG_MEAS_STATUS, 17) new_data = data[0] & 0x80 != 0 time.sleep(0.005) - if start_time >= time.monotonic() - 3.0: + if time.monotonic() - start_time >= 3.0: raise RuntimeError("Timeout while reading sensor data") self._last_reading = time.monotonic() From ac537fa6c32c266d06f3bf215c5cd3b7c6d8e695 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 14 Jan 2025 11:32:34 -0600 Subject: [PATCH 114/115] add sphinx configuration to rtd.yaml Signed-off-by: foamyguy --- .readthedocs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 33c2a61..88bca9f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,6 +8,9 @@ # Required version: 2 +sphinx: + configuration: docs/conf.py + build: os: ubuntu-20.04 tools: From 192948913080a1111095918c71f3d7688cfd4dcf Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 4 Jun 2025 10:00:20 -0500 Subject: [PATCH 115/115] update rtd.yml file Signed-off-by: foamyguy --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 88bca9f..255dafd 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -12,7 +12,7 @@ sphinx: configuration: docs/conf.py build: - os: ubuntu-20.04 + os: ubuntu-lts-latest tools: python: "3"