GithubHelp home page GithubHelp logo

f00b4r0 / tic2json Goto Github PK

View Code? Open in Web Editor NEW
6.0 5.0 2.0 191 KB

An ENEDIS TIC (Télé-Information Client) protocol parser and converter. Mirror of http://vcs.slashdirt.org/git/sw/tic2json.git

Home Page: http://hacks.slashdirt.org/sw/tic2json/

License: GNU General Public License v2.0

Makefile 0.88% C 25.43% Lex 27.07% Yacc 38.17% CMake 1.52% Python 6.93%
tic teleinfo linky grafana json enedis bison-flex bison-grammar

tic2json's Introduction

tic2json

An ENEDIS TIC (Télé-Information Client) protocol parser and converter

More info (in French): http://hacks.slashdirt.org/sw/tic2json/

Example Grafana dashboard: screenshot

License

GPLv2-only - http://www.gnu.org/licenses/gpl-2.0.html

Copyright: (C) 2021-2023 Thibaut VARÈNE

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2, as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See LICENSE.md for details

Dependencies

  • A C compiler supporting the C standard library for the target system (e.g. gcc)
  • make, flex and bison on the build host

Building

To build, run cd src; make

Note: the build can be adjusted through the top Makefile variables. In particular, it is possible to build support for only specific version(s) of the TIC.

For integration with embedded applications, defining BAREBUILD and/or PRINT2BUF provides access to an API that may be more suitable. See examples in the embedded folder.

Usage

The current implementation supports TIC versions 01 and 02 (a.k.a historique and standard modes). It also provides a near complete support for the TIC output of PME-PMI meters.

The tool emits one root JSON object per TIC frame. Each root object is followed by a new line. Usage help is available by executing the software with the -h parameter.

A tty interfaced to the meter TIC output (using e.g. TIC2UART) can be set using the following stty settings:

stty -F <serial_tty> <speed> raw evenp

Where <serial_tty> is the target tty (e.g. /dev/ttyS0) and <speed> is either 1200 or 9600.

TIC output from electronic meters is either:

  • 7E1@1200bps for "historique" mode
  • 7E1@9600bps for "standard" mode

For PME-PMI meters, the output is 7E1 at a speed set by Enedis (1200 (default), 2400, 4800, 9600 or 19200bps).

Notes

Implementing other types of outputs (XML, etc) should be trivial given the implementation.

Using output with Telegraf

For reference, the output of this tool is suitable for feeding a Telegraf 'socket_listener' configured as follows:

[[inputs.socket_listener]]
  service_address = "udp://:8094"
  data_format = "json"
  json_strict = true
  json_name_key = "label"
  tag_keys = ["id"]

The following command line can be used to send adequate data (works for either TIC 01 or TIC 02):

stdbuf -oL ./tic2json -1 < /dev/ttyS0 | while read line; do echo "$line" | nc -q 0 -u telegraf_host 8094; done

Alternatively, using dictionnary output and JSON_v2 parser for TIC "standard" processing:

[[inputs.socket_listener]]
  service_address = "udp://:8094"
  data_format = "json_v2"
  [[inputs.socket_listener.json_v2]]
    measurement_name = "ticv2"
    timestamp_path = "DATE.horodate"
    timestamp_format = "rfc3339"
    [[inputs.socket_listener.json_v2.object]]
      path = "@this"
      included_keys = [ "PRM_data", "EAST_data", "IRMS1_data", "URMS1_data", "SINSTS_data", "SMAXSN_data", "UMOY1_data" ]
      tags = [ "PRM_data" ]
      [inputs.socket_listener.json_v2.object.renames]
        PRM_data = "PRM"

Fed with:

stdbuf -oL ./tic2json -2 -dr < /dev/ttyS0 | while read line; do echo "$line" | nc -q 0 -u telegraf_host 8094; done

Will only log EAST, IRMS1, URMS1, SINSTS, SMAXSN and UMOY1, tagged with PRM (the meter's ID), at the timestamp provided by the meter.

Note: the 'xpath_json' format parser may be an even better choice than json_v2. Setup is left as an exercise for the reader.

Note: 'socket_listener' expects exactly 1 JSON object per UDP packet (decoding of data is done on a per-packet basis), hence the need to send each line individually with nc. Another alternative is to use the script provided in tools/ticprocess.py.

PME-PMI specifics

The PME-PMI meter uses a variant of TIC 01 that does not provide enough date/time information to infer the current DST and adjust the UTC offset in the converted (-r) date output.

In that case, the converted horodate will ommit this offset in the output. The resulting string is still valid ISO 8601 but no longer valid RFC3339.

The following configuration can be used with telegraf's JSON_v2 parser to correctly handle this:

    timestamp_path = "DATE.horodate"
    timestamp_format = "2006-01-02T15:04:05"
    timestamp_timezone = "Local"

The timestamps will be logged following the telegraf server timezone which is assumed to be the same as that of the meter (adjust as necessary).

Note: if using Telegraf to ingest the data, the 'xpath_json' format parser may actually be more suitable as it makes handling underscores in labels easier.

Embedded applications

The following embedded applications are based on this tool

  • esptic2udp - Espressif ESP8266/ESP32 Enedis TIC data to JSON converter and UDP sender

Stub applications are provided in the embedded folder for the following platforms:

  • Raspberry Pi Pico (basic demonstration stub): picotic gets TIC data on RX pin, outputs formatted JSON on UART TX

These are very simple stubs that (ab)use the stdio interface provided by these platforms, as a starting point example.

tic2json's People

Contributors

f00b4r0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.