Statistiques du Forum
» Membres : 2,694,   » Dernier membre : tristan.deruelle@outlook.fr,   » Sujets du forum : 2,295,   » Messages du forum : 21,421,  
Statistiques complètes

  Script python - windows
Posté par : stephcache - 06-04-2026, 11:17 AM - Forum : Gluco-Monitor - Pas de réponse

Bonjour, je viens de créer un script python pour Windows afin affiché sa glycémie sur le bureau.

Le projet est libre de droit et gratuit sur github: https://github.com/stephcache/LibreLinkU...et-Windows

Imprimer cet élément

  Autonomie en Normandie : Deye 8K, Batterie 314Ah et Routage 4 voies
Posté par : Nidar - 06-04-2026, 06:54 AM - Forum : Evolutions faites, à faire, dont vous rêvez... - Réponses (6)

Bonjour à tous,

Je vous sollicite pour valider la partie logicielle de mon futur projet d'installation. Actuellement, je tourne avec 6 kWc de panneaux sur micro-onduleurs et un routeur F1ATB sur mon chauffe-eau.
Le projet à venir :
Je vais installer un onduleur Deye 8K avec une batterie DIY 16S 314Ah. Le cerveau sera un mini PC sous HAOS (bare metal), relié à l'onduleur en RS485/USB.

Mon ambition :

  • Off-Grid partiel : Par fierté et pour couper l'abonnement, je vise l'autonomie de début avril à fin septembre.
  • Gestion de l'inertie : Utiliser le surplus pour chauffer mes dalles (très utile pour les nuits fraîches en Normandie) via un routeur F1ATB 4 voies (1 ECS 2000W + 3 dalles 1500W).
La genèse du code :

Comme je n'y connais rien en informatique, j'ai fait travailler trois IA en collaboration. Je leur ai soumis mes idées et elles ont généré ce code YAML. Elles m'assurent qu'il est parfait, mais je préfère l'avis d'humains qui pratiquent le code au quotidien !
Logique du code :
  • Protection Batterie : Coupure du routage à 30% de SOC, reprise à 35%.
  • Rampes Intelligentes : Montée progressive (paliers de 10 à 20%) et descente rapide (palier de 15%) pour protéger la batterie des appels de charge de la maison ou des passages nuageux.
  • Calcul Hybride : Utilisation de PV - Load - Grid pour fonctionner aussi bien l'hiver (On-Grid avec pince CT réseau) que l'été (Off-Grid).
Bien sûr, les noms des entités et les valeurs de
 puissance devront être ajustés une fois le matériel en place ; ce qui m'intéresse avant tout, c'est de valider la structure du code et la logique des rampes.

Le code envisagé :

# ============================================================
# FILTER SENSOR — lissage surplus brut
# ============================================================
sensor:
  - platform: filter
    name: "Surplus Solaire Lissé"
    unique_id: surplus_solaire_lisse
    entity_id: sensor.surplus_solaire_brut
    filters:
      - filter: moving_average
        window_size: 3
        precision: 0
      - filter: range
        lower_bound: 0
        upper_bound: 8500

