O post vai ser um pouco mais longo que o normal… Instalei o NR + o plugin cron-plus. No NR eu tenho aquilo que se segue.
De reparar que eu quero ter a contagem do ponta, cheio e vazio, do que consumo e do que vendo.
No cron-plus, faço ele disparar aos 0, 15, 30 e 45 segundos. No query eu tenho:
// Get current date
var d = new Date();
// Get current year and convert to string
var year = d.getFullYear();
year = year.toString();
// get current month as a number 0-11 and add 1 to it
var month = d.getMonth() + 1;
// Convert month to string
if ( month < 10 ) {
month = month.toString();
month = "0" + month;
} else {
month = month.toString();
}
// Build the InfluxDb query
msg.query = "SELECT last(\"value\") - first(\"value\") FROM \"homeassistant\".\"autogen\".\"kWh\" WHERE time >= '" + year + "-" + month + "-01T00:10:00Z' AND time <= now() AND \"entity_id\"='fornecido_ponta'";
return msg;
Observe que cada um terá de criar o query a apontar para o nome que deu ao sensor que colhe os dados vindo do contador de energia.
No node do InfluxDb não tenho nada já que a função anterior cria o query que eu quero e mete no “msg.query”.
Na função “extrai dado” eu só pego o resultado do query via:
msg.payload[0]["ponta"] = msg.payload[0].last_first;
return msg;
Por último, no “controi MQTT” eu tenho:
context.data = context.data || {};
// Get current date
var d = new Date();
// Get current year and convert to string
var year = d.getFullYear();
year = year.toString();
// get current month as a number 0-11 and add 1 to it
var month = d.getMonth() + 1;
// Convert month to string
if ( month < 10 ) {
month = month.toString();
month = "0" + month;
} else {
month = month.toString();
}
// Process each input (ponta, cheia, vazio)
if (msg.payload[0].ponta) {
context.data.ponta = msg.payload[0].ponta;
}
if (msg.payload[0].cheia) {
context.data.cheia = msg.payload[0].cheia;
}
if (msg.payload[0].vazio) {
context.data.vazio = msg.payload[0].vazio;
}
// Publish all values
if(context.data.ponta != null && context.data.cheia != null && context.data.vazio != null) {
var total = context.data.ponta + context.data.cheia + context.data.vazio;
msg.payload = {
time : msg.payload[0].time,
ponta : context.data.ponta,
cheia : context.data.cheia,
vazio : context.data.vazio,
total : total
}
context.data=null;
msg.topic = "tele/fornecido/" + year + "-" + month
return msg;
} else {
msg = null;
return msg;
}
Repara que eu crio um “topic” por ano e por mês.
Por fim, no configuration.yaml eu tenho:
# Julho fornecido
- platform: mqtt
state_topic: "tele/fornecido/2021-07"
name: "fornitotal_7"
value_template: "{{ (value_json.total | float) | round(2) }}"
unit_of_measurement: 'kW'
icon: mdi:transmission-tower
- platform: mqtt
unique_id: forni_ponta7
state_topic: "tele/fornecido/2021-07"
name: "ForniPonta7"
value_template: "{{ (value_json.ponta | float) | round(2) }}"
unit_of_measurement: 'kW'
icon: mdi:transmission-tower
- platform: mqtt
unique_id: forni_cheia7
state_topic: "tele/fornecido/2021-07"
name: "ForniCheia7"
value_template: "{{ (value_json.cheia | float) | round(2) }}"
unit_of_measurement: 'kW'
icon: mdi:transmission-tower
- platform: mqtt
unique_id: forni_vazio7
state_topic: "tele/fornecido/2021-07"
name: "ForniVazio7"
value_template: "{{ (value_json.vazio | float) | round(2) }}"
unit_of_measurement: 'kW'
icon: mdi:transmission-tower
No Node “Publica” só é necessário configurar o broker de MQTT.
Depois é criar um card por mês com o valor de ponta, cheio e vazio, com o consumido e fornecido.
Meu desafio agora é ter, ao invés de dados numéricos, um gráfico.