Exemple #1
0
 def SensorsInfo(self):
     """Return a list with current sensor states for all enabled sensors"""
     manager.deviceDetector()
     devices = manager.getDeviceList()
     sensors_info = []
     if devices is None:
         return sensors_info
     for device in devices:
         sensor = instance.deviceInstance(device['name'])
         if 'enabled' not in device or device['enabled'] == 1:
             sensor_types = {'Temperature': {'function': 'getCelsius', 'data_args': {'type': 'temp', 'unit': 'c'}},
                             'Humidity': {'function': 'getHumidityPercent', 'data_args': {'type': 'rel_hum', 'unit': 'p'}},
                             'Pressure': {'function': 'getPascal', 'data_args': {'type': 'bp', 'unit': 'pa'}},
                             'Luminosity': {'function': 'getLux', 'data_args': {'type': 'lum', 'unit': 'lux'}},
                             'Distance': {'function': 'getCentimeter', 'data_args': {'type': 'prox', 'unit': 'cm'}},
                             'ServoMotor': {'function': 'readAngle', 'data_args': {'type': 'analog_actuator'}},
                             'DigitalSensor': {'function': 'read', 'data_args': {'type': 'digital_sensor', 'unit': 'd'}},
                             'DigitalActuator': {'function': 'read', 'data_args': {'type': 'digital_actuator', 'unit': 'd'}},
                             'AnalogSensor': {'function': 'readFloat', 'data_args': {'type': 'analog_sensor'}},
                             'AnalogActuator': {'function': 'readFloat', 'data_args': {'type': 'analog_actuator'}}}
             extension_types = {'ADC': {'function': 'analogReadAllFloat'},
                                 'DAC': {'function': 'analogReadAllFloat'},
                                 'PWM': {'function': 'pwmWildcard'},
                                 'GPIOPort': {'function': 'wildcard'}}
             for device_type in device['type']:
                 try:
                     display_name = device['description']
                 except:
                     display_name = None
                 if device_type in sensor_types:
                     try:
                         sensor_type = sensor_types[device_type]
                         func = getattr(sensor, sensor_type['function'])
                         if len(device['type']) > 1:
                             channel = '{}:{}'.format(device['name'], device_type.lower())
                         else:
                             channel = device['name']
                         cayennemqtt.DataChannel.add(sensors_info, cayennemqtt.DEV_SENSOR, channel, value=self.CallDeviceFunction(func), name=display_name, **sensor_type['data_args'])
                     except:
                         exception('Failed to get sensor data: {} {}'.format(device_type, device['name']))
                 else:
                     try:
                         extension_type = extension_types[device_type]
                         func = getattr(sensor, extension_type['function'])
                         values = self.CallDeviceFunction(func)
                         for pin, value in values.items():
                             cayennemqtt.DataChannel.add(sensors_info, cayennemqtt.DEV_SENSOR, device['name'] + ':' + str(pin), cayennemqtt.VALUE, value, name=display_name)
                     except:
                         exception('Failed to get extension data: {} {}'.format(device_type, device['name']))
     logJson('Sensors info: {}'.format(sensors_info))
     return sensors_info
Exemple #2
0
 def UpdateSchedules(self, jsonData):
     retValue = True
     logJson('UpdateSchedules' + str(jsonData), 'schedules')
     info('Schedules updated from cloud...')
     try:
         with self.mutex:
             jsonSchedules = jsonData['Schedules']
             self.RemoveSchedules()
             for item in jsonSchedules:
                 self.AddScheduledItem(item['Schedule'], True)
     except:
         exception('UpdateSchedules Failed')
         retValue = False
     return retValue
