def __init__(self):
        super(ComposedAarhusPollutionWrapper, self).__init__()
        metadatafile = AbstractComposedWrapper.getFileObject(__file__, "metadata.json", "rU")
        metadata = JOb(metadatafile)

        basesensordescription = SensorDescription()
        basesensordescription.source = "???" # TODO
        basesensordescription.namespace = "http://ict-citypulse.eu/"
        basesensordescription.author = "cityofaarhus"
        basesensordescription.sensorType = "Aarhus_Pollution"
        basesensordescription.graphName = "aarhus_pollution#"
        basesensordescription.sourceType = "pull_http"
        basesensordescription.sourceFormat = "application/json"
        basesensordescription.information = "Pollution data for the City of Aarhus"
        basesensordescription.cityName = "Aarhus"
        basesensordescription.countryName = "Denmark"
        basesensordescription.movementBuffer = 3
        basesensordescription.maxLatency = 2
        basesensordescription.updateInterval = 5 * 60
        basesensordescription.fields = ["ozone", "particullate_matter", "carbon_monoxide", "sulfure_dioxide",
                                        "nitrogen_dioxide", "longitude", "latitude", "timestamp"]

        basesensordescription.field.ozone.propertyName = "Property"
        basesensordescription.field.ozone.propertyPrefix = "ssn"
        basesensordescription.field.ozone.propertyURI = basesensordescription.namespace + "city#Ozone"
        basesensordescription.field.ozone.unit = basesensordescription.namespace + "unit:km-per-hour"
        basesensordescription.field.ozone.min = 0
        basesensordescription.field.ozone.max = 150
        basesensordescription.field.ozone.dataType = "int"
        basesensordescription.field.ozone.showOnCityDashboard = True
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}


        basesensordescription.field.particullate_matter.propertyName = "Property"
        basesensordescription.field.particullate_matter.propertyPrefix = "ssn"
        basesensordescription.field.particullate_matter.propertyURI = basesensordescription.namespace + "city#ParticleMatter"
        basesensordescription.field.particullate_matter.unit = basesensordescription.namespace + "unit:number-of-vehicle-per-5min"
        basesensordescription.field.particullate_matter.min = 0
        basesensordescription.field.particullate_matter.max = 10000
        basesensordescription.field.particullate_matter.dataType = "int"
        basesensordescription.field.particullate_matter.showOnCityDashboard = True
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}


        basesensordescription.field.carbon_monoxide.propertyName = "Property"
        basesensordescription.field.carbon_monoxide.propertyPrefix = "ssn"
        basesensordescription.field.carbon_monoxide.propertyURI = basesensordescription.namespace + "city#CarbonMonoxide"
        basesensordescription.field.carbon_monoxide.unit = basesensordescription.namespace + "unit:minutes"
        basesensordescription.field.carbon_monoxide.min = 0
        basesensordescription.field.carbon_monoxide.max = 1000
        basesensordescription.field.carbon_monoxide.dataType = "int"
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}


        basesensordescription.field.sulfure_dioxide.propertyName = "Property"
        basesensordescription.field.sulfure_dioxide.propertyPrefix = "ssn"
        basesensordescription.field.sulfure_dioxide.propertyURI = basesensordescription.namespace + "city#SulfureDioxide"
        basesensordescription.field.sulfure_dioxide.unit = basesensordescription.namespace + "unit:minutes"
        basesensordescription.field.sulfure_dioxide.min = 0
        basesensordescription.field.sulfure_dioxide.max = 1000
        basesensordescription.field.sulfure_dioxide.dataType = "int"
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}


        basesensordescription.field.nitrogen_dioxide.propertyName = "Property"
        basesensordescription.field.nitrogen_dioxide.propertyPrefix = "ssn"
        basesensordescription.field.nitrogen_dioxide.propertyURI = basesensordescription.namespace + "city#NitrogenDioxide"
        basesensordescription.field.nitrogen_dioxide.unit = basesensordescription.namespace + "unit:minutes"
        basesensordescription.field.nitrogen_dioxide.min = 0
        basesensordescription.field.nitrogen_dioxide.max = 1000
        basesensordescription.field.nitrogen_dioxide.dataType = "int"
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}


        basesensordescription.field.longitude.propertyName = "Property"
        basesensordescription.field.longitude.propertyPrefix = "ssn"
        basesensordescription.field.longitude.propertyURI = basesensordescription.namespace + "city#Longitude"
        basesensordescription.field.longitude.unit = basesensordescription.namespace + "unit:degrees"
        basesensordescription.field.longitude.min = 0
        basesensordescription.field.longitude.max = 180
        basesensordescription.field.longitude.dataType = "float"
        basesensordescription.field.vehicleCount.aggregationMethod = None


        basesensordescription.field.latitude.propertyName = "Property"
        basesensordescription.field.latitude.propertyPrefix = "ssn"
        basesensordescription.field.latitude.propertyURI = basesensordescription.namespace + "city#Latitude"
        basesensordescription.field.latitude.unit = basesensordescription.namespace + "unit:degrees"
        basesensordescription.field.latitude.min = 0
        basesensordescription.field.latitude.max = 180
        basesensordescription.field.latitude.dataType = "float"
        basesensordescription.field.vehicleCount.aggregationMethod = None


        basesensordescription.field.timestamp.propertyName = "MeasuredTime"
        basesensordescription.field.timestamp.propertyURI = basesensordescription.namespace + "city#MeasuredTime"
        basesensordescription.field.timestamp.unit = basesensordescription.namespace + "unit:time"
        basesensordescription.field.timestamp.min = "2012-01-01T00:00:00"
        basesensordescription.field.timestamp.max = "2099-12-31T23:59:59"
        basesensordescription.field.timestamp.dataType = "datetime.datetime"
        basesensordescription.field.timestamp.format = "%Y-%m-%d %H:%M:%S"
        basesensordescription.field.timestamp.skip_annotation = True

        basesensordescription.timestamp.inField = "timestamp"
        basesensordescription.timestamp.format = "%Y-%m-%d %H:%M:%S"

        for point in metadata:
            sensordescription = basesensordescription.deepcopy()
            sensordescription.sensorName = "aarhus_pollution_" + point["id"]
            sensordescription.sensorID = str(point["id"])
            sensordescription.fullSensorID = basesensordescription.namespace + "sensor/Aarhus-Pollution-" + sensordescription.sensorID
            sensordescription.location = "POINT(%(long)s %(lat)s)" % point
            sensordescription.messagebus.routingKey = "Aarhus.Pollution." + sensordescription.sensorID
            self.addWrapper(AarhusPollutionWrapper(sensordescription))
    def __init__(self):
        super(BrasovPollutionWrapper, self).__init__()

        basesensordescription = SensorDescription()
        basesensordescription.namespace = "http://ict-citypulse.eu/"
        basesensordescription.author = "cityofbrasov"
        basesensordescription.graphName = "brasov_air_pollution#"
        basesensordescription.sourceType = "pull_http"
        basesensordescription.sourceFormat = "application/json"
        basesensordescription.information = "Air pollution in the city of Brasov"
        basesensordescription.cityName = "Brasov"
        basesensordescription.countryName = "Romania"
        basesensordescription.movementBuffer = 0
        basesensordescription.maxLatency = 2
        basesensordescription.updateInterval = 60 * 5
        basesensordescription.fields = ['aqisitionStation', 'aqisitionStationDetails', 'eventTypeName', 'qualityLevelType', 'timestamp']

        basesensordescription.field.aqisitionStation.propertyName = "Property"
        basesensordescription.field.aqisitionStation.propertyPrefix = "ssn"
        basesensordescription.field.aqisitionStation.propertyURI = basesensordescription.namespace + "brasov/pollution#Station"
        basesensordescription.field.aqisitionStation.min = ""
        basesensordescription.field.aqisitionStation.max = ""
        basesensordescription.field.aqisitionStation.dataType = "str"
        basesensordescription.field.aqisitionStation.showOnCityDashboard = True

        basesensordescription.field.aqisitionStationDetails.propertyName = "Property"
        basesensordescription.field.aqisitionStationDetails.propertyPrefix = "ssn"
        basesensordescription.field.aqisitionStationDetails.propertyURI = basesensordescription.namespace + "brasov/pollution#StationDetails"
        basesensordescription.field.aqisitionStationDetails.min = ""
        basesensordescription.field.aqisitionStationDetails.max = ""
        basesensordescription.field.aqisitionStationDetails.dataType = "str"
        basesensordescription.field.aqisitionStationDetails.showOnCityDashboard = True

        basesensordescription.field.eventTypeName.propertyName = "AirPollutionIndex"
        basesensordescription.field.eventTypeName.propertyURI = basesensordescription.namespace + "brasov/pollution#EventType"
        basesensordescription.field.eventTypeName.min = ""
        basesensordescription.field.eventTypeName.max = ""
        basesensordescription.field.eventTypeName.dataType = "str"
        basesensordescription.field.eventTypeName.showOnCityDashboard = True

        basesensordescription.field.qualityLevelType.propertyName = "AirPollutionLevel"
        basesensordescription.field.qualityLevelType.propertyURI = basesensordescription.namespace + "brasov/pollution#QualityLevelType"
        basesensordescription.field.qualityLevelType.min = ""
        basesensordescription.field.qualityLevelType.max = ""
        basesensordescription.field.qualityLevelType.dataType = "str"
        basesensordescription.field.qualityLevelType.showOnCityDashboard = True

        basesensordescription.field.timestamp.propertyName = "MeasuredTime"
        basesensordescription.field.timestamp.propertyURI = basesensordescription.namespace + "city#MeasuredTime"
        basesensordescription.field.timestamp.unit = basesensordescription.namespace + "unit:time"
        basesensordescription.field.timestamp.min = ""
        basesensordescription.field.timestamp.max = ""
        basesensordescription.field.timestamp.dataType = "str"        
        basesensordescription.field.timestamp.skip_annotation = True

        basesensordescription.timestamp.inField = "timestamp"
        basesensordescription.timestamp.format = "UNIX5"

        locations = [
            ("BV-1", "Brasov, Calea Bucuresti, Str. Soarelui", "POINT(25.63272 45.636742)"),
            ("BV-2", "Brasov, Str. Castanilor, FN, cod postal 500097", "POINT(25.604125 45.649339)"),
            ("BV-3", "Brasov, Bdul. Garii, Aleea Lacramioarelor", "POINT(25.6169 45.658564)"),
            ("BV-4", "Brasov, Sanpetru, Str. Morii, FN", "POINT(25.625372 45.718173)"),
            ("BV-5", "Brasov, Bdul. Vlahuta, Str. Parcul Mic, Nr. 9", "POINT(25.625952 45.651784)")
        ]

        eventTypeNames = ["SO2", "PM10", "NO2", "O3", "CO"]

        for _id, loc, coords in locations:
            for eventTypeName in eventTypeNames:
                sensordescription = basesensordescription.deepcopy()
                sensordescription.source = "http://www.bamct.siemens.ro:9000/brasovDataCollector/pollutionView?location=%s&pollutionType=%s" % (_id, eventTypeName)
                sensordescription.sensorName = "brasov_air_pollution_%s_%s" % (eventTypeName, _id)
                sensordescription.sensorID = _id + "-" + eventTypeName
                sensordescription.fullSensorID = basesensordescription.namespace + "brasov/pollution/" + _id + "/" + eventTypeName
                sensordescription.location = coords
                #sensordescription.sensorType = "Brasov_Air_Pollution_" + eventTypeName
                sensordescription.sensorType = "Brasov_Air_Pollution"

                sensordescription.field.aqisitionStation.equals = _id
                sensordescription.field.aqisitionStationDetails.equals = loc
                sensordescription.field.eventTypeName.equals = eventTypeName

                sensordescription.messagebus.routingKey = "Brasov.Air.Pollution.%s.%s" % (eventTypeName, _id)

                self.addWrapper(InternalBrasovWrapper(sensordescription))
    def __init__(self):
        super(AarhusParkingWrapper, self).__init__()
        metadatafile = AbstractComposedWrapper.getFileObject(__file__, "aarhus_parking-address.csv", "rU")

        basesensordescription = SensorDescription()
        basesensordescription.source = "http://www.odaa.dk/api/action/datastore_search?resource_id=2a82a145-0195-4081-a13c-b0e587e9b89c"
        basesensordescription.namespace = "http://ict-citypulse.eu/"
        basesensordescription.author = "cityofaarhus"
        basesensordescription.sensorType = "Aarhus_Road_Parking"
        basesensordescription.graphName = "aarhus_road_parking#"
        basesensordescription.sourceType = "pull_http"
        basesensordescription.sourceFormat = "application/xml"
        basesensordescription.information = "Parking data for the City of Aarhus"
        basesensordescription.cityName = "Aarhus"
        basesensordescription.countryName = "Denmark"
        basesensordescription.movementBuffer = 3
        basesensordescription.maxLatency = 2
        basesensordescription.updateInterval = 60
        # basesensordescription.fields = ["vehicleCount", "totalSpaces", "garageCode"]
        basesensordescription.fields = ["vehicleCount", "totalSpaces"]

        # basesensordescription.field.garageCode.propertyName = "Property"
        # basesensordescription.field.garageCode.propertyPrefix = "ssn"
        # basesensordescription.field.garageCode.propertyURI = basesensordescription.namespace + "city#Garagecode"
        # basesensordescription.field.garageCode.min = ""
        # basesensordescription.field.garageCode.max = ""
        # basesensordescription.field.garageCode.dataType = "str"

        basesensordescription.field.totalSpaces.propertyName = "ParkingCapacity"
        basesensordescription.field.totalSpaces.propertyURI = basesensordescription.namespace + "city#TotalSpaces"
        # basesensordescription.field.totalSpaces.unit = "http://muo.net/Number"
        basesensordescription.field.totalSpaces.min = 0
        basesensordescription.field.totalSpaces.max = 10000
        basesensordescription.field.totalSpaces.dataType = "int"
        basesensordescription.field.totalSpaces.showOnCityDashboard = True
        basesensordescription.field.totalSpaces.aggregationMethod = None

        basesensordescription.field.vehicleCount.propertyName = "ParkingVehicleCount"
        basesensordescription.field.vehicleCount.propertyURI = basesensordescription.namespace + "city#ParkingVehicleCount"
        basesensordescription.field.vehicleCount.unit = basesensordescription.namespace + "unit:number-of-vehicle-per-1min"
        basesensordescription.field.vehicleCount.min = 0
        basesensordescription.field.vehicleCount.max = "@totalSpaces"
        basesensordescription.field.vehicleCount.dataType = "int"
        basesensordescription.field.vehicleCount.showOnCityDashboard = True
        basesensordescription.field.vehicleCount.aggregationMethod = "sax"
        basesensordescription.field.vehicleCount.aggregationConfiguration = {"alphabet_size": 5, "word_length": 3,
                                                                        "unit_of_window": "hours", "window_duration": 1}

        # basesensordescription.timestamp.inField = "updatetime"
        basesensordescription.timestamp.format = "%Y-%m-%d %H:%M:%S"

        metadata = csv.DictReader(metadatafile)

        for row in metadata:
            sensordescription = basesensordescription.deepcopy()
            sensordescription.sensorName = "aarhus_road_parking_" + nicename(row['garagecode'])
            sensordescription.sensorID = nicename(row['garagecode'])
            sensordescription.fullSensorID = basesensordescription.namespace + "sensor/" + sensordescription.sensorID
            sensordescription.location = "POINT(%s %s)" % (row['longitude'], row['latitude'])
            sensordescription.messagebus.routingKey = "Aarhus.Road.Parking." + sensordescription.sensorID
            sensordescription.streetName = self.__getattr(row, "street", "n/a")
            sensordescription.postalCode = self.__getattr(row, "postalcode", "n/a")

            # garage code only as sensorID embedded in an URI. Possibilities to read it unknown at this point.
            # sensordescription.staticproperties.garageCode.propertyName = "Property"
            # sensordescription.staticproperties.garageCode.propertyPrefix = "ssn"
            # sensordescription.staticproperties.garageCode.propertyURI = basesensordescription.namespace + "city#Garagecode"
            # sensordescription.staticproperties.garageCode.dataType = "str"
            # sensordescription.staticproperties.garageCode.value = sensordescription.sensorID

            self.addWrapper(InternalWrapper(sensordescription))

        self.connection = HttpPullConnection(self, basesensordescription.source)
        self.splitter = AarhusParkingSplitterJson(self)