Como criar uma base de dados leve no HA com histórico e apresentação gráfica

Já tinha experimentado, mas como também me estava a dar erro…

2021-06-13 17:23:07 ERROR (SyncWorker_5) [homeassistant.components.sql.sensor] Error executing query SELECT
CONCAT('[', GROUP_CONCAT(`month` ORDER BY `order` SEPARATOR ','), ']') AS labels,
CONCAT('[', GROUP_CONCAT(`total` ORDER BY `order` SEPARATOR ','), ']') AS data,
'info in attributes' AS 'attributes'
FROM
(
SELECT
ROUND(SUM(`total`), 2) AS 'total',
CONCAT('"',MONTHNAME(date), ' ', YEAR(date),'"') AS 'month',
DATE(`date`) AS 'order'
FROM `consumo_casa`
GROUP BY MONTH(`date`), YEAR(`date`)
ORDER BY `date` DESC
LIMIT 12
) AS `something`;: (MySQLdb._exceptions.OperationalError) (1054, "Unknown column 'total' in 'field list'")
[SQL: SELECT
CONCAT('[', GROUP_CONCAT(`month` ORDER BY `order` SEPARATOR ','), ']') AS labels,
CONCAT('[', GROUP_CONCAT(`total` ORDER BY `order` SEPARATOR ','), ']') AS data,
'info in attributes' AS 'attributes'
FROM
(
SELECT
ROUND(SUM(`total`), 2) AS 'total',
CONCAT('"',MONTHNAME(date), ' ', YEAR(date),'"') AS 'month',
DATE(`date`) AS 'order'
FROM `consumo_casa`
GROUP BY MONTH(`date`), YEAR(`date`)
ORDER BY `date` DESC
LIMIT 12
) AS `something`;]
(Background on this error at: http://sqlalche.me/e/14/e3q8)

Não existe a coluna total, altera para o nome da tua coluna

1 Curtiu

Desculpa a minha ignorância, não estou a conseguir ainda tomar conta deste assunto e o meu tempo tem sido mesmo muito curto…

Basta este ‘total’ ou tem de ser os outros?

Já me aparece assim, não sei se estara correto…

Obrigado

Sim, está correto assim

1 Curtiu

Bom dia,

O meu mariadb deixou de registar dados… no log do HA tenho o erro:
Error running command: python3 /config/py_scripts/daily_insert_mysql.py --host=core-mariadb --user=XXXX --password=XXXX --db=custom_data --table={{ table }} --value={{ value }} {{ '--col='+column if column is defined }}, return code: 1

E tenho os graficos a 0…
alguma sugestao?

Bom dia,

Estou com o memso problema, fiz update hoje. @elpadrinho conseguiu resolver?

Obrigado.

Olá Ricardo,
Não.
Desisti e comecei a usar Grafana e Influxdb

Como o log não é muito detalhado

Podes colocar isto no configuration.yaml para que o erro seja mais especifico

logger:
  default: warning
  logs:
    homeassistant.components.shell_command: debug

Talvez o HA não esteja a conseguir comunicar com o mariadb, usas o mariadb no recorder do HA também? E funciona?

No título dos gráficos, é possível adicionar html? Gostaria de personalizar o texto mas não consegui

Eu utilizo um card markdown e um vertical-sack para este efeito:

image

É uma hipótese mas preferia no próprio card do gráfico. Tenho vários cards com gráficos e facilitava a leitura.

para maior customização o melhor é usar o markdown card

Viva!

Eu fiz o mesmo, instalei InfluxDb + Grafana. Depois descobri que colocar os gráficos de barras no Grafana, por períodos fechados, tipo uma barra a mostrar o consumo do mês, do dia 1 ao dia 30, é uma tarefa quase impossível. Desisti do Grafana…

Resolvi então utilizar o Node Red para fazer queries no InfluxDb, processar os queries e depois enviar o resultado, via MQTT, para um sensor. Assim consigo, com muita precisão, ter os dados corretos.

Continuo ainda sem saber como vou criar os gráficos, em barras, com a informação que quero.

Se alguém julgar proveitoso posso publicar o que pus no Node Red.

@Moacir_Ferreira, para os gráficos tens vários hipóteses:

  • uses o método descrito na 1ª mensagem (Card Chartjs Card) - componente desenvolvido pelo nosso colega @ricreis394
  • usas este componete: apexcharts-card

Por fim, se puderes partilhar a tua abordagem em NR, agradeço

Porquê fazer isso se o NR pode injectar os dados directamente no sensor ou até criar um sensor?

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.

1 Curtiu

Sou um principiante… Vou tentando resolver os problemas da forma que posso pelo que conheço do HA e plug-ins. Não sabia que o NR fazia o que dizes, pelo que vou voltar ao estudo tentar entender o benefício e depois utilizar se verificar que facilita as coisas.

De qualquer das formas, obrigado pela dica!

Penso que o novo menu Energia do HA vem satisfazer muitas das necessidades que fomos colocando aqui.

Olá pessoal,

Estou a tentar criar a base de dados mas está complicado.
Segui os passos todos e nunca chegou a criar a BD. Entretanto lembrei-me de ativar os logs para o shell_command e apanhei lá isto:

Calculo que seja por causa disto que não é criada a base de dados.

Alguém me consegue dar uma ajuda pf?

Obrigado!

De facto, a dependência pymysql não está a ser instalada.

Faz o seguinte, entra no terminal da máquina do HA. E faz o seguinte comando:
docker exec -it homeassistant bash
Depois:
pip install pymysql

E vê que erro dá


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade