CN1 ADAPT Plugin Guide
AgGateway's ADAPT is an Open Source Software project. The ADAPT framework's goal is to provide a common language, a data model, for transferring Agronomic data from one system to another.
This CN1 ADAPT plugin maps CNH Industrial's proprietary file format CN1 to the ADAPT data model. If your application supports ADAPT, you will be able to read the data stored in a CN1 file.
The plugin requires that at least one .CN1 folder to be present in the provided dataPath. The IsDataCardSupported()
method checks this on the plugin.
The Import()
method will return one ApplicationDataModel
object per .CN1 folder in the provided dataPath.
Download Latest
The latest version is 4.1.1 and was released on 12/03/2024. Supports .Net Standard 2.0.
Version Details
Changes across versions are listed below.
4.1.1
- Updated CNHVoyager2.dll to 4.1.1.2.
- Monitor Serial Number is now available under Catalog.DeviceElements.
- New errors collection available which may contain errors detected by the CN1 SDK.
- Upgraded to .NET Standard 2.0 and references the ADAPT Framework v3.1.0. Read more about this at Github.
4.0.0
- Upgraded to .NET Standard 2.0 and references the ADAPT Framework v3.0.2. Read more about this at Github.
Object Mapping Details
The following section contain details on how property mapping is handled.
Unmapped Properties
Several properties in the CN1 data model that do not map directly to the ADAPT data model are handled by the following ContextItem
codes:
Name | Description |
---|---|
US-EPA-N | The EPA Number. |
ApplicationRates | Top level context item for the following nested context items. These values are all numeric and the ValueUOM indicates the unit of measure:
|
MaximumWindSpeed | Maximum wind speed allowed by product label. |
RequiredBufferDistance | Required buffer distance from product label. |
IsNotificationRequired | Requirement to post a notice, based on product label. |
IsRestricted | Indicates that usage of the product may be restricted, based on label. |
PackageSize | Indicates size of the package. |
Products
The plugin will map the following types of products in the ADAPT data model:
Product Type | Usage |
---|---|
CropNutritionProduct | For all Fertilizer usage products. |
CropVarietyProduct | For planted crop variety products. |
GenericProduct | For Carriers or other generic products. |
MixProduct | For any product mixes. |
When available in the CN1 data model, the ProductDensity
(or SeedPlantDensity
for varieties) will also be mapped to the Density value.
Further Notes on Product Types
Below are further details on the product types listed in the table above.
CropNutritionProduct
Used for all Dry or Liquid fertilizer products from a CN1 folder.
The IsManure
flag is not set. There are no Ingredients available to record the different nutrient percentages provided by the fertilizer because individual nutrients are not tracked by the CN1 format.
CropProtectionProduct
Used for several different subtypes of crop protection: Fungicide, Herbicide, Insecticide, and Pesticides.
The Category of the product is used to note the detailed subtype (for Fungicide, Herbicide, and Insecticide only). ADAPT does not currently have a category for Pesticides and those will be set to Unknown.
CropVarietyProduct
Will contain a reference to a valid CropId.
There are currently no mappings available for TraitIds
in data coming from the CN1 folder and the GeneticallyEnhanced
property will not be set.
GenericProduct
Used when the CN1 data has marked the product as Generic or as a Carrier. This would be used if "Water" was present as part of a product mix.
MixProduct
All of the ProductComponents
for a MixProduct
always reference other products for the CN1 plugin, the Ingredient object type is not used. The ProductComponent
objects will have IsProduct
property set to true and the IngredientId
will reference an actual product in the Catalog.Products
collection.
When available, the TotalQuantity
for the mix will also be applied to the MixProduct
object. This will use one of the following representations depending on the kind of product:
Representation | Purpose |
---|---|
vrTotalQuantityAppliedVolume | For liquid products. |
vrTotalQuantityAppliedMass | For dry products. |
vrTotalSeedQuantityAppliedMass | For CropVariety measured by mass. |
vrTotalSeedQuantityAppliedMass | For CropVariety measured by seeds. |
There are 2 different ways that the ProductComponent
quantity can be measured for a MixProduct
. The MixProduct
is configured in one of two ways:
- By Formula
- In this situation, the quantity represents the total amount of the product in the mix.
vrActiveIngredientMass
is used for dry components.vrActiveIngredientVolume
is used for liquid components.
- In this situation, the quantity represents the total amount of the product in the mix.
- By Percentage
- In this situation, the
vrProductContent
representation is used to note the percentage of product for the mix.
- In this situation, the
MixProduct
only uses one or the other, and there will not be a combination of total ingredient amounts and percentages used for the same MixProduct
.Grower / Farm / Field
Grower
The plugin will currently map the following grower attributes to ADAPT Model:
Initial Attribute | Maps To |
---|---|
ICNHV2Grower.SUID | Id.UniqueIds.Id |
ICNHV2Grower.Name | Name |
Farm
The plugin will currently map the following farm attributes to ADAPT Model:
Initial Attribute | Maps To |
---|---|
ICNHV2Farm.SUID | Id.UniqueIds.Id |
ICNHV2Farm.Name | Farm.Description |
Farm contains GrowerId
that references grower this is set by the plugin.
Field
The plugin will currently map the following field attributes to ADAPT Model:
Farm.Description
Initial Attribute | Maps To | Notes |
---|---|---|
ICNHV2Field.SUID | Id.UniqueIds.Id | None. |
ICNHV2Field.Name | Field.Description | None. |
ICNHV2Field.Boundary | Field.FieldBoundary | None. |
ICNHV2Field.Area | Field.Area | vrReportedFieldArea . Unit of measure is square metres |
Field contains GrowerId
and FarmId
which references grower and farm both are set by the plugin.
Setup Data
Field Boundary
Field boundaries are mapped from the CN1 folder when they are available. There will be at most one FieldBoundary
added per field since the CN1 folder structure only tracks one active boundary per field.
Inner and outer polygon rings from the CN1 folder will be spatially sorted to obey conventional geometry rules. The field boundary will always be represented as a MultiPolygon
geometry object. Each Outer polygon will be mapped to an ExteriorRing
on a Polygon within the MultiPolygon
. Any Inner polygons that fall inside will be added to that polygon's polygon InteriorRings
collection.
There may be some situations where an Inner polygon does not have a corresponding Outer ring. In this situation, a polygon will be created with an ExteriorRing
and one InteriorRing
set to the same geometry. The usage of the inner ring as the outer ring is to satisfy the requirement that all polygons have at least one outer ring.
Guidance Lines
The plugin will import any available guidance lines into the data model. By default, each guidance line from the CN1 folder will be placed into separate groups. When the SwathGroup
is used, all of the same lines with the same SwathGroup
will be placed into the same GuidanceGroup
in the ADAPT model.
The following is a list of mappings for how each CN1 guidance pattern type maps to an ADAPT object:
CNHV2SwathTypeLine AbLine
CNHV2SwathTypeHeading APlus
CNHV2SwathTypePivot* PivotGuidancePattern
CNHV2SwathTypePivotMultiPoint* PivotGuidancePattern
CNHV2SwathTypePivotByValues PivotGuidancePattern
CNHV2SwathTypeSpiral Spiral
CNHV2SwathTypeCurve AbCurve
CNHV2SwathTypeFieldSwath AbCurve
- Also maps to
DrivenHeadland
forFieldBoundary
.
- Also maps to
CNHV2SwathTypeMultiSwath AbCurve
- Multiple in a
GuidanceGroup
.
- Multiple in a
CNHV2SwathTypeMultiSwathPlus AbCurve
- Multiple in a
GuidanceGroup
.
- Multiple in a
Pivot
and PivotMultiPoint
types define a pivot guidance pattern by using 3 points along the perimeter of the circle rather than a center point and radius as is customary for ADAPT.PivotGuidancePattern
. This may change in the future if ADAPT adds support for this additional method.Obstacles
When available, obstacles for a field will be added as a ReferenceLayer
with a ReferenceLayerType
of Obstacles
. There will be one Obstacles
reference layer per field which contains obstacles.
Each obstacle shape for the field (Point, Line, or Polygon) will be added to the reference layer as a separate ShapeLookup
item.
The following representations are used as SpatialAttributes
on each of the ShapeLookup
items on the reference layer:
Representation | Notes |
---|---|
srObstacleName | This is a StringValue and will contain the name of the obstacle. |
dtObstacleLevel | This defines the warning level. There are two values:
|
dtObstacleType | This defines a detailed obstacle type that can be any of the following pre-defined variables:
|
All of the above representations are user-defined and are contained in the CN1Plugin.DefinedTypeInstanceList
class used in the plugin.
Prescriptions
Prescription data contained in a CN1 folder structure is mapped when available. The prescription rate maps are imported as either RasterGridPrescription
or VectorPrescription
depending on the internal geometry type.
Each RasterGridPrescription
converted will only reference one Product at a time and will be assigned to a single field by the FieldId
property. Each field may have multiple prescriptions for different products.
The representation and units of measure used for the prescriptions depend on the ProductForm
used by the prescription itself. The mapping to Representation
and units of measure is as follows:
Representation | Maps To | Units of Measure |
---|---|---|
DryGranular | vrAppRateMassTarget | Kilograms per Square Metre |
Liquid | vrAppRateVolumeTarget | Litres per Square Metre |
Plant | vrSeedRateSeedsTarget | Count per Square Metre |
Seed | vrSeedRateSeedsTarget | Count per Square Metre |
BulkSeed | vrSeedRateMassTarget | Kilograms per Square Metre |
Other | vrAppRateMassTarget | Kilograms per Square Metre |
There is a ContextItem
available on each prescription to note the creation date.
Logged Data
All supported logged data is mapped to the ApplicationDataModel.Documents.LoggedData
collection.
The following types of logged data are currently supported by the plugin:
- Grain Harvest
- Forage Harvest
- Cane Harvest
- Cotton Harvest
- Application Rate
- Includes Planting, Spraying, Spreading, and other applications
- Vehicle Performance
To ensure efficient processing and reduced memory usage, the plugin will dynamically load the logged records from the disk as the SpatialRecords
are enumerated. As a best practice, it is important to call the ReleaseSpatialRecords
method on the LoggedData
object as soon as you are finished with the records.
WorkRecord
documents are used to log summaries and other notes from the task where available. This includes the following items:
- Crop Residue
- Sky Condition
- Soil Condition
- Soil Moisture
- Soil Texture
- Humidity
- Temperature
- Wind Speed
- Wind Direction
The following representations are available on the SpatialRecords
for all data types handled by this plugin:
Representation | Notes |
---|---|
vrElevation | Measured in Metres. |
vrHeading | Measured in Arc Degrees. |
vrDistanceTraveled | Measured in Metres. |
vrDeltaArea | Measured in Square Metres. |
vrNumSatellites | Measured in Count. This is a User-Defined representation. |
dtSignalType | None. |
dtRecordingStatus | None. |
The following representations are available on the Operation Summary:
Product Form | Representation | Units of Measure |
---|---|---|
Area | vrTotalAreaCovered | Square Meters |
Fuel (InWork) | ISO 316 | Litres |
Fuel (OutOfWork) | ISO 317 | Litres |
Harvest
Harvest data is relatively simple and is only available down to the Implement
level. There is no section/subsection reporting for harvest. The following representations of data are available for harvest data:
Representation | Harvest Type | Notes |
---|---|---|
vrYieldWetMass | Grain | Measured in Kilograms. |
vrHarvestMoisture | Grain | Measured in Percentage. |
vrConstituentCrudeProtein | Grain | Measured in Percentage. Available when equipped with protein sensor. |
vrYieldMassForage | Forage | Measured in Kilograms. |
vrHarvestMoisture | Forage | Measured in Percentage. |
vrYieldMass | Cotton | Measured in Kilograms. |
vrYieldMassCane | Cane | Measured in Kilograms. |
Note that certain representations are only available for a given Harvest Type.
Application Data
Application data records at the Implement
level as well as Section
and SubSection
levels where available. The two types of representations used are for Actual
rate and Target
rates. The representations used depend upon the product form just like the prescriptions.
Please note that subsection meters use different units of measure as shown below.
Implement and Section level - Actual Representations
Product Form | Representation | Units of Measure |
---|---|---|
DryGranular | vrAppRateMassActual | Kilograms per Square Metre |
Liquid | vrAppRateVolumeActual | Litres per Square Metre |
Plant | vrSeedRateSeedsActual | Count per Square Metre |
Seed | vrSeedRateSeedsActual | Count per Square Metre |
BulkSeed | vrSeedRateMassActual | Kilograms per Square Metre |
Other | vrAppRateMassActual | Kilograms per Square Metre |
SubSection level - Actual Representations
Product Form | Representation | Units of Measure |
---|---|---|
DryGranular | vrAppRateMassActual | Kilograms per Square Metre |
Liquid | vrAppRateVolumeActual | Litres per Square Metre |
Plant | vrSeedRateSeedsActual | Thousands of Seed per Square Metre |
Seed | vrSeedRateSeedsActual | Thousands of Seed per Square Metre |
BulkSeed | vrSeedRateMassActual | Kilograms per Square Metre |
Other | vrAppRateMassActual | Kilograms per Square Metre |
Implement, Section, and SubSection level - Target representations
Product Form | Representation | Units of Measure |
---|---|---|
DryGranular | vrAppRateMassTarget | Kilograms per Square Metre |
Liquid | vrAppRateVolumeTarget | Litres per Square Metre |
Plant | vrSeedRateSeedsTarget | Count per Square Metre |
Seed | vrSeedRateSeedsTarget | Count per Square Metre |
BulkSeed | vrSeedRateMassTarget | Kilograms per Square Metre |
Other | vrAppRateMassTarget | Kilograms per Square Metre |
Operation Summary Representations for Product Totals
Product Form | Representation | Units of Measure |
---|---|---|
DryGranular | vrTotalQuantityAppliesMass | Kilograms |
Liquid | vrTotalQuantityAppliedVolume | Litres |
Plant | vrTotalSeedQuantityAppliedSeed | Thousands of Seed |
Seed | vrTotalSeedQuantityAppliedSeed | Thousands of Seed |
BulkSeed | vrTotalSeedQuantityAppliedMass | Kilograms |
Other | vrTotalQuantityAppliedMass | Kilograms |
Planting Data
Planting data is an extension of the Application data - please see the above section for notes on target and actual seeding rate meters.
When properly equipped, Planting data may contain additional representations for singulation, seed spacing quality, downforce, ground contact, and row unit ride quality. These additional representations will only be present on the Section and SubSection levels where available.
Advanced Seed Sense Logging
Representation | Units of Measure |
---|---|
vrPlantingSingulation | Percentage |
vrPlantingSkips | Percentage |
vrPlantingDoubles | Percentage |
vrActualSeedSpacingCV | Unitless |
Down Force Logging
Representation | Units of Measure |
---|---|
vrDownForceMargin | Newtons |
vrDownForceApplied | Newtons |
vrGroundContact | Percentage |
vrRideQuality | Percentage |