MQTT - Reconhecer formato do dado enviado [RESOLVIDO]

Bom dia!

Estava utilizando o driver MQTT e gostaria de saber se é possível ler uma data no formato do Unix (por exemplo 1610392957) de modo que o E3 converta ela para um Date. Eu estou usando o template TS_UNIX, porém o valor de saída continua sendo o valor numérico. Isso é possível ou é necessário processar manualmente esse valor?

Grato,
Henrique

Olá,

Sub btnGetDateTime_Click()
    MsgBox EpochToDate(1610450152, -3)
End Sub
Function EpochToDate(UnixTime, TimeZoneOffset)
    EpochToDate = DateAdd("h", TimeZoneOffset, _
            DateAdd("s", UnixTime, DateSerial(1970, 1, 1)))
End Function

epoch

Certo, a utilização do template TS_UNIX serve somente para validar que seja um número inteiro, isso?

O que é o template TS_UNIX?

Me corrija se eu estiver errado, mas o ts_unix é o timestamp_unix, que é o número de segundos a partir de 01/01/1970, correto?

Sim, você está correto. Porém, no driver MQTT, é possível criar templates para ler os valores informados.

Lendo melhor agora vi que essas palavras chave aqui não permitem a leitura de tags individuais, e sim na hora de criar um template para um valor do tipo JSON, CSV ou XML. É uma pena, porque nem todos formatam seus dados assim.
Muito obrigado pelo script, creio que será útil :+1:t3:

Bom dia @hstarosky!

O valor de TS_UNIX está sendo retornado em um tag ou elemento de um bloco de comunicação? Ou diretamente no TimeStamp do tag/bloco?

Qual a versão do driver que está utilizando?

Atenciosamente,
Marco Antonio

Oi @hstarosky,

O driver mqtt recebe e apresenta o formato de DataHora, de acordo com o enviado. Sabe dizer se não conseguiria utilizar o formato TS_Text? Caso não, terá que formatar o valor nos campos de utilização, ou em um objeto de servidor, por exemplo tag interno ou xobject, através de associação, deixando ele preparado para qualquer local de utilização.

Exemplo da associação para TS_Unix no TimeStamp:
CDate(25569+Bloco.TimeStamp)

image

Qualquer dúvida estou à disposição.

Atenciosamente,
Marco Antonio

Bom dia @marco.

Acabei de testar ler o seguinte JSON:

{ "datahora" : "2021-01-02T00:00:00Z" }

Criei o seguinte template chamado Leitura para interpretar a data:

{"datahora":"TS_TEXT(%Y-%m-%dT%H:%M:%SZ)"}

E no log do driver, tive o seguinte resultado:

12/01/2021 10:49:31.229 (0844) DRIVER	Parsing from mkssistemas/teste..
12/01/2021 10:49:31.229 (0844) DRIVER	Msg: {"datahora":"2021-01-02T00:00:00Z"}
12/01/2021 10:49:31.229 (0844) TAG	<== (0.000) Tag('mkssistemas/teste;Leitura').Callback[10] = (2021.01.02 00:00:00) null

Esse mesmo problema ocorreu com ambas TS_UNIX e TS_DAYS1900 (com valores válidos para os mesmos padrões).

Estou com a versão que está disponível na página de Downloads, a v1.0.14. Alguma ideia do que pode estar ocorrendo?

Oi @hstarosky,

Pode testar com o seguinte template:
{ “datahora”: “IndexTS_TEXT(%Y-%m-%dT%H:%M:%SZ)” }

Ao final, mande o log do driver por favor, para marco@elipse.com.br

Qualquer dúvida estou à disposição.

Atenciosamente,
Marco Antonio

Opa, testei o template e agora ele reconheceu como uma data. Esse IndexTS_TEXT tem alguma diferença do sem Index?

@hstarosky,

Sem o Index, ele adiciona o valor ao TimeStamp do Bloco/Tag, com Index, ele entende que deve enviar o valor ao Value do Tag/Elemento do bloco.

Pode me enviar o log do driver por favor? (marco@elipse.com.br)

Muito obrigado!

Qualquer dúvida estou à disposição.

Atenciosamente,
Marco Antonio