Exemple #3
0
 def BuildPT_SYSTEM_INFO(self):
     try:
         data = {}
         data['MachineName'] = self.MachineId
         data['PacketType'] = PacketTypes.PT_SYSTEM_INFO.value
         data['Timestamp'] = int(time())
         data['IpAddress'] = self.PublicIP
         data['GatewayMACAddress'] = self.hardware.getMac()
         raspberryValue = {}
         raspberryValue['NetworkSpeed'] = str(
             self.downloadSpeed.getDownloadSpeed())
         raspberryValue['AntiVirus'] = 'None'
         raspberryValue['Firewall'] = 'iptables'
         raspberryValue['FirewallEnabled'] = 'true'
         raspberryValue['ComputerMake'] = self.hardware.getManufacturer()
         raspberryValue['ComputerModel'] = self.hardware.getModel()
         raspberryValue['OsName'] = self.oSInfo.ID
         raspberryValue['OsBuild'] = self.oSInfo.ID_LIKE if hasattr(
             self.oSInfo, 'ID_LIKE') else self.oSInfo.ID
         raspberryValue['OsArchitecture'] = self.hardware.Revision
         raspberryValue['OsVersion'] = self.oSInfo.VERSION_ID
         raspberryValue['ComputerName'] = self.machineName
         raspberryValue['AgentVersion'] = self.config.get(
             'Agent', 'Version', fallback='1.0.1.0')
         raspberryValue['InstallDate'] = self.installDate
         raspberryValue['GatewayMACAddress'] = self.hardware.getMac()
         with self.sensorsClient.sensorMutex:
             raspberryValue[
                 'SystemInfo'] = self.sensorsClient.currentSystemInfo
             raspberryValue[
                 'SensorsInfo'] = self.sensorsClient.currentSensorsInfo
             raspberryValue['BusInfo'] = self.sensorsClient.currentBusInfo
         raspberryValue['OsSettings'] = RaspiConfig.getConfig()
         raspberryValue['NetworkId'] = WifiManager.Network.GetNetworkId()
         raspberryValue['WifiStatus'] = self.wifiManager.GetStatus()
         try:
             history = History()
             history.SaveAverages(raspberryValue)
         except:
             exception('History error')
         data['RaspberryInfo'] = raspberryValue
         self.EnqueuePacket(data)
         logJson('PT_SYSTEM_INFO: ' + dumps(data), 'PT_SYSTEM_INFO')
         del raspberryValue
         del data
         data = None
     except Exception as e:
         exception('ThreadSystemInfo unexpected error: ' + str(e))
     Debug()
Exemple #4
0
 def update_scheduled_events(self, events):
     """Update all scheduled events
     
     events: list of all the new events to schedule"""
     logJson('Update schedules:  {}'.format(events))
     debug('Updating schedules')
     try:
         with self.mutex:
             self.remove_scheduled_events()
             for event in events:
                 self.add_scheduled_event(event, True)
     except:
         exception('Failed to update scheduled events')
         result = False
     return True
Exemple #5
0
 def SendMessage(self, message):
     logJson(message, 'SendMessage')
     ret = True
     if self.connected == False:
         error('SendMessage fail')
         ret = False
     else:
         try:
             data = bytes(message, 'UTF-8')
             max_size = 16383
             if len(data) > max_size:
                 start = 0
                 current = max_size
                 end = len(data)
                 self.wrappedSocket.send(data[start:current])
                 while current < end:
                     start = current
                     current = start + max_size if start + max_size < end else end
                     self.wrappedSocket.send(data[start:current])
             else:
                 self.wrappedSocket.send(data)
             if self.onMessageSent:
                 self.onMessageSent(message)
             message = None
         except socket_error as serr:
             error('SendMessage:' + str(serr))
             ret = False
             Daemon.OnFailure('cloud', serr.errno)
             sleep(1)
         except IOError as ioerr:
             debug('IOError: ' + str(ioerr))
             self.Restart()
             #Daemon.OnFailure('cloud', ioerr.errno)
         except socket_error as serr:
             Daemon.OnFailure('cloud', serr.errno)
         except:
             exception('SendMessage error')
     return ret