# ============================================================
# TEMPLATE SENSORS — surplus brut + consignes par voie
# ============================================================
template:
  - sensor:
      - name: "Surplus Solaire Brut"
        unique_id: surplus_solaire_brut
        unit_of_measurement: "W"
        state_class: measurement
        device_class: power
        state: >
          {% set pv = states('sensor.deye_pv_power') | float(0) %}
          {% set load = states('sensor.deye_load_power') | float(0) %}
          {% set grid = states('sensor.deye_grid_power') | float(0) %}
          {{ [pv - load - grid, 0] | max | int }}

      # --- Voie 1 : chauffe-eau 2000 W ---
      - name: "F1ATB V1 consigne pct"
        unique_id: f1atb_v1_pct
        unit_of_measurement: "%"
        state: >
          {% set soc = states('sensor.deye_battery_soc') | float(0) %}
          {% set seuil = 100 if soc > 90 else 200 %}
          {% set s = states('sensor.surplus_solaire_lisse') | float(0) %}
          {% set s = 0 if s < seuil else s %}
          {{ [[s / 2000 * 100, 0] | max, 100] | min | round(0) | int }}

      # --- Voie 2 : dalle 1 — 1500 W ---
      - name: "F1ATB V2 consigne pct"
        unique_id: f1atb_v2_pct
        unit_of_measurement: "%"
        state: >
          {% set soc = states('sensor.deye_battery_soc') | float(0) %}
          {% set seuil = 100 if soc > 90 else 200 %}
          {% set s = states('sensor.surplus_solaire_lisse') | float(0) %}
          {% set s = 0 if s < seuil else s %}
          {% set reste = [s - 2000, 0] | max %}
          {{ [[reste / 1500 * 100, 0] | max, 100] | min | round(0) | int }}

      # --- Voie 3 : dalle 2 — 1500 W ---
      - name: "F1ATB V3 consigne pct"
        unique_id: f1atb_v3_pct
        unit_of_measurement: "%"
        state: >
          {% set soc = states('sensor.deye_battery_soc') | float(0) %}
          {% set seuil = 100 if soc > 90 else 200 %}
          {% set s = states('sensor.surplus_solaire_lisse') | float(0) %}
          {% set s = 0 if s < seuil else s %}
          {% set reste = [s - 2000 - 1500, 0] | max %}
          {{ [[reste / 1500 * 100, 0] | max, 100] | min | round(0) | int }}

      # --- Voie 4 : dalle 3 — 1500 W ---
      - name: "F1ATB V4 consigne pct"
        unique_id: f1atb_v4_pct
        unit_of_measurement: "%"
        state: >
          {% set soc = states('sensor.deye_battery_soc') | float(0) %}
          {% set seuil = 100 if soc > 90 else 200 %}
          {% set s = states('sensor.surplus_solaire_lisse') | float(0) %}
          {% set s = 0 if s < seuil else s %}
          {% set reste = [s - 2000 - 1500 - 1500, 0] | max %}
          {{ [[reste / 1500 * 100, 0] | max, 100] | min | round(0) | int }}

# ============================================================
# AUTOMATIONS
# ============================================================
automation:

  # 1. REGULATION PRINCIPALE — ramp adaptatif toutes les 2s
  - alias: "F1ATB - Regulation triacs finale"
    id: f1atb_regulation_finale
    mode: queued
    max: 2
    trigger:
      - platform: time_pattern
        seconds: "/2"
      - platform: event
        event_type: f1atb_resume
    condition:
      - condition: numeric_state
        entity_id: sensor.deye_battery_soc
        above: 30
    action:
      - variables:
          soc: "{{ states('sensor.deye_battery_soc') | float(0) }}"
          surplus: "{{ states('sensor.surplus_solaire_lisse') | float(0) }}"
          step_up: >
            {% if soc > 95 %} 20
            {% elif soc > 80 %} 15
            {% else %} 10
            {% endif %}
          step_down: "{{ 15 if surplus < 500 else 8 }}"
          seuil: 3
      - repeat:
          for_each:
            - { sensor: "sensor.f1atb_v1_consigne_pct", entity: "number.f1atb_voie_1" }
            - { sensor: "sensor.f1atb_v2_consigne_pct", entity: "number.f1atb_voie_2" }
            - { sensor: "sensor.f1atb_v3_consigne_pct", entity: "number.f1atb_voie_3" }
            - { sensor: "sensor.f1atb_v4_consigne_pct", entity: "number.f1atb_voie_4" }
          sequence:
            - variables:
                new_val: "{{ states(repeat.item.sensor) | int(0) }}"
                old_val: "{{ states(repeat.item.entity) | int(0) }}"
            - if:
                - condition: template
                  value_template: "{{ (new_val - old_val) | abs > seuil }}"
              then:
                - service: number.set_value
                  target:
                    entity_id: "{{ repeat.item.entity }}"
                  data:
                    value: >
                      {% if new_val > old_val %}
                        {{ [old_val + step_up, new_val] | min }}
                      {% else %}
                        {{ [old_val - step_down, new_val] | max }}
                      {% endif %}

  # 2. COUPURE SOC BAS — tout à 0 immédiatement
  - alias: "F1ATB - Coupure SOC bas"
    id: f1atb_coupure_soc
    mode: single
    trigger:
      - platform: numeric_state
        entity_id: sensor.deye_battery_soc
        below: 30
    action:
      - service: number.set_value
        target:
          entity_id:
            - number.f1atb_voie_1
            - number.f1atb_voie_2
            - number.f1atb_voie_3
            - number.f1atb_voie_4
        data:
          value: 0

  # 3. REPRISE APRES SOC BAS — hysteresis 30/35%
  - alias: "F1ATB - Reprise SOC"
    id: f1atb_reprise_soc
    mode: single
    trigger:
      - platform: numeric_state
        entity_id: sensor.deye_battery_soc
        above: 35
    action:
      - delay: "00:00:15"
      - event: f1atb_resume

  # 4. RESYNC PERIODIQUE — rattrape les dérives toutes les minutes
  - alias: "F1ATB - Resync periodique"
    id: f1atb_resync
    mode: single
    trigger:
      - platform: time_pattern
        minutes: "/1"
    condition:
      - condition: numeric_state
        entity_id: sensor.deye_battery_soc
        above: 30
    action:
      - service: number.set_value
        target: { entity_id: number.f1atb_voie_1 }
        data: { value: "{{ states('sensor.f1atb_v1_consigne_pct') | int(0) }}" }
      - service: number.set_value
        target: { entity_id: number.f1atb_voie_2 }
        data: { value: "{{ states('sensor.f1atb_v2_consigne_pct') | int(0) }}" }
      - service: number.set_value
        target: { entity_id: number.f1atb_voie_3 }
        data: { value: "{{ states('sensor.f1atb_v3_consigne_pct') | int(0) }}" }
      - service: number.set_value
        target: { entity_id: number.f1atb_voie_4 }
        data: { value: "{{ states('sensor.f1atb_v4_consigne_pct') | int(0) }}" }

