Gestion de Stock - Home Assistant / InfluxDB

2020-10-15T13:00:00Z

Bonjour,
Après quelques heures de galère afin de pouvoir trouver comment gérer mon stock de Pellets via HA, le résultat est plutôt satisfaisant. Je partage donc la démarche avec vous afin de vous faire gagner ce précieux temps.

Dans mon cas, le fonctionnement est le suivant :

  1. J’achète du Pellets => Je rentre le nombre de sacs en stock

  2. Je charge mon poêle => J’incrémente le compteur de sacs brûlés de 1

  3. Je contrôle les données sur une carte de mon tableau de bord. Et bientôt sur un écran tactile dédié…

Dans ces deux cas, la date et l’heure des événements sont également enregistrés

Je sépare volontairement les compteurs de sacs achetés et de pellets brûlés afin de pouvoir analyser simplement ces données par la suite.
Par exemple, en faisant ceci, je pourrais comparer le nombre de sacs brûlés d’une années sur l’autre sur des périodes spécifiques. Et même comparer ces consommations en fonction de l’évolution de la température extérieure sur ces périodes ! Mais çà, ce sera pour plus tard.

Pré-requis :

  • Avoir une installation Home Assistant fonctionnelle
  • Avoir accès à ses fichiers de configuration. Avec l’Add-On File Editor par exemple
  • Avoir ajouté l’Add-On InfluxDB et créé sa première base de données.
  • Maitriser l’ajout de cartes sur le tableau de bord

Aller, c’est parti !

Etape 1 : Créer les entrées nécessaires :
Ajoutons les entrées nécessaires au fonctionnement :

Les Nombres :
Depuis le menu : Configuration/Entrées de Home assistant, créer les nouvelles entrées nombre suivantes :

  • pellet_sacs_brules - Comptabilisera le nombre de sacs brûlés
  • pellet_sacs_brules_affich - Entrée qui sera réservée à l’affichage du nombre de sacs brûlés
  • pellet_achats_valides - Comptabilisera le nombre total de sacs achetés
  • pellet_achats_valides_affichage - Entrée qui sera réservée à l’affichage du nombre total de sacs achetés
  • qty_achat_sacs_pellets - Servira à définir le nombre de sacs à ajouter dans la base de données lors d’un achat

Note: J’ai volontairement séparé les entrées pour l’affichage et le décompte pour les raisons suivantes :

  • La mise à jours des données dans InfluxDB se fait par changement de valeurs. De ce fait, chaque fois qu’une entrée change de valeur, cela ajoute cette valeur dans la base de données. Concrètement, cela peut être très gênant si pour modifier le nombre de sacs achetés nous utilisons les flèches haut/bas de l’input_number. A chaque clic de souris, la valeur de l’entrée sera ajoutée dans le compte.
  • Les Sensors liés à des requête dans la base de données ne se mettent pas à jour en temps réels dans HA. Malgré l’aide de personnes bien plus expérimentées que moi, que je remercie encore, nous n’avons pas réussi à forcer la mise à jours de ces capteurs.
  • Les entrées dédiées à la base de données ne sont modifiées que par l’action de boutons que nous créons ci-dessous. Elles sont donc sécurisées car ne peuvent pas être modifiées depuis le tableau de bord car elle n’y apparaissent pas.

Les Interrupteurs :
Depuis le menu : Configuration/Entrées de Home assistant, créer les nouvelles entrées interrupteur suivantes :
*but_ajout_pellet - Interrupteur à actionner pour déclarer l’ajout d’un sac dans le poêle
*but_valid_achat_pellets - Interrupteur pour valider l’ajout de nouveaux sacs dans le stock

Etape 2 :
Ajoutons les sensors utiles dans le fichier de configuration.yaml :

- platform: influxdb
  # Nom de la base de données crée lors de l'installation de influxdb
  database: db_home_assistant
  # Nom et  Mot de passe de l'utilisateur de la base de données
  username: Nom_de_l'Utilisateur
  password: Mot_de_Passe_de_l'Utilisateur
  queries:
    - name: nbre_sacs_pellets_brules
      group_function: sum
      where: '"entity_id" = ''pellet_sacs_brules'''
      measurement: '"Sacs"'
    - name: nbre_sacs_pellets_commandes
      group_function: sum
      where: '"entity_id" = ''pellet_achats_valides'''
      measurement: '"Sacs"'

