Formato de valores separados por comas
En esta página se describe la implantación de muestra del formato de valores separados por comas.
Formato de fichero de muestra
En esa muestra, los datos se almacenan como un fichero de valores separados por comas.
Nota: los valores de este ejemplo no pueden contener un carácter de coma literal. Se añade esta restricción con vistas a simplificar la implantación del analizador de ficheros. La lógica de análisis se puede volver a implantar para evitar esta restricción. No afectará al resto de la funcionalidad.
El fichero CSV de muestra contiene los tipos de registro siguientes:
Consumo de intervalo: se utiliza para medidas de consumo de intervalo
Eventos de dispositivo: se utiliza para eventos de dispositivo
Registro de pista: se utiliza para proporcionar la fecha y hora de lectura y el número de registros de evento de dispositivo y consumo de intervalo en el fichero
Formato de consumo de intervalo
Nº |
Nombre de campo |
Tipo |
Definición |
---|---|---|---|
1 |
ID de tipo de registro |
Valor constante "U" |
Identificador del tipo de registro |
2 |
Fecha/hora de inicio |
Hora en el formato de tiempo Unix. |
Fecha/hora de inicio de la lectura del contador |
3 |
Fecha/hora de finalización |
Hora en el formato de tiempo Unix. |
Fecha/hora de finalización de la lectura del contador |
4 |
ID de dispositivo |
Texto arbitrario |
Identificador de dispositivo |
5 |
Duración de intervalo |
Número entero |
El intervalo de tiempo entre las lecturas en segundos (segundos por intervalo). |
6 |
UM |
Texto arbitrario |
Describe las unidades de los valores de datos |
7 |
Entradas de datos |
Punto flotante numérico y texto arbitrario opcional separados por “:” |
Cada registro puede contener un número ilimitado de campos de entrada de datos. Cada entrada de datos es un juego de dos campos: un valor de lectura y un indicador de estado de lectura opcional. Los campos se separan con el carácter “:”. El separador no se indica cuando no se proporciona el indicador de estado de lectura. |
Formato de evento de dispositivo
Nº |
Nombre de campo |
Tipo |
Definición |
---|---|---|---|
1 |
ID de tipo de registro |
Valor constante "E" |
Identificador del tipo de registro |
2 |
Fecha/hora de evento |
Hora en el formato de tiempo Unix. |
La fecha y hora a la que ha sucedido el evento |
3 |
ID de dispositivo |
Texto arbitrario |
Identificador de dispositivo |
4 |
Nombre de evento |
Texto arbitrario |
El nombre de identificación principal del evento |
Formato de registro de pista
Nº |
Nombre de campo |
Tipo |
Definición |
---|---|---|---|
1 |
ID de tipo de registro |
Valor constante "T" |
Identificador del tipo de registro |
2 |
Fecha/hora de creación |
Hora en el formato de tiempo Unix. |
Fecha/hora de inicio de la lectura del contador |
3 |
Registros totales |
Número entero |
Muestra el número de registros en el fichero |
Fichero de muestra
U,1,86400,DEVICE_DG_0,900,KWH,1:S,2.5,-3.99:R,4:B
E,86400,DEVICE_DG_1,Power Outage
U,2,86400,DEVICE_DG_2,900,KWH,1:S,2,3:R,4:B,5,6,7:A
E,86402,DEVICE_DG_3,Tamper attempt suspected
U,3,86400,DEVICE_DG_4,900,KWH,1:S
T,86401,5
Scripts de muestra
La implantación de muestra incluye los siguientes scripts de muestra diseñados para su uso con el formato CSV anterior:
DG_SmplPrCSV: este script de muestra incluye un método en la interfaz de biblioteca – getParser(). El método devuelve una instancia de la clase que implanta la interfaz com.splwg.d1.domain.sgg.dg.processing.PayloadParser. La clase contiene la lógica siguiente:
-
Analiza una carga útil entrante en el formato CSV.
-
Transforma los datos entrantes en estructuras relacionadas con consumo o eventos, según el tipo de datos entrantes.
-
Devuelve, una a una, dichas estructuras en formato XML sin formato.
DG_SmPrCSVCh: este script se proporciona como una muestra para demostrar cómo se analiza el formato CSV en fragmentos (creados mediante el parámetro chunkSize) con el uso de una ayuda. Este script de muestra incluye un método en la interfaz de biblioteca – getParser(). El método devuelve una instancia de la clase que implanta las interfaces com.splwg.d1.domain.sgg.dg.processing.ChunkProcessor y com.splwg.d1.domain.sgg.dg.processing.GenericPayload.
La interfaz ChunkProcessor distingue un procesador que reconoce la fragmentación del resto de implantaciones. Un analizador personalizado implantado en Groovy debería implantar esta interfaz. La interfaz GenericPayload define métodos necesarios para acceder a una carga útil mediante ayudas específicas. Mediante esta interfaz, un analizador personalizado accede a una instancia de LineReaderChunked.
Si el parámetro dinámico chunkSize no está definido en una configuración de procesamiento de carga útil de SGG, se procesará toda la carga útil. Consulte Parámetros comunes para obtener más información sobre el parámetro chunkSize.
-
Lee una línea de la carga útil entrante mediante el uso del método LineReaderChunked.readLineWithinChunk()
-
Analiza una línea en la carga útil entrante (en formato CSV) que se leyó en el paso anterior.
-
Transforma los datos entrantes en estructuras relacionadas con consumo o eventos, según el tipo de datos entrantes.
-
Devuelve, una a una, dichas estructuras en formato XML sin formato.
DG_SmplTrCSV: este script de muestra incluye un método en la interfaz de biblioteca – getTransformer(). El método devuelve una instancia de la clase que implanta la interfaz com.splwg.d1.domain.sgg.dg.processing.PayloadTransformer. La clase contiene la lógica siguiente:
-
Transforma el mensaje entrante en formato XML sin formato al formato “nativo” (nodos de XML de predefinición de datos iniciales de medida o de predefinición de evento de dispositivo).
-
Añade nuevos nodos de XML como nodos secundarios a la lista de resultados indicada.
Utilice el portal de Script para ver estos scripts con más detalle.
Análisis
El script analizador realiza la asignación de datos siguiente.Asignación de consumo de intervalo a XML sin formato
La siguiente tabla muestra la asignación entre los campos de datos de intervalos entrantes y los elementos secundarios del elemento Carga útil/Consumo en XML "sin formato":
Campo de consumo de intervalo | Elemento de XML sin formato |
---|---|
ID de tipo de registro |
RecordType |
Fecha/hora de inicio |
StartDateTime |
Fecha/hora de finalización |
EndDateTime |
ID de dispositivo |
DeviceId |
Duración de intervalo |
IntervalDuration |
UM |
UM |
Entradas de datos |
Intervalos/ Intervalo/ Valor [Estado] |
Contenido de un registro de fichero entrante. |
RawData |
Asignación de evento a XML sin formato
La tabla siguiente muestra la asignación entre los campos de datos de intervalos entrantes y los elementos secundarios del elemento Carga útil/Evento en XML "sin formato":
Campo de evento de dispositivo | Elemento de XML sin formato |
---|---|
ID de tipo de registro |
RecordType |
Fecha/hora de evento |
DateTime |
ID de dispositivo |
DeviceId |
Nombre de evento |
Nombre |
Contenido de un registro de fichero entrante. |
RawData |
Esquema XML de formato XML sin formato
El formato XML sin formato incluye a la vez elementos relacionados de evento de dispositivo y consumo de intervalo.
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/GenericAdapter"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ga="http://xmlns.oracle.com/GenericAdapter">
<xs:element name="Payload" type="ga:PayloadType"/>
<xs:complexType name="PayloadType">
<xs:sequence>
<xs:choice>
<xs:element name="Usage" type="ga:UsageType"/>
<xs:element name="Event" type="ga:EventType"/>
</xs:choice>
<xs:element name="RawData" type="ga:NonEmptyString"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="UsageType">
<xs:sequence>
<xs:element name="RecordType" type="ga:RecordTypeUsageType"/>
<xs:element name="StartDateTime" type="xs:integer"/>
<xs:element name="EndDateTime" type="xs:integer"/>
<xs:element name="DeviceId" type="ga:NonEmptyString"/>
<xs:element name="IntervalDuration" type="xs:integer"/>
<xs:element name="UOM" type="ga:NonEmptyString"/>
<xs:element name="Intervals" type="ga:IntervalList"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="RecordTypeUsageType">
<xs:restriction base="xs:string">
<xs:enumeration value="U"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="IntervalList">
<xs:sequence maxOccurs="unbounded">
<xs:element name="Interval" type="ga:IntervalType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IntervalType">
<xs:sequence>
<xs:element name="Value" type="xs:float"/>
<xs:element name="Status" type="ga:NonEmptyString" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EventType">
<xs:sequence>
<xs:element name="RecordType" type="ga:RecordTypeEventType"/>
<xs:element name="DateTime" type="xs:integer"/>
<xs:element name="DeviceId" type="ga:NonEmptyString"/>
<xs:element name="Name" type="ga:NonEmptyString"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="RecordTypeEventType">
<xs:restriction base="xs:string">
<xs:enumeration value="E"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Transformación
El script transformador realiza la asignación siguiente.
Asignación de XML sin formato a XML de predefinición
El transformador de carga útil crea los elementos XML de predefinición de evento de dispositivo y/o datos iniciales de medida de la manera siguiente:
Asignación de consumo: si el nombre del nodo Carga útil/* es igual que 'Consumo' (consumo de intervalo), el script crea un elemento XML con un nombre definido en el campo de Configuración de procesamiento carga útil SGG “ON de predefinición de datos iniciales de medida (intervalo)” y la estructura según la tabla de asignación siguiente:
Elemento de XML sin formato |
Elemento de predefinición de datos iniciales de medida |
Notas |
---|---|---|
RecordType |
No aplicable |
|
DeviceId |
dvcIdN |
|
UM |
externalUOM |
|
IntervalDuration |
Segundos por intervalo |
|
StartDateTime |
stDt |
Convertir a tipo de "dateTime" de OUAF |
EndDateTime |
enDt |
Convertir a tipo de "dateTime" de OUAF |
Intervalos/ |
|
|
Intervalo/ |
|
|
Valor [Estado] |
msrs |
Valor |
msrs/mL/q |
|
|
Estado -> |
|
|
msrs/mL/sts/stsL/st |
|
|
No aplicable |
imdType |
Valor constante 'D1IL' |
externalId |
Valor almacenado en el método setOrigin. |
|
serviceProviderExternalId |
Valor almacenado en el método setConfiguration. |
|
RawData |
rawData |
Si la configuración de procesamiento de carga útil de Smart Grid Gateway tiene la casilla de control Rellenar RAW marcada. |
Asignación de evento de dispositivo: si el nombre del nodo Carga útil/* es igual que 'Evento' (datos de evento de dispositivo), se crea un elemento XML con un nombre definido en el campo de Configuración de procesamiento carga útil SGG “Objeto de negocio de predefinición de evento de dispositivo” y la estructura según la tabla de asignación siguiente:
Elemento de XML sin formato |
Elemento de predefinición de evento de dispositivo |
Nota |
---|---|---|
RecordType |
No aplicable |
|
DateTime |
eventDateTime |
Convertir a tipo de "dateTime" de OUAF |
DeviceId |
externalUOM |
|
Nombre |
externalEventName |
|
externalSourceIdentifier |
Valor almacenado en el método setOrigin. |
|
externalSenderId |
Valor almacenado en el método setConfiguration. |
|
RawData |
rawEventInformation |
Si la configuración de procesamiento de carga útil de Smart Grid Gateway tiene la casilla de control Rellenar RAW marcada. |