Votre avis :
Avant d'acheter tout le matériel et de lancer le montage, est-ce que cette logique de régulation via Home Assistant vous semble tenir la route ? 

Merci pour votre aide et vos retours d'expérience !

Imprimer cet élément

  Deuxiéme routeur ne répond pas au commande MQTT
Posté par : DidierJ - 05-04-2026, 06:58 PM - Forum : Routeur Photovoltaïque - Réponses (1)

Bonjour
J'ai deux routeurs je souhaite piloter via MQTT, le 1er repond correctement au commande
mais le 2eme non 

pourtant dans MQTT explorer les commandes sont OK.
Le 2eme ne semble pas aller voir la commande.

les deux sont en 17.17
Avez vous une idée ?

Imprimer cet élément

  Perte de connexion wifi.
Posté par : frdd - 05-04-2026, 06:12 PM - Forum : Routeur Photovoltaïque - Réponses (3)

Bonjour à tous.
Cela fait un moment que je cherche , mais je n arrive pas a résoudre mon problème.
Je me rends compte que mon routeur ( la partie au tableau Esp+ jsy ) perd le wifi régulièrement.
Je suis obligé de débrancher/rebrancher pour retrouver l' accès.
L.ip reste bien la même..
Je ne sais plus trop où regarder.
Si vous avez une idée ou une piste je suis preneur.
Merci d avance.

Imprimer cet élément

  Filtrage pour CACSI
Posté par : Alain59 - 05-04-2026, 01:10 PM - Forum : Routeur Photovoltaïque - Réponses (4)

Bonjour, merci encore pour le travail et le partage réalisé.
André, je n'ai pas trouvé mon bonheur dans les réglages pour CACSI. Il est vraie que j'ai l’obsession permanenta d'aller chercher les quelques watts qui s’échappent chez Enedis ! Wink . Je peaufine mes réglages via Mqtt et Node-RED.
J'ai mis en place une fonction dans Node-RED qui comprend une régulation "exponentielle" et filtres qui me donne plutôt de bons résultats. Je priorise aussi l'injection RouteurECS / RouteurRAD. Peut-être est-il possible d'ajouter ce type de chose nativement dans ton système. Je te joins ce script ci-dessous, à toute fin utile.
// ======================================================
// FILTRAGE PUISSANCE POUR ROUTEUR SOLAIRE F1ATB
// ======================================================
// Ce script :
// 1) vérifie la validité de la mesure
// 2) élimine les valeurs aberrantes
// 3) applique un filtre exponentiel (EMA)
// 4) ignore les petites perturbations (deadband)
// 5) applique un offset pour ajuster le seuil du routeur
// 6) envoie la puissance filtrée en MQTT
// ======================================================
 
// ------------------------------------------------------
// 1. Vérification de la structure du message
// ------------------------------------------------------
// On vérifie que le message contient bien svalue1
if (!msg.payload || msg.payload.svalue1 === undefined) {
    return null; // message ignoré
}
 
// Conversion en nombre
let currentValue = Number(msg.payload.svalue1);
// Vérifie que la valeur est bien numérique
if (isNaN(currentValue)) {
    return null;
}
 
// ------------------------------------------------------
// 2. Filtrage des valeurs aberrantes
// ------------------------------------------------------
// Ces limites dépendent de ton installation
// Elles évitent les bugs ou valeurs incohérentes
 