Exemple #6
0
 def SensorsInfo(self):
     with self.sensorMutex:
         devices = self.GetDevices()
         debug(
             str(time()) + ' Got devices info ' +
             str(self.sensorsRefreshCount))
         if devices is None:
             return {}
         for value in devices:
             sensor = instance.deviceInstance(value['name'])
             if 'enabled' not in value or value['enabled'] == 1:
                 sleep(SENSOR_INFO_SLEEP)
                 try:
                     if value['type'] == 'Temperature':
                         value['Celsius'] = self.CallDeviceFunction(
                             sensor.getCelsius)
                         value['Fahrenheit'] = self.CallDeviceFunction(
                             sensor.getFahrenheit)
                         value['Kelvin'] = self.CallDeviceFunction(
                             sensor.getKelvin)
                     if value['type'] == 'Pressure':
                         value['Pascal'] = self.CallDeviceFunction(
                             sensor.getPascal)
                     if value['type'] == 'Luminosity':
                         value['Lux'] = self.CallDeviceFunction(
                             sensor.getLux)
                     if value['type'] == 'Distance':
                         value['Centimeter'] = self.CallDeviceFunction(
                             sensor.getCentimeter)
                         value['Inch'] = self.CallDeviceFunction(
                             sensor.getInch)
                     if value['type'] in ('ADC', 'DAC', 'PWM'):
                         value['channelCount'] = self.CallDeviceFunction(
                             sensor.analogCount)
                         value['maxInteger'] = self.CallDeviceFunction(
                             sensor.analogMaximum)
                         value['resolution'] = self.CallDeviceFunction(
                             sensor.analogResolution)
                         value['allInteger'] = self.CallDeviceFunction(
                             sensor.analogReadAll)
                         value['allVolt'] = self.CallDeviceFunction(
                             sensor.analogReadAllVolt)
                         value['allFloat'] = self.CallDeviceFunction(
                             sensor.analogReadAllFloat)
                         if value['type'] in ('DAC'):
                             value['vref'] = self.CallDeviceFunction(
                                 sensor.analogReference)
                     if value['type'] == 'PWM':
                         value['channelCount'] = self.CallDeviceFunction(
                             sensor.pwmCount)
                         value['maxInteger'] = self.CallDeviceFunction(
                             sensor.pwmMaximum)
                         value['resolution'] = self.CallDeviceFunction(
                             sensor.pwmResolution)
                         value['all'] = self.CallDeviceFunction(
                             sensor.pwmWildcard)
                     if value['type'] == 'Humidity':
                         value['float'] = self.CallDeviceFunction(
                             sensor.getHumidity)
                         value['percent'] = self.CallDeviceFunction(
                             sensor.getHumidityPercent)
                     if value['type'] == 'PiFaceDigital':
                         value['all'] = self.CallDeviceFunction(
                             sensor.readAll)
                     if value['type'] in ('DigitalSensor',
                                          'DigitalActuator'):
                         value['value'] = self.CallDeviceFunction(
                             sensor.read)
                     if value['type'] == 'GPIOPort':
                         value['channelCount'] = self.CallDeviceFunction(
                             sensor.digitalCount)
                         value['all'] = self.CallDeviceFunction(
                             sensor.wildcard)
                     if value['type'] == 'AnalogSensor':
                         value['integer'] = self.CallDeviceFunction(
                             sensor.read)
                         value['float'] = self.CallDeviceFunction(
                             sensor.readFloat)
                         value['volt'] = self.CallDeviceFunction(
                             sensor.readVolt)
                     if value['type'] == 'ServoMotor':
                         value['angle'] = self.CallDeviceFunction(
                             sensor.readAngle)
                     if value['type'] == 'AnalogActuator':
                         value['float'] = self.CallDeviceFunction(
                             sensor.readFloat)
                 except:
                     exception("Sensor values failed: " + value['type'] +
                               " " + value['name'])
             try:
                 if 'hash' in value:
                     value['sensor'] = value['hash']
                     del value['hash']
             except KeyError:
                 pass
         if self.currentSensorsInfo:
             del self.currentSensorsInfo
             self.currentSensorsInfo = None
         self.currentSensorsInfo = devices
         devices = None
     if self.sensorsRefreshCount == 0:
         info('System sensors info at start ' +
              str(self.currentSensorsInfo))
     debug(('New sensors info retrieved: {}').format(
         self.sensorsRefreshCount))
     logJson('Sensors Info updated: ' + str(self.currentSensorsInfo))
     return self.currentSensorsInfo