Ici nous avons créé 2 requêtes qui vont aller lire dans la base de données InfluxDB la somme des sacs brûlés & commandés et les attribuer aux deux sensor de l’argument name

Et ajoutons un autre Sensor chargé de mesurer la différence entre les sacs achetés & brûlés.

- platform: template
  sensors:
    pellet_sensor_stock:
      friendly_name: "Stock Pellet - Sensor"
      unit_of_measurement: 'Sacs'
      value_template: "{{states('input_number.pellet_achats_valides_affichage')|int - states('input_number.pellet_sacs_brules_affich')|int}}"

Etape 3 :
Ajoutons les Scripts qui gérerons les différentes actions. Pour cela il suffit de copier les lignes de codes suivantes dans le fichier scripts.yaml du répertoire configuration de HA.

Le premier déclenché à la validation de l’achat de Pellets :

poele_validation_achat:
  alias: Poele - Validation Achat
  sequence:
  - service: input_number.set_value
    data_template:
      entity_id: input_number.pellet_achats_valides
      value: '{{states(''input_number.qty_achat_sacs_pellets'')|int}}'
  - service: input_number.set_value
    data_template:
      entity_id: input_number.pellet_achats_valides
      value: 0
  - service: input_number.set_value
    data_template:
      entity_id: input_number.pellet_achats_valides_affichage
      value: '{{states(''input_number.pellet_achats_valides_affichage'')|int + states(''input_number.qty_achat_sacs_pellets'')|int}}'
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.but_valid_achat_pellets
  - service: input_number.set_value
    data:
      value: 0
    entity_id: input_number.qty_achat_sacs_pellets
  mode: single

Le second déclenché à l’ajout d’un sac dans le poêle :

ajout_sac_pellet:
  alias: Poele - Ajout_Sac_Pellet
  sequence:
  - service: input_number.set_value
    data:
      value: 1
    entity_id: input_number.pellet_sacs_brules
  - service: input_number.set_value
    data:
      value: 0
    entity_id: input_number.pellet_sacs_brules
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.but_ajout_pellet
  - service: homeassistant.update_entity
    data:
      entity_id:
      - sensor.nbre_sacs_pellets_brules
  - service: input_number.increment
    entity_id: input_number.pellet_sacs_brules_affich
    data: {}
  mode: single

Etape 4 : Automatisation permettant l’initialisation des données
Au démarrage de HA, les données sont extraites de la base de données pour initialiser les entrées réservées à l’affichage des valeurs de HA. Pour ce faire, il faut ajouter les lignes de codes ci-dessous dans le fichier automations.yaml du répertoire configuration de HA.

Attention, l’argument id: ne doit pas déjà être utilisé avec la même valeur dans vos automatisations

- id: '1602403059566'
  alias: Automatisation au Démarrage
  description: ''
  trigger:
  - platform: homeassistant
    event: start
  condition: []
  action:
  - service: input_number.set_value
    data_template:
      entity_id: input_number.pellet_sacs_brules_affich
      value: '{{states(''sensor.nbre_sacs_pellets_brules'')|int}}'
  - service: input_number.set_value
    data_template:
      entity_id: input_number.pellet_achats_valides_affichage
      value: '{{states(''sensor.nbre_sacs_pellets_commandes'')|int}}'
  mode: single

Etape 5 : Ajout de la carte au tableau de bord

Afin de tester que tout fonctionne bien, je vous mets ci-dessous le code de la carte que j’utilise. Si jusque là, vous n’avez pas personnalisé les noms des capteurs et entrées, il vous suffit de copier ce code, de créer une nouvelle carte manuelle dans le tableau de bord et de coller le code.

type: vertical-stack
cards:
  - type: entities
    entities: []
    title: Gestion Pellets
  - type: gauge
    min: 0
    max: 264
    name: De Pellets en Stock
    unit: Sacs
    severity:
      green: 198
      yellow: 128
      red: 66
    entity: sensor.pellet_sensor_stock
  - type: button
    tap_action:
      action: call-service
      service: script.ajout_sac_pellet
    entity: input_boolean.but_ajout_pellet
    name: +1 Sac dans le poêle
    icon_height: 35px
  - type: entity
    entity: input_number.pellet_sacs_brules_affich
    name: Total Sacs Brûlés
  - type: vertical-stack
    cards:
      - type: entities
        entities: []
        title: Achat Pellets
      - type: entity
        entity: input_number.pellet_achats_valides_affichage
        name: Total Sacs Achetés
      - type: entities
        entities:
          - entity: input_number.qty_achat_sacs_pellets
        title: Nouvel Achat
      - type: button
        tap_action:
          action: call-service
          service: script.poele_validation_achat
        entity: input_boolean.but_valid_achat_pellets
        icon_height: 35px