if (currentValue < -160 || currentValue > 4000) {
    return null;
}
 
// ------------------------------------------------------
// 3. Paramètres du filtre
// ------------------------------------------------------
// coefficient du filtre exponentiel
// plus alpha est petit → filtrage fort
// valeurs typiques : 0.2 à 0.35
// 0.2-filtrage fort, [0.35](0.3)-bon compromis, 0.4-plus réactif
let alpha = 0.30;
// zone morte pour ignorer les petites variations
// évite les oscillations dues aux TV, box, etc.
// zone morte = ±xx W, variation prise en compte si hors de cette plage
// 10W-très sensible, [20W]-sensible, (30W)-bon compromis, 50W-très stable moins précis
//
// Remplacée par une version asymétrique :
// - import (consommation réseau) → plus sensible
// - export (surplus PV) → plus tolérant
let deadband_import = 15;
let deadband_export = 25;
 
// ------------------------------------------------------
// 4. Récupération de la valeur filtrée précédente
// ------------------------------------------------------
// On récupère la dernière valeur filtrée sauvegardée
let previousFiltered = context.get("filteredPower");
// si première exécution on initialise
if (previousFiltered === undefined) {
    previousFiltered = currentValue;
}
 
// ------------------------------------------------------
// 5. Détection des petites perturbations
// ------------------------------------------------------
// Si la variation est trop faible on l'ignore
// Version asymétrique : seuil différent selon import/export
let delta = currentValue - previousFiltered;
// Cas IMPORT (puissance > 0 → on consomme du réseau)
if (currentValue > 0) {
    if (Math.abs(delta) < deadband_import) {
// on garde simplement l'ancienne valeur
        currentValue = previousFiltered;
    }
// Cas EXPORT (puissance < 0 → surplus PV)
} else {
    if (Math.abs(delta) < deadband_export) {
// on garde simplement l'ancienne valeur
        currentValue = previousFiltered;
    }
}
 
// ------------------------------------------------------
// 6. Filtre exponentiel
// ------------------------------------------------------
// Formule EMA
// filtered = alpha * mesure + (1-alpha) * ancienne valeur
let filtered = alpha * currentValue + (1 - alpha) * previousFiltered;
 
// ------------------------------------------------------
// 7. Sauvegarde pour la prochaine itération
// ------------------------------------------------------
context.set("filteredPower", filtered);
 
// ------------------------------------------------------
// 8. Ajustement du seuil du routeur
// ------------------------------------------------------
// offset utilisé pour ajuster la régulation
// (dans ton ancien script : -80)
// sert à éviter l’injection Linky réseau/pince modifiée Emphase
let offset = 70;
let finalPower = Math.round(filtered) - offset;
// sécurité supplémentaire
if (isNaN(finalPower)) {
    return null;
}
 
// ------------------------------------------------------
// 9. Construction du message MQTT avec gestion RouteurECS/RouteurRAD
// ------------------------------------------------------
 
// ---------------- Récupération de l'état ECS_Injection % Idx247 ----------------
let injectionECS = Number(global.get("ECS_Injection") || 0);
// ---------------- DEBUG ----------------
// node.warn("Valeur ECS_Injection actuelle : " + injectionECS);
 
// ---------------- Définition des seuils et blocage ----------------
let seuilECS = 0;      // Seuil mini pour ignorer blocage RouteurRAD
let seuilMaxECS = 100; // Seuil maxi pour ignorer blocage RouteurRAD
let blocageRAD = 40; // Valeur W ajoutée à "Pw" pour empêcher RAD de démarrer
 
// ---------------- Calcul de la puissance "Pw" pour RouteurRAD ----------------
let finalPowerRAD;
 
if (injectionECS > seuilECS && injectionECS < seuilMaxECS) {
    // ECS en train de monter → priorité ECS → blocage RAD entre 0 et 100%
    finalPowerRAD = finalPower + blocageRAD;
 
} else {
    // ECS = 0% ou ECS saturé 100% → RAD autorisé
    finalPowerRAD = finalPower;
}
 
// ---------------- DEBUG ----------------
// node.warn("ECS Pw = " + finalPower);
// node.warn("RAD Pw = " + finalPowerRAD);
 
// ---------------- Construction des messages MQTT ----------------
let msg1 = {
    topic: "LinkyPwToRouteurECS",
    payload: JSON.stringify({ Pw: finalPower })
};
 
