diff --git a/.pylintrc b/.pylintrc index 039eaec..d8f0ee8 100644 --- a/.pylintrc +++ b/.pylintrc @@ -52,7 +52,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 +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 # 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 diff --git a/README.rst b/README.rst index 4e178db..69d1f2b 100644 --- a/README.rst +++ b/README.rst @@ -28,11 +28,8 @@ This is easily achieved by downloading Installing from PyPI ===================== -.. note:: This library is not available on PyPI yet. Install documentation is included - as a standard element. Stay tuned for PyPI availability! - -.. todo:: Remove the above note if PyPI version is/will be available at time of release. - If the library is not planned for PyPI, remove the entire 'Installing from PyPI' section. +.. note:: Only the bridge examples work on Raspberry Pi because Blinka `_bleio` doesn't support + advertising, only scanning. On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from PyPI `_. To install for current user: @@ -59,7 +56,7 @@ To install in a virtual environment in your current project: Usage Example ============= -.. todo:: Add a quick, simple example. It and other examples should live in the examples folder and be included in docs/examples.rst. +Add a secrets.py file and then run ``ble_broadcastnet_blinka_bridge.py``. Contributing ============ diff --git a/adafruit_ble_broadcastnet.py b/adafruit_ble_broadcastnet.py index 59f0fba..30378e5 100644 --- a/adafruit_ble_broadcastnet.py +++ b/adafruit_ble_broadcastnet.py @@ -31,10 +31,10 @@ Basic IOT over BLE advertisements. import struct import time +from micropython import const import adafruit_ble from adafruit_ble.advertising import Advertisement, LazyObjectField from adafruit_ble.advertising.standard import ManufacturerData, ManufacturerDataField -from micropython import const __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BLE_BroadcastNet.git" @@ -58,8 +58,8 @@ def broadcast(measurement, *, broadcast_time=0.1, extended=False): device_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}".format( # pylint: disable=invalid-name *reversed( - list(_ble._adapter.address.address_bytes) - ) # pylint: disable=protected-access + list(_ble._adapter.address.address_bytes) # pylint: disable=protected-access + ) ) """Device address as a string.""" diff --git a/docs/index.rst b/docs/index.rst index 148ac2d..da0358f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,14 +23,15 @@ Table of Contents .. toctree:: :caption: Tutorials -.. todo:: Add any Learn guide links here. If there are none, then simply delete this todo and leave - the toctree above for use later. - .. toctree:: :caption: Related Products -.. todo:: Add any product links here. If there are none, then simply delete this todo and leave - the toctree above for use later. + Raspberry Pi 3B + Raspberry Pi 3B+ + Raspberry Pi Zero W + Raspberry Pi 4B 1GB + Raspberry Pi 4B 2GB + Raspberry Pi 4B 4GB .. toctree:: :caption: Other Links diff --git a/examples/ble_broadcastnet_battery_level.py b/examples/ble_broadcastnet_battery_level.py index c3e7ba1..f5ce3ca 100644 --- a/examples/ble_broadcastnet_battery_level.py +++ b/examples/ble_broadcastnet_battery_level.py @@ -1,9 +1,8 @@ -import adafruit_ble_broadcastnet +import time import analogio import board -import math import microcontroller -import time +import adafruit_ble_broadcastnet print("This is BroadcastNet sensor:", adafruit_ble_broadcastnet.device_address) @@ -13,10 +12,15 @@ divider_ratio = 2 while True: measurement = adafruit_ble_broadcastnet.AdafruitSensorMeasurement() battery_voltage = ( - battery.value / 2 ** 16 * divider_ratio * battery.reference_voltage + battery.value + / 2 ** 16 + * divider_ratio + * battery.reference_voltage # pylint: disable=no-member ) measurement.battery_voltage = int(battery_voltage * 1000) - measurement.temperature = microcontroller.cpu.temperature + measurement.temperature = ( + microcontroller.cpu.temperature # pylint: disable=no-member + ) print(measurement) adafruit_ble_broadcastnet.broadcast(measurement) diff --git a/examples/ble_broadcastnet_battery_level_neopixel.py b/examples/ble_broadcastnet_battery_level_neopixel.py index c83ffd7..8bd9b20 100644 --- a/examples/ble_broadcastnet_battery_level_neopixel.py +++ b/examples/ble_broadcastnet_battery_level_neopixel.py @@ -1,10 +1,9 @@ -import adafruit_ble_broadcastnet +import time import analogio import board -import math import microcontroller import neopixel -import time +import adafruit_ble_broadcastnet print("This is BroadcastNet sensor:", adafruit_ble_broadcastnet.device_address) @@ -16,7 +15,10 @@ pixel = neopixel.NeoPixel(board.NEOPIXEL, 1) while True: measurement = adafruit_ble_broadcastnet.AdafruitSensorMeasurement() battery_voltage = ( - battery.value / 2 ** 16 * divider_ratio * battery.reference_voltage + battery.value + / 2 ** 16 + * divider_ratio + * battery.reference_voltage # pylint: disable=no-member ) r = 16 - int(((battery_voltage - 3.6) / 0.6) * 16) r = min(16, max(r, 0)) @@ -24,7 +26,9 @@ while True: g = min(16, max(g, 0)) pixel[0] = r << 16 | g << 8 measurement.battery_voltage = int(battery_voltage * 1000) - measurement.temperature = microcontroller.cpu.temperature + measurement.temperature = ( + microcontroller.cpu.temperature # pylint: disable=no-member + ) print(measurement) adafruit_ble_broadcastnet.broadcast(measurement) pixel[0] = 0 diff --git a/examples/ble_broadcastnet_wifi_bridge.py b/examples/ble_broadcastnet_blinka_bridge.py similarity index 84% rename from examples/ble_broadcastnet_wifi_bridge.py rename to examples/ble_broadcastnet_blinka_bridge.py index 68d2741..e700b55 100644 --- a/examples/ble_broadcastnet_wifi_bridge.py +++ b/examples/ble_broadcastnet_blinka_bridge.py @@ -1,35 +1,10 @@ +"""This example bridges from BLE to Adafruit IO on a Raspberry Pi.""" +from secrets import secrets # pylint: disable=no-name-in-module import time +import requests from adafruit_ble.advertising.standard import ManufacturerDataField import adafruit_ble import adafruit_ble_broadcastnet -from secrets import secrets -import sys - -if sys.implementation.name == "cpython": - import requests -else: - from adafruit_esp32spi import adafruit_esp32spi - from adafruit_esp32spi import adafruit_esp32spi_wifimanager - - import board - import busio - from digitalio import DigitalInOut - import adafruit_dotstar - - esp32_cs = DigitalInOut(board.D13) - esp32_ready = DigitalInOut(board.D11) - esp32_reset = DigitalInOut(board.D12) - - spi = busio.SPI(board.SCK, board.MOSI, board.MISO) - esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) - # esp._debug = 1 - - status_light = adafruit_dotstar.DotStar( - board.APA102_SCK, board.APA102_MOSI, 1, brightness=0.2 - ) - requests = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager( - esp, secrets, status_light - ) aio_auth_header = {"X-AIO-KEY": secrets["aio_key"]} aio_base_url = "https://io.adafruit.com/api/v2/" + secrets["aio_username"] @@ -45,6 +20,10 @@ def aio_get(path, **kwargs): return requests.get(aio_base_url + path, **kwargs) +# Disable outer names check because we frequently collide. +# pylint: disable=redefined-outer-name + + def create_group(name): response = aio_post("/groups", json={"name": name}) if response.status_code != 201: @@ -102,7 +81,8 @@ def convert_to_feed_data(values, attribute_name, attribute_instance): ble = adafruit_ble.BLERadio() -print("This is BroadcastNet bridge:", adafruit_ble_broadcastnet.device_address) +bridge_address = adafruit_ble_broadcastnet.device_address +print("This is BroadcastNet bridge:", bridge_address) print() print("Fetching existing feeds.") @@ -139,7 +119,6 @@ for measurement in ble.start_scan( # Skip if we are getting the same broadcast more than once. if measurement.sequence_number == sequence_numbers[sensor_address]: continue - # print(sensor_address, measurement, measurement.sequence_number, sequence_numbers[sensor_address]) number_missed = measurement.sequence_number - sequence_numbers[sensor_address] - 1 if number_missed < 0: number_missed += 256 diff --git a/examples/ble_broadcastnet_expo_backoff.py b/examples/ble_broadcastnet_expo_backoff.py index 13f4758..9cd597b 100644 --- a/examples/ble_broadcastnet_expo_backoff.py +++ b/examples/ble_broadcastnet_expo_backoff.py @@ -3,12 +3,12 @@ report. When doing a report it will actually do multiple broadcasts and wait 2 ** n readings until the next broadcast. The delay is reset every time the temp moves more than 1 degree.""" -import adafruit_ble_broadcastnet +import math +import time import analogio import board -import math import microcontroller -import time +import adafruit_ble_broadcastnet print("This is BroadcastNet sensor:", adafruit_ble_broadcastnet.device_address) @@ -18,7 +18,7 @@ divider_ratio = 2 last_temperature = None consecutive = 1 while True: - temp = microcontroller.cpu.temperature + temp = microcontroller.cpu.temperature # pylint: disable=no-member if not last_temperature or abs(temp - last_temperature) > 1: consecutive = 1 last_temperature = temp @@ -31,7 +31,10 @@ while True: if 2 ** exp == consecutive: measurement = adafruit_ble_broadcastnet.AdafruitSensorMeasurement() battery_voltage = ( - battery.value / 2 ** 16 * divider_ratio * battery.reference_voltage + battery.value + / 2 ** 16 + * divider_ratio + * battery.reference_voltage # pylint: disable=no-member ) measurement.battery_voltage = int(battery_voltage * 1000) measurement.temperature = temp diff --git a/examples/ble_broadcastnet_multisensor.py b/examples/ble_broadcastnet_multisensor.py index 2fc1f2b..00a1710 100644 --- a/examples/ble_broadcastnet_multisensor.py +++ b/examples/ble_broadcastnet_multisensor.py @@ -1,13 +1,14 @@ """This is a complex sensor node that uses the sensors on a Clue and Feather Bluefruit Sense.""" +import time import board import adafruit_bmp280 import adafruit_sht31d -import adafruit_apds9960.apds9960 + +# import adafruit_apds9960.apds9960 import adafruit_lis3mdl import adafruit_lsm6ds import adafruit_ble_broadcastnet -import time print("This is BroadcastNet sensor:", adafruit_ble_broadcastnet.device_address) diff --git a/examples/ble_broadcastnet_simpletest.py b/examples/ble_broadcastnet_simpletest.py index 3dde973..08d91dc 100644 --- a/examples/ble_broadcastnet_simpletest.py +++ b/examples/ble_broadcastnet_simpletest.py @@ -1,15 +1,17 @@ """This is a basic sensor node that uses the internal temperature sensor and reports it every 10 seconds.""" -import adafruit_ble_broadcastnet -import microcontroller import time +import microcontroller +import adafruit_ble_broadcastnet print("This is BroadcastNet sensor:", adafruit_ble_broadcastnet.device_address) while True: measurement = adafruit_ble_broadcastnet.AdafruitSensorMeasurement() - measurement.temperature = microcontroller.cpu.temperature + measurement.temperature = ( + microcontroller.cpu.temperature # pylint: disable=no-member + ) print(measurement) adafruit_ble_broadcastnet.broadcast(measurement) time.sleep(10)