Exemple #7
0
 def CalculateSensorsInfoAverages(self, current_avgs, new_sample, count_sensor):
     try:
         logJson('History SensorsInfo average: '  + str(new_sample), 'history')
         info('Calculate sensor info averages: ' + str(count_sensor))
         if not new_sample:
             info('History average: New sample is empty.')
             return
         if 'SensorsInfo' in new_sample:
             #print('Calculating sensors list: ' + str(new_sample))
             #newSensorsDictionary = dict((i['sensor'], i) for i in data['SensorsInfo'])
             if 'SensorsInfo' not in current_avgs:
                 current_avgs['SensorsInfo'] = []
                 count_sensor['SensorsInfo'] = {}
             averageSensorsDictionary = {}
             if len(current_avgs['SensorsInfo']) > 0:
                 averageSensorsDictionary = dict((i['sensor'], i) for i in current_avgs['SensorsInfo'])
             if new_sample['SensorsInfo']:
                 for value in new_sample['SensorsInfo']:
                     if 'enabled' in value and value['enabled'] == 0:
                         continue
                     if value['sensor'] in averageSensorsDictionary:
                         #this means we need to calculate average
                         try:
                             if value['sensor'] not in count_sensor['SensorsInfo']:
                                 count_sensor['SensorsInfo'][value['sensor']] = 0
                             count_sensor['SensorsInfo'][value['sensor']] += 1
                             if value['type'] == 'Temperature':
                                 averageSensorsDictionary[value['sensor']]['Celsius'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Celsius'], value['Celsius'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['Fahrenheit'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Fahrenheit'], value['Fahrenheit'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['Kelvin'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Kelvin'], value['Kelvin'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'Pressure':
                                 averageSensorsDictionary[value['sensor']]['Pascal'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Pascal'], value['Pascal'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'Luminosity':
                                 averageSensorsDictionary[value['sensor']]['Lux'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Lux'], value['Lux'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'Distance':
                                 averageSensorsDictionary[value['sensor']]['Centimeter'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Centimeter'], value['Centimeter'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['Inch'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['Inch'], value['Inch'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             ############################################################################################################
                             #averages for all fields that are arrays of values should not be done
                             # if value['type'] in ('ADC', 'DAC', 'PWM'):
                             #     #never do average for : channelCount, maxInteger, resolution
                             #     if value['type'] in ('ADC', 'DAC'):
                             #         averageSensorsDictionary[value['sensor']]['allInteger'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['allInteger'], value['allInteger'], count_sensor['SensorsInfo'][value['sensor']])
                             #         averageSensorsDictionary[value['sensor']]['allVolt'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['allVolt'], value['allVolt'], count_sensor['SensorsInfo'][value['sensor']])
                             #         averageSensorsDictionary[value['sensor']]['allFloat'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['allFloat'], value['allFloat'], count_sensor['SensorsInfo'][value['sensor']])
                             #     if value['type'] in ('PWM'):
                             #         averageSensorsDictionary[value['sensor']]['all'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['all'], value['all'], count_sensor['SensorsInfo'][value['sensor']])
                             # if value['type'] == 'GPIOPort':
                             #     #never do average for: channelCount
                             #     averageSensorsDictionary[value['sensor']]['all'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['all'], value['all'], count_sensor['SensorsInfo'][value['sensor']])
                             # if value['type'] == 'PiFaceDigital':
                             #     averageSensorsDictionary[value['sensor']]['all'] = self.CalculateArrayAverage(averageSensorsDictionary[value['sensor']]['all'], value['all'], count_sensor['SensorsInfo'][value['sensor']])
                             ############################################################################################################          
                             if value['type'] == 'Humidity':
                                 averageSensorsDictionary[value['sensor']]['float'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['float'], value['float'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['percent'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['percent'], value['percent'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] in ('DigitalSensor', 'DigitalActuator'):
                                 averageSensorsDictionary[value['sensor']]['value'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['value'], value['value'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'AnalogSensor':
                                 averageSensorsDictionary[value['sensor']]['float'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['float'], value['float'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['integer'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['integer'], value['integer'], count_sensor['SensorsInfo'][value['sensor']] ) 
                                 averageSensorsDictionary[value['sensor']]['volt'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['volt'], value['volt'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'ServoMotor':
                                 averageSensorsDictionary[value['sensor']]['angle'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['angle'], value['angle'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             if value['type'] == 'AnalogActuator':
                                 averageSensorsDictionary[value['sensor']]['float'] = self.CalculateAverage(averageSensorsDictionary[value['sensor']]['float'], value['float'], count_sensor['SensorsInfo'][value['sensor']] ) 
                             #else:
                             #    current_avgs['SensorsInfo'].append(value)
                             #    count_sensor['SensorsInfo'][value['sensor']] = 1
                         except:
                             exception('Error calculating sensors info averages for: ' + str(value))
                     else:
                         current_avgs['SensorsInfo'].append(value)
                         count_sensor['SensorsInfo'][value['sensor']] = 1
     except:
         exception('Error calculating sensors info averages: current_avgs {}, new_sample {} '.format(current_avgs, new_sample))