let msg2 = {
    topic: "LinkyPwToRouteurRAD",
    payload: JSON.stringify({ Pw: finalPowerRAD })
};
 
// ---------------- Renvoi des deux messages ----------------
return [msg1, msg2];

Imprimer cet élément

  RMS VE – Intégration Home Assistant v0.2.3
Posté par : Geosr - 05-04-2026, 12:00 AM - Forum : Adaptation aux chargeurs VE - Réponses (6)

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".

Imprimer cet élément

  MQTT Contournement de la sonde de temperature pour gerer le routage // Niv Batterie
Posté par : Christophe69480 - 04-04-2026, 05:39 PM - Forum : Domotique - Réponses (5)

Bonjour,

l'objectif est de ne pas toucher au code source du routeur pour faciliter la maintenance et avoir une condition de niveau de charge des batteries dans les actions

ce que j'ai fait, j'envois en MQTT le niveau de charge de ma batterie sur le canal 1 (le canal 0 est la vraie temperature de l ESC)
   
   
seul défaut 100° au lieu de 100 %
   
sur le papier ca devrait fonctionner, j'ai pas encore pu tester (batterie pleine et chauffe-eau plein) 
 
pour les spécialistes, ca peux fonctionner ?

Imprimer cet élément

  leds routeur
Posté par : bernyb12000 - 04-04-2026, 05:12 PM - Forum : Routeur Photovoltaïque - Réponses (23)

Bonjour à tous,
Je débute et je me suis lancé dans la construction du routeur avec un boîtier maître équipé d’un contrôleur JSY-MK-194, câblé comme indiqué, ainsi qu’un boîtier esclave également câblé de cette façon.
J’arrive bien à accéder aux adresses IP des deux ESP, mais la LED orange reste allumée en continu. Au tout début, la LED verte a clignoté une seule fois puis s’est éteinte.
Je me suis rendu compte que sur le schéma du maître et dans la programmation, les broches RX et TX étaient inversées, mais même en corrigeant cela, le problème persiste.
Auriez-vous une idée de ce qui pourrait causer ce[Image: 2026-04-04-6563399c-fcf0-434a-be5c-54ff1cceedba.png][Image: 2026-04-04-b030ab6b-3cee-4900-a480-2be7ec38793b.png] souci ?

Imprimer cet élément

  Heure sur ESP32-ETH01
Posté par : Lamire42 - 04-04-2026, 03:41 PM - Forum : Routeur Photovoltaïque - Réponses (6)

Bonjour, j'ai réalisé un routeur F1ATB basé sur une ESP32-ETH01 car mon réseau internet est tout en ethernet. Dans les réglages de l'heure de l'ESP si on choisit internet : il n'y a pas de possibilité de récupérer l'heure si on a pas de wifi. C'est dommage puisque le programme permet de fonctionner avec une ESP32-ETH ; à moins que je me sois trompé de réglage. En attendant j'ai choisi de synchroniser avec l'horloge interne de l'ESP32 mais je trouve cela moins bien en cas de coupure. Merci pour vos lumières.



Pièces jointes Miniature(s)
   
Imprimer cet élément

  utilisation avec batteries
Posté par : jlcflo - 04-04-2026, 09:34 AM - Forum : Evolutions faites, à faire, dont vous rêvez... - Réponses (12)

Bonjour à tous,
J'ai une installation de 9kW crête avec 15 kWh de batteries (onduleur et bateries Azzuro) qui fonctionne très bien.
j'utilise le routeur (version 16) pour rediriger l'excédent sur mon ballon ECS qui fait 2500W. 
Je constate que celui-ci redirige la surproduction sur le ballon sans pb sauf que si la production est inférieure au seuil défini dans la commande du ballon, ce sont les batteries qui se déchargent.
J'aimerai pouvoir bloquer cette décharge des batteries. 
Je n'ai pas d'accès direct aux données des batteries. La seule possibilité serait de mettre une pince ampéremétrique sur le cable des batteries et fermer le triac du ballon ECS en cas de décharge de la batterie.
Je suis totalement incapable de programmer une telle commande. Si quelqu'un pouvait m'aider. 
Merci par avance
JL

Imprimer cet élément


Utilisateurs en ligne
Il y a actuellement 270 utilisateurs connectés. » 4 Membre(s) | 262 Visiteur(s)
Applebot, Baidu, Bing, Yandex, Jacques13, teka_22, zep57

Moteur MyBB, © 2002-2026 Melroy van den Berg.