6
6
from adafruit_esp32spi import adafruit_esp32spi
7
7
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
8
8
from secrets import secrets
9
- from adafruit_ble import BLERadio
10
-
11
- from adafruit_ble .advertising import Advertisement , LazyObjectField
12
- from adafruit_ble .advertising .standard import ManufacturerData , ManufacturerDataField
13
- import struct
14
- import collections
15
-
16
- _MANUFACTURING_DATA_ADT = const (0xff )
17
- _ADAFRUIT_COMPANY_ID = const (0x0822 )
18
- _SENSOR_DATA_ID = const (0x0002 )
19
-
20
- class AdafruitSensorMeasurement (Advertisement ):
21
- """Broadcast a single RGB color."""
22
- # This prefix matches all
23
- prefix = struct .pack ("<BBH" ,
24
- 3 ,
25
- _MANUFACTURING_DATA_ADT ,
26
- _ADAFRUIT_COMPANY_ID )
27
-
28
- manufacturer_data = LazyObjectField (ManufacturerData ,
29
- "manufacturer_data" ,
30
- advertising_data_type = _MANUFACTURING_DATA_ADT ,
31
- company_id = _ADAFRUIT_COMPANY_ID ,
32
- key_encoding = "<H" )
33
-
34
- sequence_number = ManufacturerDataField (0x0003 , "<B" )
35
- """Color to broadcast as RGB integer."""
36
-
37
- temperature = ManufacturerDataField (0x0a00 , "<f" )
38
- """Color to broadcast as RGB integer."""
39
-
40
- def __init__ (self , * , sensor_device_id = 0xff , sequence_number = 0xff ):
41
- super ().__init__ ()
42
- # self.sensor_device_id = sensor_device_id
43
- # self.sequence_number = sequence_number
44
-
45
- def __str__ (self ):
46
- parts = []
47
- for attr in dir (self .__class__ ):
48
- attribute_instance = getattr (self .__class__ , attr )
49
- if issubclass (attribute_instance .__class__ , ManufacturerDataField ):
50
- value = getattr (self , attr )
51
- if value is not None :
52
- parts .append ("{}={}" .format (attr , str (value )))
53
- return "<{} {} >" .format (self .__class__ .__name__ , " " .join (parts ))
9
+ from adafruit_ble .advertising .standard import ManufacturerDataField
10
+ import adafruit_ble
11
+ import adafruit_ble_broadcastnet
54
12
55
13
esp32_cs = DigitalInOut (board .D13 )
56
14
esp32_ready = DigitalInOut (board .D11 )
@@ -84,6 +42,8 @@ def create_group(name):
84
42
def create_feed (group_key , name ):
85
43
response = aio_post ("/groups/{}/feeds" .format (group_key ), json = {"feed" : {"name" : name }})
86
44
if response .status_code != 201 :
45
+ print (name )
46
+ print (response .content )
87
47
print (response .status_code )
88
48
raise RuntimeError ("unable to create new feed" )
89
49
return response .json ()["key" ]
@@ -99,20 +59,22 @@ def create_data(group_key, data):
99
59
raise RuntimeError ("unable to create new data" )
100
60
response .close ()
101
61
102
- def convert_to_feed_data (values , attribute_name ):
62
+ def convert_to_feed_data (values , attribute_name , attribute_instance ):
103
63
feed_data = []
104
- if not isinstance (values , tuple ) or hasattr (values , "_fields" ):
64
+ # Wrap single value entries for enumeration.
65
+ if (not isinstance (values , tuple ) or
66
+ (attribute_instance .element_count > 1 and not isinstance (values [0 ], tuple ))):
105
67
values = (values , )
106
68
for i , value in enumerate (values ):
107
- key = attribute_name + str (i )
69
+ key = attribute_name . replace ( "_" , "-" ) + "-" + str (i )
108
70
if isinstance (value , tuple ):
109
- for field in value . _fields :
110
- feed_data .append ({"key" : key + field , "value" : getattr ( value , field ) })
71
+ for j in range ( attribute_instance . element_count ) :
72
+ feed_data .append ({"key" : key + "-" + attribute_instance . field_names [ j ] , "value" : value [ j ] })
111
73
else :
112
74
feed_data .append ({"key" : key , "value" : value })
113
75
return feed_data
114
76
115
- ble = BLERadio ()
77
+ ble = adafruit_ble . BLERadio ()
116
78
address = ble ._adapter .address
117
79
bridge_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}" .format (* address .address_bytes )
118
80
print ("This is BroadcastNet bridge:" , bridge_address )
@@ -132,17 +94,17 @@ def convert_to_feed_data(values, attribute_name):
132
94
133
95
print (existing_feeds )
134
96
135
- counter = 0
136
-
137
- ble = BLERadio ()
138
97
print ("scanning" )
139
98
sequence_numbers = {}
140
99
# By providing Advertisement as well we include everything, not just specific advertisements.
141
- for measurement in ble .start_scan (AdafruitSensorMeasurement ):
100
+ for measurement in ble .start_scan (adafruit_ble_broadcastnet . AdafruitSensorMeasurement ):
142
101
sensor_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}" .format (* measurement .address .address_bytes )
143
- print (sensor_address , measurement )
144
102
if sensor_address not in sequence_numbers :
145
103
sequence_numbers [sensor_address ] = measurement .sequence_number - 1 % 256
104
+ # Skip if we are getting the same broadcast more than once.
105
+ if measurement .sequence_number == sequence_numbers [sensor_address ]:
106
+ continue
107
+ print (sensor_address , measurement )
146
108
number_missed = measurement .sequence_number - sequence_numbers [sensor_address ] - 1
147
109
if number_missed < 0 :
148
110
number_missed += 256
@@ -161,8 +123,8 @@ def convert_to_feed_data(values, attribute_name):
161
123
if issubclass (attribute_instance .__class__ , ManufacturerDataField ):
162
124
if attribute != "sequence_number" :
163
125
values = getattr (measurement , attribute )
164
-
165
- data .extend (convert_to_feed_data (values , attribute ))
126
+ if values is not None :
127
+ data .extend (convert_to_feed_data (values , attribute , attribute_instance ))
166
128
167
129
for feed_data in data :
168
130
if feed_data ["key" ] not in existing_feeds [sensor_address ]:
@@ -177,3 +139,22 @@ def convert_to_feed_data(values, attribute_name):
177
139
print ()
178
140
179
141
print ("scan done" )
142
+
143
+ # while True:
144
+ # try:
145
+ # print("Posting data...", end='')
146
+ # data = counter
147
+ # response = aio_post("/feeds/test/data", json={'value':data})
148
+ # if response.status_code == 404:
149
+ # response = aio_post("/feeds", json={'feed': {"name": "test"}})
150
+ # print("error", response.status_code)
151
+ # print(dir(response), response.socket)
152
+ # json = response.json()
153
+ # counter = counter + 1
154
+ # print("OK")
155
+ # except (ValueError, RuntimeError) as e:
156
+ # print("Failed to get data, retrying\n", e)
157
+ # wifi.reset()
158
+ # continue
159
+ # response = None
160
+ # time.sleep(15)
0 commit comments