F1ATB forum
RMS VE – Intégration Home Assistant v0.2.3 - Version imprimable

+- F1ATB forum (https://f1atb.fr/forum_f1atb)
+-- Forum : Forum de F1ATB (https://f1atb.fr/forum_f1atb/forum-3.html)
+--- Forum : Routeur Photovoltaïque (https://f1atb.fr/forum_f1atb/forum-4.html)
+---- Forum : Adaptation aux chargeurs VE (https://f1atb.fr/forum_f1atb/forum-16.html)
+---- Sujet : RMS VE – Intégration Home Assistant v0.2.3 (/thread-2503.html)



RMS VE – Intégration Home Assistant v0.2.3 - Geosr - 05-04-2026

Bonjour à tous,

Je vous partage ici la procédure complète pour installer et utiliser l’intégration RMS VE dans Home Assistant, permettant de piloter et superviser un routeur de charge VE.
J'avais fait un premier post en utilisant les packtages.. mais c'etait pas trés propre....

Installation via HACS
1. Ajouter le dépôt
Dans Home Assistant Community Store (HACS) :
  • Aller dans Integrations
  • Menu (⋮) → Custom repositories
Ajouter :
Code :
https://github.com/Geosr600/ha-rms-ve
Type :  Integration


2. Installation:
  • Rechercher RMS VE
  • Installer
  • Redémarrer Home Assistant

Configuration
Après redémarrage :
  1. Aller dans :
    Paramètres → Appareils & Services
  2. Ajouter :
    RMS VE
Paramètres demandés :
  • Adresse IP du routeur VE
  • Nom de l’équipement
Le nom servira de base pour les entités



Feedback / contributions
N’hésitez pas à :
  • remonter des bugs
  • proposer des améliorations
  • partager vos dashboards
Repo GitHub :
https://github.com/Geosr600/ha-rms-ve

chancelog
passage en V0.2.3
- recuperation et controle des valeurs de la page configuration borne VE.
- Choix de modification de mode au branchement / débranchement
- rajout de "énergie à ajouter".


RE: ? RMS VE – Intégration Home Assistant (Guide complet) - grostoto - 05-04-2026

Tu es un champion.


RE: ? RMS VE – Intégration Home Assistant (Guide complet) - Sgb31 - 05-04-2026

Bravo Geosr, c'est TOP !


RE: ? RMS VE – Intégration Home Assistant (Guide complet) - Geosr - 05-04-2026

(05-04-2026, 08:59 AM)grostoto a écrit : Tu es un champion.

Merci...

Cela sera plus simple que la première méthode...

N'hésite pas a me dire s'il y a des bug chez toi


RE: ? RMS VE – Intégration Home Assistant (Guide complet) - grostoto - 05-04-2026

je partage une card, on peut la découper en petits bouts..

Code :
type: vertical-stack
cards:
  - square: false
    type: grid
    columns: 4
    cards:
      - type: custom:button-card
        name: Arrêt
        icon: mdi:stop-circle
        tap_action:
          action: call-service
          service: script.ve_mode_arret
        styles:
          card:
            - height: 60px
            - border-radius: 16px
            - background-color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 3
                ? 'rgba(244, 67, 54, 0.8)' : '#1a1a1a' ]]]
            - border: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 3
                ? '2px solid #f44336' : '1px solid #333' ]]]
            - box-shadow: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 3
                ? '0 0 15px rgba(244,67,54,0.6)' : 'none' ]]]
          icon:
            - color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 3
                ? 'white' : '#f44336' ]]]
          name:
            - color: white
            - font-weight: 700
            - font-size: 11px
      - type: custom:button-card
        name: Auto
        icon: mdi:flash-auto
        tap_action:
          action: call-service
          service: script.ve_mode_auto
        styles:
          card:
            - height: 60px
            - border-radius: 16px
            - background-color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 0
                ? 'rgba(76, 175, 80, 0.8)' : '#1a1a1a' ]]]
            - border: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 0
                ? '2px solid #4caf50' : '1px solid #333' ]]]
            - box-shadow: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 0
                ? '0 0 15px rgba(76,175,80,0.6)' : 'none' ]]]
          icon:
            - color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 0
                ? 'white' : '#4caf50' ]]]
          name:
            - color: white
            - font-weight: 700
            - font-size: 11px
      - type: custom:button-card
        name: Semi-auto
        icon: mdi:sync
        tap_action:
          action: call-service
          service: script.ve_mode_semi_auto
        styles:
          card:
            - height: 60px
            - border-radius: 16px
            - background-color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 1
                ? 'rgba(33, 150, 243, 0.8)' : '#1a1a1a' ]]]
            - border: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 1
                ? '2px solid #2196f3' : '1px solid #333' ]]]
            - box-shadow: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 1
                ? '0 0 15px rgba(33,150,243,0.6)' : 'none' ]]]
          icon:
            - color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 1
                ? 'white' : '#2196f3' ]]]
          name:
            - color: white
            - font-weight: 700
            - font-size: 11px
      - type: custom:button-card
        name: Manuel
        icon: mdi:hand-back-right
        tap_action:
          action: call-service
          service: script.ve_mode_manuel
        styles:
          card:
            - height: 60px
            - border-radius: 16px
            - background-color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 2
                ? 'rgba(156, 39, 176, 0.8)' : '#1a1a1a' ]]]
            - border: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 2
                ? '2px solid #9c27b0' : '1px solid #333' ]]]
            - box-shadow: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 2
                ? '0 0 15px rgba(156,39,176,0.6)' : 'none' ]]]
          icon:
            - color: >-
                [[[ return states['sensor.borne_ve_api']?.attributes?.mode == 2
                ? 'white' : '#9c27b0' ]]]
          name:
            - color: white
            - font-weight: 700
            - font-size: 11px
  - type: tile
    entity: number.courant_borne_ve_dynamique
    name: réglage intensité
    icon: mdi:lightning-bolt
    features:
      - type: numeric-input
    card_mod:
      style: |
        ha-card {
          {% set v = states('number.courant_borne_ve_dynamique') | float(0) %}
          {% set c = '#4caf50' if v < 14 else '#ff9800' if v <= 16 else '#f44336' %}
          --tile-color: {{ c }} !important;
        }
        ha-control-slider {
          --control-slider-background: rgba(255, 255, 255, 0.2) !important;
          --control-slider-thumb-visibility: visible !important;
        }
  - type: custom:button-card
    entity: sensor.etat_de_la_liaison_ve
    name: État de la liaison VE
    show_icon: true
    show_name: true
    show_state: true
    styles:
      grid:
        - grid-template-areas: "\"i n s\""
        - grid-template-columns: 45px auto max-content
        - align-items: center
      card:
        - padding: 8px 16px
        - background: none
        - border: none
        - box-shadow: none
        - "--wave-color": |
            [[[
              const v = states['sensor.courant_de_charge_ve'].state;
              if (v < 14) return '76, 175, 80';    // Vert (#4caf50)
              if (v <= 16) return '255, 152, 0';   // Orange (#ff9800)
              return '244, 67, 54';                // Rouge (#f44336)
            ]]]
      icon:
        - width: 40px
        - height: 40px
        - margin-left: 10px
        - color: |
            [[[
              const s = entity.state;
              if (s.includes('A -')) return '#9e9e9e';
              if (s.includes('B -')) return '#00b0ff';
              if (s.includes('C -')) return '#00b0ff';
              if (s.includes('F -')) return '#ff5252';
              return 'white';
            ]]]
      name:
        - justify-self: start
        - font-size: 14px
        - margin-left: 20px
      state:
        - justify-self: end
        - font-size: 14px
    custom_fields:
      wave: |
        [[[
          if (entity.state.includes('C -')) {
            return `
              <div class="wave-container">
                <svg class="wave-svg second" viewBox="0 0 1440 320"><path d="M0,160L48,170.7C96,181,192,203,288,218.7C384,235,480,245,576,240C672,235,768,213,864,202.7C960,192,1056,192,1152,181.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path></svg>
                <svg class="wave-svg" viewBox="0 0 1440 320"><path d="M0,160L48,170.7C96,181,192,203,288,218.7C384,235,480,245,576,240C672,235,768,213,864,202.7C960,192,1056,192,1152,181.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path></svg>
              </div>
            `;
          }
        ]]]
    extra_styles: |
      .wave-container {
        position: absolute;
        top: 0px;
        left: 8px;
        width: 70px;
        height: 55px;
        border-radius: 50%;
        overflow: hidden;
        z-index: 0;
        background: rgba(var(--wave-color), 0.1); /* Utilise la variable */
        pointer-events: none;
      }
      .wave-svg {
        position: absolute;
        bottom: -8px;
        left: 0;
        width: 400%;
        height: 140%;
        fill: rgba(var(--wave-color), 0.5); /* Utilise la variable */
        animation: wave-move 3s infinite linear;
      }
      .wave-svg.second {
        fill: rgba(var(--wave-color), 0.2); /* Utilise la variable */
        animation: wave-move 6s infinite linear;
        bottom: -0px;
      }
      @keyframes wave-move {
        0% { transform: translateX(0); }
        100% { transform: translateX(-70%); }
      }
      .img-cell {
        z-index: 1;
      }
  - type: custom:config-template-card
    entities:
      - number.courant_borne_ve_dynamique
      - sensor.courant_de_charge_ve
    card:
      type: custom:bar-card
      name: Courant Actuel
      direction: right
      height: 40px
      positions:
        icon: "off"
        indicator: "off"
        name: inside
        value: inside
      min: 4
      max: ${states['number.courant_borne_ve_dynamique'].attributes.max}
      severity:
        - color: "#00e676"
          from: 0
          to: 13.9
        - color: "#ffeb3b"
          from: 14
          to: 16
        - color: "#ff5252"
          from: 16.1
          to: 40
      style: |
        ha-card {
          background: #000;
          border-radius: 15px;
          border: 1px solid #444;
          padding: 10px;
        }
        /* Optionnel : ajoute du contraste au texte sur les couleurs claires */
        .bar-card-name, .bar-card-value {
          font-weight: bold;
          text-shadow: 1px 1px 2px rgba(0,0,0,0.8);
        }
      entities:
        - entity: sensor.courant_de_charge_ve
  - type: entities
    title: Station de charge VE
    show_header_toggle: false
    entities:
      - entity: sensor.courant_de_charge_ve
        name: Courant de charge
        icon: mdi:flash
      - entity: sensor.routeur_maitre_routeur_rms_puissances_m
        name: Production-Consommation
        icon: mdi:solar-power-variant-outline
        card_mod:
          style: |

            :host {

              --paper-item-icon-color: #ff9800;

              background-color: rgba(144, 238, 144, 0.1);

            }
      - entity: sensor.recharge_cumulee_ve
        name: Recharge Cumulée d'énergie
      - entity: sensor.temps_de_charge_ve
        name: Temps de charge
      - entity: sensor.pwm_borne_ve
        name: PWM
        icon: mdi:pulse
      - entity: sensor.etat_de_la_liaison_ve
        name: État de la liaison VE
        card_mod:
          style:
            state-badge:
              $: |
                ha-state-icon {
                  {% set etat = states('sensor.etat_de_la_liaison_ve') %}
                  {% if 'A -' in etat %}
                    color: #9e9e9e !important;
                  {% elif 'B -' in etat %}
                    color: #00b0ff !important;
                  {% elif 'C -' in etat %}
                    color: #00e676 !important;
                    animation: blink 2s infinite;
                  {% elif 'F -' in etat %}
                    color: #ff5252 !important;
                  {% endif %}
                }
                ha-icon {
                  height: 40px !important;
                  width: 40px !important;
                }
                @keyframes blink {
                  50% { opacity: 0.3; }
                }
            .: |
              :host {
                --mdc-icon-size: 40px !important;
              }
      - entity: sensor.mode_de_fonctionnement_borne_ve
        name: Mode de fonctionnement
      - entity: number.courant_borne_ve_dynamique
        name: "I charge manuel :"



RE: ? RMS VE – Intégration Home Assistant (Guide complet) - Rakibou - 05-04-2026

(05-04-2026, 12:00 AM)Geosr a écrit : Je vous partage ici la procédure complète pour installer et utiliser l’intégration RMS VE dans Home Assistant, permettant de piloter et superviser un routeur de charge VE.

Merci pour ta contribution et pour la doc.
J'ai porté la doc dans la documentation générale Station de charge VE-RMS.


RE: ? RMS VE – Intégration Home Assistant (Guide complet) - Geosr - 06-04-2026

(05-04-2026, 11:45 PM)Rakibou a écrit :
(05-04-2026, 12:00 AM)Geosr a écrit : Je vous partage ici la procédure complète pour installer et utiliser l’intégration RMS VE dans Home Assistant, permettant de piloter et superviser un routeur de charge VE.

Merci pour ta contribution et pour la doc.
J'ai porté la doc dans la documentation générale Station de charge VE-RMS.

Avoir plaisir