Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 329 tic #330

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
3 changes: 2 additions & 1 deletion admin/i18n/de/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "JSON-Format für EFR SmartGridHub",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Standard Protokoll/Übertragung",
"value_transport_HttpRequestTransport": "Daten von einer HTTP-URL auslesen",
"value_transport_LocalFileTransport": "Daten aus einer lokalen Datei lesen",
"value_transport_SerialRequestResponseTransport": "Serielles Gerät mit bidir. Komm.",
"value_transport_SerialResponseTransport": "Serielle Daten werden nur gelesen",
"value_transport_TCPTransport": "Netzwerk/TCP-Daten werden nur gelesen"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/en/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "JSON-Format for EFR SmartGridHub",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protocol-/Transport-Default",
"value_transport_HttpRequestTransport": "Read data from an HTTP URL",
"value_transport_LocalFileTransport": "Read data from a local file",
"value_transport_SerialRequestResponseTransport": "Serial device with Bi-dir. comm.",
"value_transport_SerialResponseTransport": "Serial device reading data only",
"value_transport_TCPTransport": "TCP device reading data only"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/es/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (despertar, inicio de sesión, datos)",
"value_protocol_JsonEfrProtocol": "EFR SmartGridHub en formato JSON",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protocolo / transporte predeterminado",
"value_transport_HttpRequestTransport": "Leer datos de una URL HTTP",
"value_transport_LocalFileTransport": "Leer datos de un archivo local",
"value_transport_SerialRequestResponseTransport": "Dispositivo serie con Bi-dir. ",
"value_transport_SerialResponseTransport": "Solo datos de lectura del dispositivo serie",
"value_transport_TCPTransport": "Solo datos de lectura del dispositivo TCP"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/fr/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, données)",
"value_protocol_JsonEfrProtocol": "SmartGridHub EFR au format JSON",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protocol- / Transport-Default",
"value_transport_HttpRequestTransport": "Lire les données à partir d'une URL HTTP",
"value_transport_LocalFileTransport": "Lire les données à partir d'un fichier local",
"value_transport_SerialRequestResponseTransport": "Périphérique série avec Bi-dir. ",
"value_transport_SerialResponseTransport": "Périphérique série lisant uniquement les données",
"value_transport_TCPTransport": "Périphérique TCP lisant uniquement les données"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/it/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "Formato JSON EFR SmartGridHub",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Predefinito protocollo / trasporto",
"value_transport_HttpRequestTransport": "Leggi i dati da un URL HTTP",
"value_transport_LocalFileTransport": "Leggi i dati da un file locale",
"value_transport_SerialRequestResponseTransport": "Dispositivo seriale con Bi-dir. ",
"value_transport_SerialResponseTransport": "Solo dati di lettura del dispositivo seriale",
"value_transport_TCPTransport": "Solo lettura dei dati del dispositivo TCP"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/nl/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "EFR SmartGridHub in JSON-indeling",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protocol- / transportstandaard",
"value_transport_HttpRequestTransport": "Lees gegevens van een HTTP-URL",
"value_transport_LocalFileTransport": "Lees gegevens uit een lokaal bestand",
"value_transport_SerialRequestResponseTransport": "Serieel apparaat met Bi-dir. ",
"value_transport_SerialResponseTransport": "Alleen seriële apparaten lezen gegevens",
"value_transport_TCPTransport": "Alleen TCP-apparaat leest gegevens"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/pl/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "Format JSON EFR SmartGridHub",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protokół- / Transport-Default",
"value_transport_HttpRequestTransport": "Odczytaj dane z adresu URL HTTP",
"value_transport_LocalFileTransport": "Odczytaj dane z pliku lokalnego",
"value_transport_SerialRequestResponseTransport": "Urządzenie szeregowe z Bi-reż. ",
"value_transport_SerialResponseTransport": "Urządzenie szeregowe odczytuje tylko dane",
"value_transport_TCPTransport": "TCP Urządzenie odczytuje tylko dane"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/pt/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (WakeUp, SignOn, Data)",
"value_protocol_JsonEfrProtocol": "Formato JSON EFR SmartGridHub",
"value_protocol_SmlProtocol": "Smart Message Language 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Protocolo- / Transporte-Padrão",
"value_transport_HttpRequestTransport": "Ler dados de um URL HTTP",
"value_transport_LocalFileTransport": "Ler dados de um arquivo local",
"value_transport_SerialRequestResponseTransport": "Dispositivo serial com Bi-dir. ",
"value_transport_SerialResponseTransport": "Dados de leitura do dispositivo serial apenas",
"value_transport_TCPTransport": "Dados de leitura do dispositivo TCP apenas"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/ru/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0 (пробуждение, вход, данные)",
"value_protocol_JsonEfrProtocol": "JSON-формат EFR SmartGridHub",
"value_protocol_SmlProtocol": "Язык умных сообщений 1.0.3/1.0.4",
"value_protocol_TicProtocol": "Télé-Information Client",
"value_protocol_default": "Протокол / Транспорт по умолчанию",
"value_transport_HttpRequestTransport": "Чтение данных из URL-адреса HTTP",
"value_transport_LocalFileTransport": "Чтение данных из локального файла",
"value_transport_SerialRequestResponseTransport": "Последовательное устройство с Bi-dir. ",
"value_transport_SerialResponseTransport": "Только данные чтения последовательного устройства",
"value_transport_TCPTransport": "Только данные устройства TCP для чтения"
}
}
3 changes: 2 additions & 1 deletion admin/i18n/zh-cn/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@
"value_protocol_D0Protocol": "D0(唤醒,登录,数据)",
"value_protocol_JsonEfrProtocol": "JSON格式的EFR SmartGridHub",
"value_protocol_SmlProtocol": "智能消息语言1.0.3",
"value_protocol_TicProtocol": "客户电话信息",
"value_protocol_default": "协议/传输默认",
"value_transport_HttpRequestTransport": "从HTTP URL读取数据",
"value_transport_LocalFileTransport": "从本地文件读取数据",
"value_transport_SerialRequestResponseTransport": "具有双向目录的串行设备。",
"value_transport_SerialResponseTransport": "串行设备仅读取数据",
"value_transport_TCPTransport": "TCP设备仅读取数据"
}
}
1 change: 1 addition & 0 deletions admin/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@
<option class="translate" value="D0Protocol">value_protocol_D0Protocol</option>
<option class="translate" value="JsonEfrProtocol">value_protocol_JsonEfrProtocol</option>
<option class="translate" value="SmlProtocol">value_protocol_SmlProtocol</option>
<option class="translate" value="TicProtocol">value_protocol_TicProtocol</option>
</select>
</td>
<td>
Expand Down
1 change: 1 addition & 0 deletions admin/words.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

