|
9 | 9 | from time import strftime, localtime, tzset, time, sleep
|
10 | 10 | from queue import Queue, Empty
|
11 | 11 | from myDevices import __version__
|
12 |
| -from myDevices.utils.config import Config |
| 12 | +from myDevices.utils.config import Config, APP_SETTINGS, NETWORK_SETTINGS |
13 | 13 | from myDevices.utils.logger import exception, info, warn, error, debug, logJson
|
14 | 14 | from myDevices.sensors import sensors
|
15 | 15 | from myDevices.system.hardware import Hardware
|
16 | 16 | from myDevices.cloud.scheduler import SchedulerEngine
|
17 |
| -from myDevices.cloud.download_speed import DownloadSpeed |
18 | 17 | from myDevices.cloud.updater import Updater
|
19 | 18 | from myDevices.system.systemconfig import SystemConfig
|
20 | 19 | from myDevices.utils.daemon import Daemon
|
|
25 | 24 | from myDevices.cloud.apiclient import CayenneApiClient
|
26 | 25 | import myDevices.cloud.cayennemqtt as cayennemqtt
|
27 | 26 |
|
28 |
| -NETWORK_SETTINGS = '/etc/myDevices/Network.ini' |
29 |
| -APP_SETTINGS = '/etc/myDevices/AppSettings.ini' |
30 | 27 | GENERAL_SLEEP_THREAD = 0.20
|
31 | 28 |
|
| 29 | + |
32 | 30 | def GetTime():
|
33 | 31 | """Return string with the current time"""
|
34 | 32 | tzset()
|
@@ -203,15 +201,14 @@ def Start(self):
|
203 | 201 | self.oSInfo = OSInfo()
|
204 | 202 | self.count = 10000
|
205 | 203 | self.buff = bytearray(self.count)
|
206 |
| - self.downloadSpeed = DownloadSpeed(self.config) |
207 |
| - self.downloadSpeed.getDownloadSpeed() |
208 | 204 | self.sensorsClient.SetDataChanged(self.OnDataChanged)
|
209 | 205 | self.writerThread = WriterThread('writer', self)
|
210 | 206 | self.writerThread.start()
|
211 | 207 | self.processorThread = ProcessorThread('processor', self)
|
212 | 208 | self.processorThread.start()
|
| 209 | + self.systemInfo = [] |
213 | 210 | TimerThread(self.SendSystemInfo, 300)
|
214 |
| - TimerThread(self.SendSystemState, 30, 5) |
| 211 | + # TimerThread(self.SendSystemState, 30, 5) |
215 | 212 | self.updater = Updater(self.config)
|
216 | 213 | self.updater.start()
|
217 | 214 | events = self.schedulerEngine.get_scheduled_events()
|
@@ -244,50 +241,63 @@ def Destroy(self):
|
244 | 241 |
|
245 | 242 | def OnDataChanged(self, data):
|
246 | 243 | """Enqueue a packet containing changed system data to send to the server"""
|
247 |
| - info('Send changed data: {}'.format([{item['channel']:item['value']} for item in data])) |
| 244 | + try: |
| 245 | + if len(data) > 15: |
| 246 | + items = [{item['channel']:item['value']} for item in data if not item['channel'].startswith(cayennemqtt.SYS_GPIO)] |
| 247 | + info('Send changed data: {} + {}'.format(items, cayennemqtt.SYS_GPIO)) |
| 248 | + else: |
| 249 | + info('Send changed data: {}'.format([{item['channel']:item['value']} for item in data])) |
| 250 | + # items = {} |
| 251 | + # gpio_items = {} |
| 252 | + # for item in data: |
| 253 | + # if not item['channel'].startswith(cayennemqtt.SYS_GPIO): |
| 254 | + # items[item['channel']] = item['value'] |
| 255 | + # else: |
| 256 | + # channel = item['channel'].replace(cayennemqtt.SYS_GPIO + ':', '').split(';') |
| 257 | + # if not channel[0] in gpio_items: |
| 258 | + # gpio_items[channel[0]] = str(item['value']) |
| 259 | + # else: |
| 260 | + # gpio_items[channel[0]] += ',' + str(item['value']) |
| 261 | + # info('Send changed data: {}, {}: {}'.format(items, cayennemqtt.SYS_GPIO, gpio_items)) |
| 262 | + except: |
| 263 | + info('Send changed data') |
| 264 | + pass |
248 | 265 | self.EnqueuePacket(data)
|
249 | 266 |
|
250 | 267 | def SendSystemInfo(self):
|
251 | 268 | """Enqueue a packet containing system info to send to the server"""
|
252 | 269 | try:
|
253 |
| - data = [] |
254 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.SYS_OS_NAME, value=self.oSInfo.ID) |
255 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.SYS_OS_VERSION, value=self.oSInfo.VERSION_ID) |
256 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.AGENT_VERSION, value=self.config.get('Agent', 'Version', __version__)) |
257 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.SYS_POWER_RESET, value=0) |
258 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.SYS_POWER_HALT, value=0) |
| 270 | + currentSystemInfo = [] |
| 271 | + cayennemqtt.DataChannel.add(currentSystemInfo, cayennemqtt.SYS_OS_NAME, value=self.oSInfo.ID) |
| 272 | + cayennemqtt.DataChannel.add(currentSystemInfo, cayennemqtt.SYS_OS_VERSION, value=self.oSInfo.VERSION_ID) |
| 273 | + cayennemqtt.DataChannel.add(currentSystemInfo, cayennemqtt.AGENT_VERSION, value=self.config.get('Agent', 'Version', __version__)) |
| 274 | + cayennemqtt.DataChannel.add(currentSystemInfo, cayennemqtt.SYS_POWER_RESET, value=0) |
| 275 | + cayennemqtt.DataChannel.add(currentSystemInfo, cayennemqtt.SYS_POWER_HALT, value=0) |
259 | 276 | config = SystemConfig.getConfig()
|
260 | 277 | if config:
|
261 | 278 | channel_map = {'I2C': cayennemqtt.SYS_I2C, 'SPI': cayennemqtt.SYS_SPI, 'Serial': cayennemqtt.SYS_UART,
|
262 | 279 | 'OneWire': cayennemqtt.SYS_ONEWIRE, 'DeviceTree': cayennemqtt.SYS_DEVICETREE}
|
263 | 280 | for key, channel in channel_map.items():
|
264 | 281 | try:
|
265 |
| - cayennemqtt.DataChannel.add(data, channel, value=config[key]) |
| 282 | + cayennemqtt.DataChannel.add(currentSystemInfo, channel, value=config[key]) |
266 | 283 | except:
|
267 | 284 | pass
|
268 |
| - info('Send system info: {}'.format([{item['channel']:item['value']} for item in data])) |
269 |
| - self.EnqueuePacket(data) |
| 285 | + if currentSystemInfo != self.systemInfo: |
| 286 | + data = currentSystemInfo |
| 287 | + if self.systemInfo: |
| 288 | + data = [x for x in data if x not in self.systemInfo] |
| 289 | + if data: |
| 290 | + self.systemInfo = currentSystemInfo |
| 291 | + info('Send system info: {}'.format([{item['channel']:item['value']} for item in data])) |
| 292 | + self.EnqueuePacket(data) |
270 | 293 | except Exception:
|
271 | 294 | exception('SendSystemInfo unexpected error')
|
272 | 295 |
|
273 |
| - def SendSystemState(self): |
274 |
| - """Enqueue a packet containing system information to send to the server""" |
275 |
| - try: |
276 |
| - data = [] |
277 |
| - download_speed = self.downloadSpeed.getDownloadSpeed() |
278 |
| - if download_speed: |
279 |
| - cayennemqtt.DataChannel.add(data, cayennemqtt.SYS_NET, suffix=cayennemqtt.SPEEDTEST, value=download_speed, type='bw', unit='mbps') |
280 |
| - data += self.sensorsClient.systemData |
281 |
| - info('Send system state: {} items'.format(len(data))) |
282 |
| - self.EnqueuePacket(data) |
283 |
| - except Exception as e: |
284 |
| - exception('ThreadSystemInfo unexpected error: ' + str(e)) |
285 |
| - |
286 | 296 | def CheckSubscription(self):
|
287 | 297 | """Check that an invite code is valid"""
|
288 | 298 | inviteCode = self.config.get('Agent', 'InviteCode', fallback=None)
|
289 | 299 | if not inviteCode:
|
290 |
| - error('No invite code found in {}'.format(APP_SETTINGS)) |
| 300 | + error('No invite code found in {}'.format(self.config.path)) |
291 | 301 | print('Please input an invite code. This can be retrieved from the Cayenne dashboard by adding a new Raspberry Pi device.\n'
|
292 | 302 | 'The invite code will be part of the script name shown there: rpi_[invitecode].sh.')
|
293 | 303 | inviteCode = input('Invite code: ')
|
|
0 commit comments