예제 #1
0
def to_cayenne_lpp(data):
    """Serialize plain data dictionary to binary CayenneLPP format.

    :param data: 

    """

    from cayennelpp import LppFrame
    frame = LppFrame()

    for key, value in data.items():

        # TODO: Maybe implement different naming conventions.
        name = key.split("_")[0]
        try:
            channel = int(key.split("_")[1])
        except IndexError:
            channel = 0

        if "temperature" in name:
            frame.add_temperature(channel, value)
        elif "digital-input" in name:
            frame.add_digital_input(channel, value)
        elif "digital_output" in name:
            frame.add_digital_output(channel, value)
        elif "analog-input" in name:
            frame.add_analog_input(channel, value)
        elif "analog-output" in name:
            frame.add_analog_output(channel, value)
        elif "illuminance" in name:
            frame.add_illuminance(channel, value)
        elif "presence" in name:
            frame.add_presence(channel, value)
        elif "humidity" in name:
            frame.add_humidity(channel, value)
        elif "accelerometer" in name:
            frame.add_accelerometer(channel, value)
        elif "barometer" in name:
            frame.add_barometer(channel, value)
        elif "gyrometer" in name:
            frame.add_gyrometer(channel, value)
        elif "gps" in name:
            frame.add_gps(channel, value)

        # TODO: Fork cayenneLPP and implement load cell telemetry.
        # TODO: Add load encoder as ID 122 (3322)
        # http://openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html#extlabel
        # http://www.openmobilealliance.org/tech/profiles/lwm2m/3322.xml
        elif False and "load" in name:
            frame.add_load(channel, value)

        # TODO: Map memfree and other baseline sensors appropriately.

        else:
            # TODO: raise Exception here?
            log.info(
                '[CayenneLPP] Sensor type "{}" not found in CayenneLPP'.format(
                    name))

    return frame.bytes()
예제 #2
0
def to_cayenne_lpp_ratrack(dataframe: DataFrame):
    """
    Serialize dataframe to binary CayenneLPP format.

    :param dataframe:
    """

    from cayennelpp import LppFrame
    frame = LppFrame()

    channel = {}
    channel['temp']   = 10

    if ('alt' or 'altitude') and ('lat' or 'longitude') and ('lon' or 'longitude') in dataframe.data_out.keys():
        log.info('GOT GPS!')
        frame.add_gps(0, dataframe.data_out.get('lat'), dataframe.data_out.get('lon'), dataframe.data_out.get('alt'))

    if 'batterie_volt' in dataframe.data_out.keys():
        frame.add_analog_input(14, dataframe.data_out.get('batterie_volt'))

    for key, value in dataframe.data_out.items():

        name = key

        if "system" in name:
            pass
        elif "i2c" in name:
            # assume BME280 on I2C bus as outside sensor and assign the variables to channel 5
            if "temperature" in name:
                frame.add_temperature(5, value)
            elif "humidity" in name:
                frame.add_humidity(5, value)
            elif "pressure" in name:
                frame.add_barometer(5, value)
        elif "onewire" in name:
            # assume DS18B20 as inside sensors and assign to channel 10++
            if "temperature" in name:
                frame.add_temperature(channel['temp'], value)
                channel['temp'] += 1
        else:
            # TODO: raise Exception here?
            #log.info('[CayenneLPP] Sensor type "{}" not found in CayenneLPP'.format(name))
            hu1 = 2

    return frame.bytes()
    def to_cayenne_lpp_ratrack(self):
        """
        Serialize plain data dictionary to binary CayenneLPP format.
        """
        data = self.data

        from cayennelpp import LppFrame
        # create empty frame
        frame = LppFrame()


        channel = 1
        # add some sensor data
        if 'temperature' in data:
            try:
                frame.add_temperature(channel, data.get('temperature'))
            except:
                log.exception('[Cayenne] Serialization failed')

        #if 'humidity' in data:
        #    try:
        #        frame.add_humitidy(channel, data.get('add_humidity'))
        #    except:
        #        log.exception('[Cayenne] Serialization failed')

        if 'pressure' in data:
            try:
                frame.add_barometer(channel, data.get('pressure'))
            except:
                log.exception('[Cayenne] Serialization failed')

        if 'speed' in data and 'roll' in data and 'pitch' in data:
            try:
                frame.add_gyrometer(channel, data.get('speed'), data.get('roll'), data.get('pitch'))
            except:
                log.exception('[Cayenne] Serialization failed')

        if 'battery_voltage' in data:
            try:
                frame.add_analog_input(channel, data.get('battery_voltage'))
            except:
                log.exception('[Cayenne] Serialization failed')

        if 'latitude' in data and 'longitude' in data and 'altitude' in data:
            try:
                log.info('GPS to Cayenne')
                frame.add_gps(channel, data.get('latitude'), data.get('longitude'), data.get('altitude'))
            except:
                log.exception('[Cayenne] Serialization failed')

        #channel = 2
        #if 'cog' in data:
        #    try:
        #        frame.add_analog_input(channel, data.get('cog'))
        #    except:
        #        log.exception('[Cayenne] Serialization failed')

        channel = 3
        if 'memfree' in data:
            try:
                frame.add_analog_input(channel, data.get('memfree'))
            except:
                log.exception('[Cayenne] Serialization failed')

        channel = 4
        if 'waterlevel_volt' in data:
            try:
                frame.add_analog_input(channel, data.get('waterlevel_volt'))
            except:
                log.exception('[Cayenne] Serialization failed')

        channel = 5
        if 'moisture_volt' in data:
            try:
                frame.add_analog_input(channel, data.get('moisture_volt'))
            except:
                log.exception('[Cayenne] Serialization failed')

        return frame.bytes()