Elle n’est pas très sexy mais fonctionnelle. N’hésitez pas à partager les votre :slight_smile:

Conclusion
Voilà, tout est maintenant terminé. J’espère que tout se passera bien en suivant ces indications. Toutefois, si il y avait un soucis, je me ferais un plaisir de corriger cela. Pas facile pour moi d’écrire cela à postériori.
N’étant pas un expert de HA, il existe certainement un moyen d’optimiser tout cela. Je pense notamment à la mise à jour des sensors et à la possibilité d’écrire de vrais requêtes d’ajouts de données dans les bases au lieu de devoir passer les entrées à 1 puis à 0 pour écrire pour créer un événement. :rofl:. Auparavant, je le faisais avec NodeRed mais cette fois j’essaie de minimiser les ressources.

Pour ceux qui ont testé leur nouvelle fonctionnalité dans tout les sens (ils se reconnaitront), pour réinitialiser les tables concernées dans influxdb, il faut

  • Utiliser une connexion ssh

  • Taper les commandes :

    • Influxd - Pour lancer le service
    • influx -host homeassistant.local -username Votre_Nom_Utilisateur -password Votre_Mot_de_Passe
  • Et une fois connecté :

  • delete FROM « Votre_Measurement » WHERE « entity_id »=‹ Votre_Entrée ›. Par exemple pour les données correspondantes à mon projet, delete FROM "Sacs" WHERE "entity_id"='pellet_sacs_brules' pour effacer complètement les données concernant les sacs brûlés

Donc pour conclure :

  • Merci aux experts de faire en sorte que cette version s’optimise.
  • Merci aux graphistes de Lovelace de partager leurs plus belles cartes en rapport avec ce topic.
    Enfin :
  • J’espère avoir assez détaillé le tout pour que les débutants, comme moi, comprennent la démarche et puisse la reproduire pour des sujets plus personnels car une fois que l’on maitrise l’échange des données à les bases de données, le monde n’a plus de limites… (Je craque là !)
5 « J'aime »

Merci pour ton partage je vais mettre ça en application rapidement.

1 « J'aime »

Très intéressant. Pourquoi tu n’es pas passé par le plugin Grocy?

Merci pour le partage @Nouch :+1:

Concernant le fait de remettre à zéro, je trouve que c’est la meilleur solution pour les sacs achetés car dans un graph tu auras directement les pics qui correspondrons à tes achats :+1:

Par contre, pour la partie des sacs consommés(brulés), j’utiliserais simplement la fonction increment pour input_number.pellet_sacs_brules (comme tu le fait pour l’affichage de input_number.pellet_sacs_brules_affich). Car le but est d’avoir une vision sur l’ensemble de la saison. Avec ce que je dit, le graph ne cessera pas de monter et en fin de saison, il suffit de le réinitialiser. Mais avec ta méthode, j’arrive pas à me représenter le graph…je vais relire :face_with_monocle:
edit: du coup, ca te marque les jours où tu as mis un sac ? mais tu as déjà l’info avec input_boolean.but_ajout_pellet en fin de compte.
edit2 ah oui mais le input_boolean te permet pas d’utiliser la fonction sum

Ajout de la carte au post 1

1 « J'aime »

C’est un Plug-In que je ne connais pas. C’est la deuxième fois qu’on m’en parle.
Je vais investiguer. De mon coté, j’avais déjà travaillé avec InfluxDB & Grafana. D’où ce choix.

Tu veux bien nous en dire plus ?

Peut être même le présenter dans un post…au à minima dans ta reponse, juste un peu suffira.

je ne le connais pas trop. il gère les stock et code barre en gros

Grocy et une application Framalibre sur la gestion des stock et il y a un plugins directement intégré dans HA

1 « J'aime »

bonjour, merci pour le travail. Tout fonctionne chez moi.

Bonjour et merci pour ce post très intéressant mais je ne voie a aucun moment comment mettre a jour par ex nbr sac Pellet brûlé dans influxdb, j’ai du louper un truc.
Ok pour lire les valeurs mais l’enregistrement se passe de quelle manière?
Merci