Dans le cadre de la réalisation d’une carte lovelace, pour le suivi des consommations, et des coûts de l’option TEMPO EDF, j’utilise les sensors sql afin d’aller chercher les valeurs à J, J-1, S, S-1,M ,M-1, A et A-1 et ce pour chaque tarifs HP bleu, HP blanc, HP rouge, HC bleu, HC blanc, et HC rouge.
Home assistant stocke 10 jours de statistiques dans la table states
, puis il stocke les statistiques supérieures à 10 jours dans la table statistics
, ainsi donc le problème est le suivant:
si je me trouve dans le cas de figure ou nous sommes un lundi, j’affiche pour (S-1) à partir du lundi précédent donc < 10jours je tape la table states
, mais si nous sommes un samedi, je souhaite afficher la valeur du lundi précédent pour (S-1) soit 11 jours je dois taper la table statistics
, j’ai donc pour la même requête, deux tables différentes à utiliser…
Ce problème se retrouve pour S-1 si >10jours, pour M si <10 jours, pour A si <10 jours
En utilisant CASE
on peut vérifier avec (((strftime('%w', 'now') + 6) % 7 + 7) * 86400) + 21600 >= 864000
, que la durée en secondes depuis le lundi de la semaine précédente à 6h00 du matin est supérieure à 10 jours 864000 secondes
, on peut selectionner la bonne table
mais dans la partie FROM
je ne peux pas utiliser CASE
et je sèche complétement…
Si l’un d’entre vous a une idée, merci d’avance.
SELECT
CASE WHEN (((strftime('%w', 'now') + 6) % 7 + 7) * 86400) + 21600 >= 864000
THEN statistics.state
ELSE states.state
END AS state
FROM
statistics
INNER JOIN statistics_meta ON
statistics.metadata_id = statistics_meta.id
states
INNER JOIN states_meta ON
states.metadata_id = states_meta.metadata_id
WHERE
CASE WHEN (((strftime('%w', 'now') + 6) % 7 + 7) * 86400) + 21600 >= 864000
THEN
statistic_id = 'sensor.em_maison_bbrhpjr'
AND strftime('%s', created_ts) <= strftime('%s', 'now') - (((strftime('%w', 'now') + 6) % 7 + 7) * 86400) + 21600 -
CASE
WHEN strftime('%m', created_ts) BETWEEN '04' AND '10' THEN 0
ELSE 3600
END
ELSE
states_meta.entity_id = 'sensor.em_maison_bbrhpjr'
AND strftime('%s', 'last_updated_ts') <= strftime('%s', 'now') - (((strftime('%w', 'now') + 6) % 7) * 86400) + 21600 -
CASE
WHEN strftime('%m', last_updated_ts) BETWEEN '04' AND '10' THEN 0
ELSE 3600
END
END
ORDER BY
CASE WHEN (((strftime('%w', 'now') + 6) % 7 + 7) * 86400) + 21600 >= 864000
THEN created_ts
ELSE last_updated_ts
END DESC
LIMIT
1;