예제 #4
0
def to_cayenne_lpp(dataframe: DataFrame):
    """
    Serialize dataframe to binary CayenneLPP format.

    :param dataframe:
    """

    from cayennelpp import LppFrame
    frame = LppFrame()

    channel = {}
    channel['temp'] = 0
    channel['ana_out'] = 0
    channel['hum'] = 0
    channel['press'] = 0
    channel['scale'] = 0

    # TODO: Iterate ``dataframe.readings`` to get more metadata from sensor configuration.
    # It is a list of ``SensorReading`` instances, each having a ``sensor`` and ``data`` attribute.

    for key, value in dataframe.data_out.items():

        #log.debug('-' * 42)

        # TODO: Maybe implement different naming conventions.
        name = key.split("_")[0]
        # try:
        #     channel = int(key.split(":")[1])
        # except IndexError:
        #     channel = 0

        if "temperature" in name:
            frame.add_temperature(channel['temp'], value)
            channel['temp'] += 1
        elif "voltage" in name:
            frame.add_analog_output(channel['ana_out'], value)
            channel['ana_out'] += 1
        elif "humidity" in name:
            frame.add_humidity(channel['hum'], value)
            channel['hum'] += 1
        elif "pressure" in name:
            frame.add_barometer(channel['press'], value)
            channel['press'] += 1
        elif "weight" in name:
            frame.add_analog_input(channel['scale'], value)
            channel['scale'] += 1
        elif "analog-output" in name:
            frame.add_analog_output(channel, value)
        elif "analog-input" in name:
            frame.add_analog_input(channel, value)
        elif "digital-input" in name:
            frame.add_digital_input(channel, value)
        elif "digital_output" in name:
            frame.add_digital_output(channel, value)
        elif "illuminance" in name:
            frame.add_luminosity(channel, value)
        elif "barometer" in name:
            frame.add_barometer(channel, value)
        elif "presence" in name:
            frame.add_presence(channel, value)
        elif "accelerometer" in name:
            frame.add_accelerometer(channel, value)
        elif "gyrometer" in name:
            frame.add_gyrometer(channel, value)
        elif "gps" in name:
            frame.add_gps(channel, value)

        # TODO: Fork cayenneLPP and implement load cell telemetry.
        # TODO: Add load encoder as ID 122 (3322)
        # http://openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html#extlabel
        # http://www.openmobilealliance.org/tech/profiles/lwm2m/3322.xml

        # elif False and "load" in name:
        #     frame.add_load(channel, value)

        # TODO: Map memfree and other baseline sensors appropriately.

        else:
            # TODO: raise Exception here?
            log.info(
                '[CayenneLPP] Sensor type "{}" not found in CayenneLPP'.format(
                    name))

    return frame.bytes()