154 changes: 154 additions & 0 deletions lib/ticcollector.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
const { SerialPort } = require('serialport');
const { ReadlineParser } = require('@serialport/parser-readline');

// Types, units of TIC fields
// TODO: add descriptions with translations
// TODO: add tri-phase
// TODO: add 'standard' mode
const ticStateCommon = {
'ADCO': { type: 'string' },
'OPTARIF': { type: 'string' },
'ISOUSC': { type: 'number', unit: 'A', role: 'value.current' },
'BASE': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },

'HCHC': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'HCHP': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },

'EJPHN': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'EJPHPM': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },

'BBRHCJB': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'BBRHPJB': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'BBRHCJW': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'BBRHPJW': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'BBRHCJR': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },
'BBRHPJR': { type: 'number', unit: 'Wh', role: 'value.power.consumption' },

'PEJP': { type: 'number' /* In minutes */ },

'PTEC': { type: 'string' },
'DEMAIN': { type: 'string' },

'IINST': { type: 'number', unit: 'A', role: 'value.current' },
'ADPS': { type: 'number', unit: 'A', role: 'value.current' },
'IMAX': { type: 'number', unit: 'A', role: 'value.current' },

'PAPP': { type: 'number', unit: 'VA' }, // TODO: no role for VA documented

'HHPHC': { type: 'string' },
'MOTDETAT': { type: 'string' }
};

var adapter;
var smOptions;
var port;
var adco;

function init(adapterIn, setConnected, options) {
adapter = adapterIn;
adapter.log.debug('Init TIC collector');

// Stash options
smOptions = options;
smOptions.setConnected = setConnected;

// Return something that looks like the OBIS interface to caller
return {
process: processTic,
stop: stopTic
};
}

// TODO: maybe honour requestInterval option, but given TIC is a constant stream hardly seems appropriate.
function processTic() {
adapter.log.debug('Starting TIC processing');

port = new SerialPort({
path: smOptions.transportSerialPort,
baudRate: smOptions.transportSerialBaudrate,
// TODO: there are options to override this which we currently ignore. Maybe handle them?
dataBits: 7,
parity: 'even'
});

const parser = port.pipe(new ReadlineParser({ delimiter: '\n' }));
var nameValueCache = [];
parser.on('data', (data) => {
// data is a string
adapter.log.silly(data);

const parts = data.split(/\s+/);
const name = parts.shift();
// convert string value to number if necessary
const value = parts.shift();
const checksum = parts.shift();
// TODO: verify checksum;

// TODO: Does the protocol cater for multiple ADCO values in the same stream?
if (name === 'ADCO') {
if (adco !== value) {
adco = value;
adapter.log.info('Found ID ' + adco);
smOptions.setConnected(true);
}
}

if (ticStateCommon[name] === undefined) {
// We don't know what this field is so ignore it
adapter.log.warn('Unknown label (ignoring): ' + name);
} else if (nameValueCache[name] === value) {
// Nothing has changed since the last time, do nothing
} else if (adco) {
// Label known & new value so create channel/state set value
nameValueCache[name] = value;

// Only create/set objects if the channel (adco) is known.
// TODO: this needs cleaning up
adapter.setObjectNotExists(adco, {
type: 'channel',
common: {
name: adco
},
native: {}
}, (err) => {
if (err) {
adapter.log.error('Failed to create channel ' + adco);
} else {
const stateName = adco + '.' + name;
adapter.setObjectNotExists(stateName, {
type: 'state',
common: ticStateCommon[name]
// TODO: other attributes?
}, (err) => {
if (err) {
adapter.log.error('Failed to create state ' + stateName);
} else {
// convert string value to number if necessary
adapter.setState(stateName, {
ack: true,
val: ticStateCommon[name].type === 'number' ? Number(value) : value
}, (err) => {
if (err) {
adapter.log.error('Failed to set state ' + stateName);
}
});
}
});
}
});
}
});
}

function stopTic(callback) {
adapter.log.debug('Stopping TIC processing');
// TODO: surely we should destroy the parser here too, but cannot find method to do that!
// TODO: seems like we should really check if the port is open before closing it but it works without sooooo... <:o)
if (port) {
port.close(callback);
}
}

module.exports = {
init: init
}
Loading