예제 #5
0
        RAM_free = round(int(RAM_stats[2]) / 1000)
        print("pi free memory = ", RAM_free)

        print('Link counter', lora.link_cnt)
        # Cayenne lpp random value as analog
        # PIBoinnet
        #    c = CayenneLPP()
        #    c.addAnalogInput(1,lora.frame_counter)
        #    c.addAnalogInput(2,myl)
        #    c.addTemperature(1,temp)
        #    c.addAnalogOutput(1,cpu)
        #    c.addAnalogOutput(1,ram)

        frame = LppFrame()
        frame.add_temperature(1, float(CPU_temp))
        frame.add_analog_input(1, i)
        frame.add_analog_input(2, i)
        print("hier")
        frame.add_analog_output(1, float(CPU_usage))
        frame.add_analog_output(2, int(RAM_free))

        print("frame ", str(frame))
        print("frame counter", lora.link_cnt)
        print(bytes.fromhex(str(binascii.hexlify(frame.bytes()).decode())))
        lora.send(bytes.fromhex(str(binascii.hexlify(frame.bytes()).decode())))
        #        lora.send(bytes.fromhex(str(binascii.hexlify(frame.bytes()).decode() )))
        #        lora.send(bytes.fromhex('0102{:04x}'.format(randint(0, 0x7FFF))))
        #        lora.send(binascii.hexlify(frame.bytes()) )
        #        lorar.send("Hello")
        while lora.nb_downlinks:
            print('Received', lora.get_downlink()['data'].hex())
예제 #6
0
def to_cayenne_lpp_hiveeyes(dataframe: DataFrame):
    """
    Serialize dataframe to binary CayenneLPP format.

    :param dataframe:
    """

    from cayennelpp import LppFrame
    frame = LppFrame()

    channel = {}
    channel['temp']   = 10
    channel['volt']   = 2
    channel['pres']   = 1
    channel['scal']   = 6

    # TODO: Iterate ``dataframe.readings`` to get more metadata from sensor configuration.
    # It is a list of ``SensorReading`` instances, each having a ``sensor`` and ``data`` attribute.

    # log.info('dataframe.data_out.items : %s', dataframe.data_out.items())

    for key, value in dataframe.data_out.items():

        #log.debug('-' * 42)

        # TODO: Maybe implement different naming conventions.
        name = key.split("_")[0]
        #     channel = 0

        if "system" in name:
            if "voltage" in name:
                # treat voltage as system sensors
                # put battery voltage to channel 0
                # put solar voltage to channel 1
                # put other voltages to channel 2++
                if "battery" in name:
                    chan = 0
                elif "solar" in name:
                    chan = 1
                else:
                    chan = channel['volt']
                    channel['volt'] += 1
                frame.add_voltage(chan, value)
            elif "temperature" in name:
                frame.add_temperature(0, value)
        elif "i2c" in name:
            # assume BME280 on I2C bus as outside sensor and assign the variables to channel 5
            if "temperature" in name:
                frame.add_temperature(5, value)
            elif "humidity" in name:
                frame.add_humidity(5, value)
            elif "pressure" in name:
                frame.add_barometer(5, value)
        elif "weight" in name:
            # treat weight as outside sensor and assign to channel 5-9
            # Channel 5 for single reading (weight.0))
            # Channel 6-9 for multiple readings (weight.[1-4])
            if name == "weight.0":
                chan = 5
            else:
                chan = channel['scal']
                channel['scal'] += 1
            frame.add_load(chan, value)
        elif "onewire" in name:
            # assume DS18B20 as inside sensors and assign to channel 10++
            if "temperature" in name:
                frame.add_temperature(channel['temp'], value)
                channel['temp'] += 1
        elif "analog-output" in name:
            frame.add_analog_output(channel, value)
        elif "analog-input" in name:
            frame.add_analog_input(channel, value)
        elif "digital-input" in name:
            frame.add_digital_input(channel, value)
        elif "digital_output" in name:
            frame.add_digital_output(channel, value)
        elif "illuminance" in name:
            frame.add_luminosity(channel, value)
        elif "barometer" in name:
            frame.add_barometer(channel, value)
        elif "presence" in name:
            frame.add_presence(channel, value)
        elif "accelerometer" in name:
            frame.add_accelerometer(channel, value)
        elif "gyrometer" in name:
            frame.add_gyrometer(channel, value)
        #elif "gps" in name:
        #    frame.add_gps(channel, value)


        # TODO: Fork cayenneLPP and implement load cell telemetry.
        # TODO: Add load encoder as ID 122 (3322)
        # http://openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html#extlabel
        # http://www.openmobilealliance.org/tech/profiles/lwm2m/3322.xml

        # elif False and "load" in name:
        #     frame.add_load(channel, value)

        # TODO: Map memfree and other baseline sensors appropriately.

        else:
            # TODO: raise Exception here?
            log.info('[CayenneLPP] Sensor type "{}" not found in CayenneLPP'.format(name))

    return frame.bytes()