Bienvenue, Visiteur
Vous devez vous enregistrer avant de pouvoir poster.

Nom d’utilisateur
  

Mot de passe
  





Rechercher dans les forums

(Recherche avancée)

Derniers sujets
Problème de RAM ?
Dernier message : Laurent53
Il y a 21 minutes
coffret electrique AC
Dernier message : oneil4
Il y a 1 heure
Interface Opto TIC Linky
Dernier message : Jacques13
Aujourd’hui, 01:44 AM
Action et temporisation.
Dernier message : Stef
Aujourd’hui, 12:50 AM
Problème récupération inf...
Dernier message : anto43
Aujourd’hui, 12:04 AM
ajout d'une batterie
Dernier message : f1pok
Hier, 08:32 PM
commande SSR par un inter...
Dernier message : Charmusien
Hier, 08:30 PM
Routeur sur Installation ...
Dernier message : ROPA 59
Hier, 05:47 PM
portage du routeur sur ce...
Dernier message : F1ATB
27-12-2025, 08:14 PM
Accès distant avec une bo...
Dernier message : phil47
27-12-2025, 07:19 PM

Statistiques du Forum
» Membres : 2,366,   » Dernier membre : nico72,   » Sujets du forum : 1,879,   » Messages du forum : 16,863,  
Statistiques complètes

  Interface TIC à nouveau "en panne" (Résolu)
Posté par : PhDV61 - 27-10-2025, 03:40 PM - Forum : Routeur Photovoltaïque - Réponses (12)

Bonjour à tous,

Suite à la tempête (Benjamin cette fois) et aux coupures intempestives, puis définitive (12 heures d'affilée), de l'alimentation de tout notre village du 06, le Linky ne me donne plus des trames "décodables" ( Mon ESP32 reçoit des trames très incomplètes, des caractères (beaucoup) se perdent.

J'ai restauré la communication en augmentant la résistance d'entrée à 3k, et l'ESP32 arrive un peu à retrouver ses petits et décoder les trames, mais en indiquant de nombreuses erreurs checksum SINSTS et EAST.  Je n'ai pas eu le temps de brancher l'oscillo, mais je suppose, comme la dernière fois lors du grand "shutdown" Europe du Sud ( France Italie Espagne) que probablement l'UART du Linky a pris une châtaigne et laisse passer du 50Hz ou autre chose sur la ligne série.

J'espère que cela ne durera pas 5 semaines de tergiversations avant de changer le compteur, mais cela reste pénible ces pannes à répétition ( bon c'est vrai, cela ne fait que deux fois en un an).

Heureusement mon UxIx3, lui, tourne sans broncher. Mais j'aime bien avoir cette référence Linky, que je souhaite utiliser "au cas où". 

Si quelqu'un a une idée pour sécuriser, n'hésitez pas.
Merci,
Ph.

Imprimer cet élément

  une boite à imprimer en 3D pour l'afficheur
Posté par : pzaepfel - 27-10-2025, 12:08 PM - Forum : Routeur Photovoltaïque - Réponses (5)

je recherche les fichiers 3D des deux pieces séparées ??

nota : l'impression des 2 combiné me pose des problemes de supports

Imprimer cet élément

  2ième routeur Linky + SSR pour ballon 3000W
Posté par : Jacques13 - 27-10-2025, 11:39 AM - Forum : Vos configurations - Réponses (11)

Deuxième réalisation cette fois ci pour ma sœur.
Cette fois-ci plus question de dissocier Le SSR de l'ESP car il s'agit d'un kit que me sœur devra installer elle même.

J'ai donc repris le schéma proposé par André pour faire du simple, pas cher et efficace.

Liste du matériel :
Un ESP Wroom (ou pas, ce n'est pas écrit dessus) avec antenne externe à 4€ l'ensemble
Un SSR DA40A à 3€ 
Une plaque trouée, un support 2X3 broches et deux rangés de supports pour l'ESP, le tout venant de mon stock
Un radiateur PC AMD de mon stock
Un boitier 15x15x90 couvercle transparent de chez Ali à 13€
Un tranfo 5V modulaire de chez ALi à 2,5€
2 leds, 5 résistances, un optocoupleur de mon stock
1 bornier à vis, 4 raccords à levier, un peu de câbles divers et un connecteur 2 poles, un câble USB, le tout venant de mon stock
1 bout de fil pour la liaison Linky et 2 cables 2,5mm² pour les liaisons TA et ballon
Quelques impressions 3D pour monter le tout

Bref, on ne peut faire plus simple, 22,5 € le tout, port compris et en prime il est étanche !!!
Remarquez tout de même que l'installation dans un petit boitier est bien plus longue à réaliser que le premier montage que j'ai réalisé en séparant la puissance de l'électronique lors de mon premier montage https://f1atb.fr/forum_f1atb/thread-1212.html

La seule modification par rapport au schéma initial du site, c'est R2 que j'ai passé de 10 à 5K pour avoir des signaux Linky de qualité suffisante.

En bas à  gauche, le cable des données linky, au milieu le câble de sortie pour le ballon, puis celui qui va au disjoncteur du tableau
Tout les composants actifs sont sur support ce qui fait qu'en cas de problème je n'aurais que des composants à lui livrer

Bref, plus que des photos à vous montrer

               

Imprimer cet élément

  Chaudière électrique GIALIX 6 kW piloté par F1ATB
Posté par : hblue - 27-10-2025, 01:24 AM - Forum : Vos réalisations - Pas de réponse

Bonjour à tous,
Voici la présentation de ma réalisation basée sur le projet F1ATB, destinée à piloter une chaudière électrique GIALIX de 6 kW, installée en parallèle d’une chaudière à pellets.
L’électronique d’origine de la Gialix est entièrement shuntée, les résistances et circulateur de la chaudière sont désormais pilotés directement par le routeur F1ATB.


☀️ Contexte de l’installation
  • Photovoltaïque : 8 kWc sur onduleur Fronius GEN24
  • Borne de recharge OpenEVSE (piloté par HA) 
  • ECS : Chauffe-eau thermodynamique piloté par Home Assistant via l’entrée HP/HC sur excédent PV.
  • PAC Air/Air :  piloté par Home Assistant en tout ou rien sur excédent PV.

⚙️ Configuration de la chaudière GIALIX : 
  • 4 résistances : 800 W / 1200 W / 2000 W / 2000 W
  • 1 circulateur
  • 1 Capteur de température 
  • 1 capteur de pression 

? Partie électronique
Je suis parti d’un boîtier Rail DIN ESP32 ASTRA de chez Rocket Controller ASTRA (~25$)
J'ai cherché un boitier "Pro" Rail Din ESP 32 compact avec alim 220V , relay+ GPIO en restant sur un budget maitrisé, sans trouver mon bonheur sur les sites types ALI.... C'est sur le site du logiciel TASMOTA que j'ai identifié ce produit. 
Atouts du modèle ASTRA pour le projet 
  • ⚡ Alimentation directe en 230 V
  • ? GPIO accessibles via bornier ou connecteur RJ11 
  • ? 4 sorties relais intégrées
  • ? ESP32 intégré dans un boîtier Rail DIN compact, (+ Look "Pro") 
  • ?️ En façade : voyant Power, bouton Reset et 4 voyants relais

Nécessite une programmation initial par le port série interne ( Documenté sur le site ASTRA )   

? Partie logicielle
J’ai modifié le code F1ATB pour piloter le circulateur dès qu’une résistance dissipe le moindre watt.
(Les actions seules ne suffisaient pas : il arrivait que l’eau chauffe sans que le circulateur soit activé, ce qui est vite critique avec 6kw) 
? Une modification dans la boucle principale (pas très propre ?) assure désormais l’activation immédiate du circulateur dès qu’une résistance est sollicitée.
Egalement ajout du support de l'onduleur/meter  Fronius pour récupérer la puissance injecté/consommé. 

? Configuration des résistances ( Objectif initial : répartir la dissipation et pilotage en cascade des résistances avec seulement le triac en découpage de phase) 
  • ? 1 Triac → résistance 1200 W
  • ? 1 SSR → résistance 800 W
  • ? 1 SSR → résistance 2000 W
  • ? 1 relais mécanique → seconde résistance 2000 W

? Mesure et pilotage
Le routeur ne mesure pas la puissance de l'installation directement : les données viennent de l’onduleur/meter  Fronius (voir forum pour le détail du logiciel, Merci Ludovic pour le logiciel ).
L’ensemble est installé derrière un contacteur Zigbee 63 A Rail DIN, lui-même protégé par un disjoncteur 32 A ( dans le tableau principal), permettant :
  • la mesure de la puissance consommée de la chaudière. 
  • et le pilotage global de la chaudière. ( Ajout de protection supplémentaire via HA en cas de défaut ou température++) 

? Réalisation hardware
Montage réalisé dans un boîtier aluminium fermé avec ventilateur et aération surplombant un coffret Rail DIN.
? Dans le boîtier aluminium :
  • Dissipateurs pour triacs et SSR
  • 1 ventilateur
  • 2 sondes DS18B20 :
    • sur le radiateur du triac (radiateur Bleu sur la photo avec électronique ZC Dimmer + Triac ST  )
    • sur les radiateurs SSR
  • Ventilateur asservi par une action F1ATB pour le refroidissement interne
  • Relais thermiques KSD9700 sur les dissipateurs, assurant le un backup HW pour le pilotage du ventilateur en cas de défaillance logicielle.
?️ Un DS18B20 mesure la température de l’eau (limite 60 °C dans action F1ATB ).
L’alimentation 230 V du boîtier ASTRA/F1ATB passe par le fusible thermique monté d’origine dans la chaudière Gialix :
➡️ En cas de surchauffe > 100 °C, ce fusible coupe l’alimentation du F1ATB, arrêtant toute chauffe.


⚙️ Dans le coffret Rail DIN (8 modules) :
  • 2 disjoncteurs pour les résistances
  • 1 disjoncteur pour le boîtier ASTRA, le circulateur et le ventilateur
  • 1 relais mécanique (pilotage chauffe-eau en 230 V via sortie relais ASTRA)
  • 1 module ASTRA (4 modules)
J'avais préparé un écran Oled, mais que j'ai décidé de ne pas monter pour un rendu plus sobre. 

? Améliorations prévues :
  •  Intégration du capteur de pression d’origine Gialix pour éviter toute activation des résistances sans eau ou en basse pression de la chaudière. 
  •  Ajout de KSD9700 NF 60 °C sur les bornes de pilotage du Triac et des SSR pour une sécurité hardware en cas de surchauffe.
  • Câbler le ventilateur sur la même sortie que le circulateur. ( pour simplifier les actions) 
  •  Ajustement des actions F1ATB ( Idéalement : Une gestion en cascade des résistances, pour avoir une variation de 0 a 6kw plus linaires) 
  • Câblage des résistances 1200w+800w sur le Triac. Les 2 x 2000W sur 2 x SSR et suppression du relais mécanique. 

Dernier point et probablement le plus important : Merci André pour ce projet  Smile



Pièces jointes Miniature(s)
       

.pdf   Cablage F1ATB_ASTRA.pdf (Taille : 1.01 Mo / Téléchargements : 10)
.bmp   Pinout ASTRA .bmp (Taille : 238.82 Ko / Téléchargements : 9)
Imprimer cet élément

  Problème de mesures sources de puissance avec shelly 3em
Posté par : jojolabequille - 26-10-2025, 11:13 PM - Forum : Evolutions faites, à faire, dont vous rêvez... - Réponses (2)

   
Bonsoir à tous et un grand merci à André pour son investissement.
Mon intervention intervient à la suite du passage à la version 15.10 du routeur alors que jusque la j'étais en 12.06.
Depuis cette migration je ne peux plus paramétrer tous mes routeurs avec pour source de mesure de puissance mon shelly 3em. En effet, au delà de 2 routeurs, tous les routeurs connectés au shelly 3em affichent de façon récurrente toutes les minutes environ le message d'erreur            suivant : "client shelly em timeout". Par contre si je ne connecte que 2 routeurs pour la prise de mesures au shelly 3em tout fonctionne normalement. En version 12.06, j'avais 4 routeurs connectés en prise de mesure au Shelly et tout ce petit monde fonctionnait nickel.
J'ai essayè la version 15.09 et même problème.
Quelqu’un pourrait m'aider à résoudre ce problème car j'ai bien essayè de passer par la prise de mesure par ESP Externe mais là c'est la réception wifi du routeur esclave qui est très très mauvaise donc je souhaiterai que tout passe par le Shelly 3em.
Merci à tous pour votre contribution.

Imprimer cet élément

  Radiateur avec thermostat électronique
Posté par : JMi09 - 26-10-2025, 05:18 PM - Forum : Vos configurations - Réponses (9)

Bonjour à toutes et tous,
Je souhaiterais pouvoir rooter un radiateur électrique muni d'un thermostat électrique. 
J'ai testé le branchement direct cela ne fonctionne pas le thermostat électronique ne supporte pas le courant haché de mon triac. 
J'ai démonté le radiateur j'ai essayé de m'inspirer de la modification à faire pour les chauffe-eau avec thermostat électronique  mais je n'arrive pas à transposer le problème à mon chauffage électriqu: cela est tout de suite mes compétences.
Ci-joint une photo de la carte électronique qui contient 4 fiches :une pour le neutre et une autre pour la phase provenant de EDF et deux fiches pour lesquelles j'ai pu vérifier au multimètre que cela correspondait à la résistance chauffante du radiateur. Si certains plus douées que moi peuvent me proposer un branchement pour le triac de mon routeur je suis preneur. Merci à vous par avance



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

  Configuration, actions, conditions. Besoin d'explications
Posté par : Ardèche - 26-10-2025, 02:22 PM - Forum : Routeur Photovoltaïque - Réponses (3)

Bonjour à tous ! 
Tous d'abord, si vous voyez qu'un topic identique existe, n'hésitez pas à me renvoyer dessus. J'ai cherché mais pas trouvé. 

Ma config : Installation de 3400w sur toiture. 3 routeurs sur la maison. 1 routeur relais chauffe eau (2000w) 1 routeur triac sèche serviette (750w) , 1 routeur triac radiateur roulette (1500w)
Objectif idéal : le chauffe eau (routeur maitre) prend ce dont il a besoin. le sèche serviette prend le reste, ensuite le radiateur roulette. 

ce que j'observe : 
problème 1 : le chauffe eau prend ce dont il a besoin mais quand un nuage passe, le temps qu'il rectifie sa conso, on passe des fois à -100w ce qui déclenche le sèche serviette qui a une config à -100w et PAF, ça fait le yoyo entre les deux routeurs. Idem quand le chauffe eau à fini et que je balance sur sèche serviette et radiateur roulette : yoyo. 

Problème 2 : quand j'ai une consigne de démarrage à -100w (ex sèche serviette), le sèche serviette va tout prendre mais va maintenir la conso à -100w, je donne donc 100w à EDF. Je comprend le truc mais je me demande comment faire mieux.

Question : Comment éviter les phénomènes de yoyo tout en gardant des priorités ? Je ne comprends pas très bien l'utilisation des " conditions optionnelles pour activer" avec les durées et les pourcentages. 

D'avance merci pour vos conseils Smile

Imprimer cet élément

  Sécuriser l' accès des pages du serveur
Posté par : Laurent53 - 26-10-2025, 12:11 PM - Forum : Evolutions faites, à faire, dont vous rêvez... - Réponses (2)

Bonjour 

Ma demande à Gemini pro avec le fichier server ino v15.10:


Sécuriser l accès des pages par basic auth, et ajoute du code pour pouvoir modifier mot de passe, donne le fichier entièrement modifié

(Il demande une fois le mot de passe pour l'accès à l'ensemble des pages tant que la session est ouverte, IMPORTANT : Vous devez ajouter ces variables à vos fonctions de lecture/écriture ROM
// (comme EcritureEnROM) pour les sauvegarder de manière permanente !!
String www_user = "admin";
String www_pass = "admin"Wink



// ***************
// * WEB SERVER *
// ***************
[span_0](start_span)bool opened = false;[span_0](end_span)
[span_1](start_span)String ConfImport;[span_1](end_span)

// --- AJOUT POUR BASIC AUTH ---
// Identifiants par défaut.
// !! IMPORTANT : Vous devez ajouter ces variables à vos fonctions de lecture/écriture ROM
// (comme EcritureEnROM) pour les sauvegarder de manière permanente !!
String www_user = "admin";
String www_pass = "admin";

// Page HTML pour changer le mot de passe
const char PassHtml[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
<title>Changer Mot de Passe</title><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<style>
  body { font-family: Arial, sans-serif; background: #f0f0f0; text-align: center; }
  div { background: #fff; border-radius: 8px; padding: 20px; max-width: 400px; margin: 50px auto; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
  input { width: 90%; padding: 10px; margin: 10px 0; border: 1px solid #ccc; border-radius: 4px; }
  button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }
  button:hover { background: #0056b3; }
</style>
</head><body>
<div>
  <h2>Changer le mot de passe</h2>
  <form action='/passupdate' method='POST'>
    Nom d'utilisateur:<br>
    <input type='text' name='user' value='@@USER@@'><br>
    Nouveau mot de passe:<br>
    <input type='password' name='pass'><br>
    <button type='submit'>Enregistrer</button>
  </form>
  <br><a href='/'>Retour</a>
</div>
</body></html>
)rawliteral";


/**
 * @brief Vérifie l'authentification "Basic Auth".
 * Renvoie 'true' si l'utilisateur est authentifié (ou en mode AP).
 * Renvoie 'false' si l'authentification a échoué et demande les identifiants.
 */
bool checkAuth() {
  // Désactive l'authentification en mode AP pour permettre la configuration Wi-Fi
  if (WiFi.getMode() != WIFI_STA) {
    return true;
  }
  
  if (!server.authenticate(www_user.c_str(), www_pass.c_str())) {
    server.requestAuthentication();
    return false;
  }
  return true;
}
// --- FIN AJOUT BASIC AUTH ---


[span_2](start_span)void Init_Server() {[span_2](end_span)
  //Init Web Server on port 80
  [span_3](start_span)server.on("/", handleRoot);[span_3](end_span)
  [span_4](start_span)server.on("/MainJS", handleMainJS);[span_4](end_span)
  [span_5](start_span)server.on("/MainJS2", handleMainJS2);[span_5](end_span)
  [span_6](start_span)server.on("/MainJS3", handleMainJS3);[span_6](end_span)
  [span_7](start_span)server.on("/Para", handlePara);[span_7](end_span)
  [span_8](start_span)server.on("/ParaJS", handleParaJS);[span_8](end_span)
  [span_9](start_span)server.on("/ParaRouteurJS", handleParaRouteurJS);[span_9](end_span)
  [span_10](start_span)server.on("/ParaAjax", handleParaAjax);[span_10](end_span)
  [span_11](start_span)server.on("/ParaRouteurAjax", handleParaRouteurAjax);[span_11](end_span)
  [span_12](start_span)server.on("/ParaUpdate", handleParaUpdate);[span_12](end_span)
  [span_13](start_span)server.on("/Actions", handleActions);[span_13](end_span)
  [span_14](start_span)server.on("/ActionsJS", handleActionsJS);[span_14](end_span)
  [span_15](start_span)server.on("/ActionsJS2", handleActionsJS2);[span_15](end_span)
  [span_16](start_span)server.on("/ActionsJS3", handleActionsJS3);[span_16](end_span)
  [span_17](start_span)server.on("/ActionsUpdate", handleActionsUpdate);[span_17](end_span)
  [span_18](start_span)server.on("/ActionsAjax", handleActionsAjax);[span_18](end_span)
  [span_19](start_span)server.on("/Brute", handleBrute);[span_19](end_span)
  [span_20](start_span)server.on("/BruteJS", handleBruteJS);[span_20](end_span)
  [span_21](start_span)server.on("/BruteJS2", handleBruteJS2);[span_21](end_span)
  [span_22](start_span)server.on("/ajax_histo48h", handleAjaxHisto48h);[span_22](end_span)
  [span_23](start_span)server.on("/ajax_histo1an", handleAjaxHisto1an);[span_23](end_span)
  [span_24](start_span)server.on("/ajax_dataRMS", handleAjaxRMS);[span_24](end_span)
  [span_25](start_span)server.on("/ajax_dataESP32", handleAjaxESP32);[span_25](end_span)
  [span_26](start_span)server.on("/ajax_data", handleAjaxData);[span_26](end_span)
  [span_27](start_span)server.on("/ajax_data10mn", handleAjaxData10mn);[span_27](end_span)
  [span_28](start_span)server.on("/ajax_etatActions", handleAjax_etatActions);[span_28](end_span)
  [span_29](start_span)server.on("/ajax_etatActionX", handleAjax_etatActionX);[span_29](end_span)
  [span_30](start_span)server.on("/ajax_Temperature", handleAjaxTemperature);[span_30](end_span)
  [span_31](start_span)server.on("/ajax_Noms", handleAjaxNoms);[span_31](end_span)
  [span_32](start_span)server.on("/ajaxRAZhisto", handleajaxRAZhisto);[span_32](end_span)
  [span_33](start_span)server.on("/SetGPIO", handleSetGpio);[span_33](end_span)
  [span_34](start_span)server.on("/Export", handleExport);[span_34](end_span)
  [span_35](start_span)server.on("/export_file", handleExport_file);[span_35](end_span)
  [span_36](start_span)server.on("/restart", handleRestart);[span_36](end_span)
  [span_37](start_span)server.on("/Change_Wifi", handleChange_Wifi);[span_37](end_span)
  [span_38](start_span)server.on("/AP_ScanWifi", handleAP_ScanWifi);[span_38](end_span)
  [span_39](start_span)server.on("/AP_SetWifi", handleAP_SetWifi);[span_39](end_span)
  [span_40](start_span)server.on("/commun.css", handleCommunCSS);[span_40](end_span)

  // --- AJOUT ROUTES MOT DE PASSE ---
  server.on("/password", handlePassword);
  server.on("/passupdate", HTTP_POST, handlePassUpdate); // Accepte le POST du formulaire

  [span_41](start_span)server.onNotFound(handleNotFound);[span_41](end_span)

  //SERVER OTA
  server.on("/OTA", HTTP_GET, []() {
    if (!checkAuth()) return; // <-- SÉCURISÉ
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", OtaHtml);
  [span_42](start_span)});[span_42](end_span)
  /*handling uploading firmware file */
  server.on(
    "/update", HTTP_POST, []() {
      if (!checkAuth()) return; // <-- SÉCURISÉ (Partie 1)
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    },
    []() {
      if (!checkAuth()) return; // <-- SÉCURISÉ (Partie 2)
      HTTPUpload& upload = server.upload();
      [span_43](start_span)if (upload.status == UPLOAD_FILE_START) {[span_43](end_span)
        [span_44](start_span)Serial.printf("Update: %s\n", upload.filename.c_str());[span_44](end_span)
        [span_45](start_span)if (!Update.begin(UPDATE_SIZE_UNKNOWN)) {[span_45](end_span)
          [span_46](start_span)Update.printError(Serial);[span_46](end_span)
        }
      [span_47](start_span)} else if (upload.status == UPLOAD_FILE_WRITE) { [cite: 246-247]
        /* flashing firmware to ESP*/
        [cite_start]if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {[span_47](end_span)
          [span_48](start_span)Update.printError(Serial);[span_48](end_span)
        }
      [span_49](start_span)} else if (upload.status == UPLOAD_FILE_END) {[span_49](end_span)
        [span_50](start_span)if (Update.end(true)) {[span_50](end_span)
          [span_51](start_span)Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);[span_51](end_span)
        } else {
          [span_52](start_span)Update.printError(Serial);[span_52](end_span)
        }
      }
    [span_53](start_span)});[span_53](end_span)

  /*handling uploading file */
  server.on(
    "/import", HTTP_POST, []() {
      if (!checkAuth()) return; // <-- SÉCURISÉ (Partie 1)
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", "OK");
    },
    []() {
      if (!checkAuth()) return; // <-- SÉCURISÉ (Partie 2)
      HTTPUpload& upload = server.upload();
      [span_54](start_span)if (opened == false) {[span_54](end_span)
        [span_55](start_span)opened = true;[span_55](end_span)

        [span_56](start_span)Serial.println("Debut Upload");[span_56](end_span)
        [span_57](start_span)ConfImport = "";[span_57](end_span)
      }
      [span_58](start_span)if (upload.status == UPLOAD_FILE_WRITE) {[span_58](end_span)
        [span_59](start_span)for (int i = 0; i < upload.currentSize; i++) { [cite: 248-249]
          [cite_start]ConfImport += String(char(upload.buf[i]));[span_59](end_span)
        }
      [span_60](start_span)} else if (upload.status == UPLOAD_FILE_END) {[span_60](end_span)
        [span_61](start_span)Serial.println("UPLOAD_FILE_END");[span_61](end_span)
        [span_62](start_span)Serial.println(ConfImport);[span_62](end_span)
        [span_63](start_span)ImportParametres(ConfImport);[span_63](end_span)
        [span_64](start_span)opened = false;[span_64](end_span)
      }
    [span_65](start_span)});[span_65](end_span)
  [span_66](start_span)server.begin();[span_66](end_span)
}

// --- NOUVEAUX HANDLERS POUR MOT DE PASSE ---

/**
 * @brief Affiche la page de modification du mot de passe.
 */
void handlePassword() {
  if (!checkAuth()) return; // Sécurise l'accès à cette page
  String html = PassHtml;
  html.replace("@@USER@@", www_user);
  server.sendHeader("Connection", "close");
  server.send(200, "text/html", html);
}

/**
 * @brief Traite la mise à jour du mot de passe depuis le formulaire.
 */
void handlePassUpdate() {
  if (!checkAuth()) return; // Sécurise l'accès à cette fonction
  
  if (server.hasArg("user") && server.hasArg("pass")) {
    www_user = server.arg("user");
    www_pass = server.arg("pass");
    
    // !! IMPORTANT !!
    // Assurez-vous que votre fonction EcritureEnROM() (dans votre .ino principal)
    // sauvegarde bien les variables 'www_user' et 'www_pass' en EEPROM.
    EcritureEnROM(); [span_67](start_span)// Appel de votre fonction existante[span_67](end_span)
    
    server.sendHeader("Connection", "close");
    server.send(200, "text/plain", "OK. Mot de passe mis a jour. Le navigateur va redemander l'authentification.");
  } else {
    server.sendHeader("Connection", "close");
    server.send(400, "text/plain", "Erreur: 'user' ou 'pass' manquant.");
  }
}

// --- HANDLERS EXISTANTS (TOUS MODIFIÉS AVEC checkAuth()) ---

void handleRoot() { //Pages principales
  if (!checkAuth()) return; // <-- SÉCURISÉ

  [span_68](start_span)server.sendHeader("Connection", "close");[span_68](end_span)
  [span_69](start_span)if (WiFi.getMode() != WIFI_STA) {[span_69](end_span)
    [span_70](start_span)server.send(200, "text/html", ConnectAP_Html);[span_70](end_span)
  } else {
    [span_71](start_span)server.send(200, "text/html", MainHtml);[span_71](end_span)
  }
}
void handleChange_Wifi() {
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_72](start_span)server.sendHeader("Connection", "close");[span_72](end_span)
  [span_73](start_span)server.send(200, "text/html", ConnectAP_Html);[span_73](end_span)
}
void handleMainJS() { //Code Javascript
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_74](start_span)server.sendHeader("Connection", "close");[span_74](end_span)
  [span_75](start_span)server.send(200, "text/javascript", MainJS);[span_75](end_span)
}
void handleMainJS2() { //Code Javascript
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_76](start_span)server.sendHeader("Connection", "close");[span_76](end_span)
  [span_77](start_span)server.send(200, "text/javascript", MainJS2);[span_77](end_span)
}
void handleMainJS3() { //Code Javascript
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_78](start_span)server.sendHeader("Connection", "close");[span_78](end_span)
  [span_79](start_span)server.send(200, "text/javascript", MainJS3);[span_79](end_span)
}
void handleBrute() { //Page données brutes
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_80](start_span)server.sendHeader("Connection", "close");[span_80](end_span)
  [span_81](start_span)server.send(200, "text/html", PageBrute);[span_81](end_span)
}
void handleBruteJS() { //Code Javascript
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_82](start_span)server.sendHeader("Connection", "close");[span_82](end_span)
  [span_83](start_span)server.send(200, "text/javascript", PageBruteJS);[span_83](end_span)
}
void handleBruteJS2() { //Code Javascript
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_84](start_span)server.sendHeader("Connection", "close");[span_84](end_span)
  [span_85](start_span)server.send(200, "text/javascript", PageBruteJS2);[span_85](end_span)
}

void handleAjaxRMS() { // Envoi des dernières données brutes reçues du RMS
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_86](start_span)String S = "";[span_86](end_span)
  [span_87](start_span)String RMSExtDataB = "";[span_87](end_span)
  [span_88](start_span)int LastIdx = server.arg(0).toInt();[span_88](end_span)
  [span_89](start_span)if (Source == "Ext") {[span_89](end_span)
    [span_90](start_span)WiFiClient clientESP_RMS;[span_90](end_span)
    [span_91](start_span)String host = IP2String(RMSextIP);[span_91](end_span)
    [span_92](start_span)if (!clientESP_RMS.connect(host.c_str(), 80)) {[span_92](end_span)
      [span_93](start_span)StockMessage("connection to ESP_RMS external failed (call from handleAjaxRMS)");[span_93](end_span)
      [span_94](start_span)return;[span_94](end_span)
    }
    [span_95](start_span)String url = "/ajax_dataRMS?idx=" + String(LastIdx);[span_95](end_span)
    [span_96](start_span)clientESP_RMS.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");[span_96](end_span)
    [span_97](start_span)unsigned long timeout = millis();[span_97](end_span)
    [span_98](start_span)while (clientESP_RMS.available() == 0) {[span_98](end_span)
      [span_99](start_span)if (millis() - timeout > 5000) {[span_99](end_span)
        [span_100](start_span)StockMessage(">>> clientESP_RMS Timeout !");[span_100](end_span)
        [span_101](start_span)clientESP_RMS.stop();[span_101](end_span)
        [span_102](start_span)return;[span_102](end_span)
      }
    }
    [span_103](start_span)while (clientESP_RMS.available()) {[span_103](end_span)
      [span_104](start_span)RMSExtDataB += clientESP_RMS.readStringUntil('\r');[span_104](end_span)
    }
    [span_105](start_span)S = RMSExtDataB.substring(RMSExtDataB.indexOf("\n\n") + 2);[span_105](end_span)
  } else {
    [span_106](start_span)S = DATE + RS + Source_data;[span_106](end_span)
    [span_107](start_span)if (Source_data == "UxI") {[span_107](end_span)
      [span_108](start_span)S += RS + String(Tension_M) + RS + String(Intensite_M) + RS + String(PowerFactor_M) + GS;[span_108](end_span)
      [span_109](start_span)int i0 = 0;[span_109](end_span)
      [span_110](start_span)int i1 = 0;[span_110](end_span)
      [span_111](start_span)for (int i = 0; i < 100; i++) {[span_111](end_span)
        [span_112](start_span)i1 = (i + 1) % 100;[span_112](end_span)
        [span_113](start_span)if (voltM[i] <= 0 && voltM[i1] > 0) {[span_113](end_span)
          [span_114](start_span)i0 = i1;[span_114](end_span)
          [span_115](start_span)i = 100;[span_115](end_span)
        }
      }
      [span_116](start_span)for (int i = 0; i < 100; i++) {[span_116](end_span)
        [span_117](start_span)i1 = (i + i0) % 100;[span_117](end_span)
        [span_118](start_span)S += String(int(10 * voltM[i1])) + RS;[span_118](end_span)
      }
      [span_119](start_span)S += "0" + GS;[span_119](end_span)
      [span_120](start_span)for (int i = 0; i < 100; i++) {[span_120](end_span)
        [span_121](start_span)i1 = (i + i0) % 100;[span_121](end_span)
        [span_122](start_span)S += String(int(10 * ampM[i1])) + RS;[span_122](end_span)
      }
      [span_123](start_span)S += "0";[span_123](end_span)
    }
    [span_124](start_span)if (Source_data == "UxIx2") {[span_124](end_span)
      [span_125](start_span)S += GS + String(Tension_M) + RS + String(Intensite_M) + RS + String(PuissanceS_M - PuissanceI_M) + RS + String(PowerFactor_M) + RS + String(Energie_M_Soutiree) + RS + String(Energie_M_Injectee);[span_125](end_span)
      [span_126](start_span)S += RS + String(Tension_T) + RS + String(Intensite_T) + RS + String(PuissanceS_T - PuissanceI_T) + RS + String(PowerFactor_T) + RS + String(Energie_T_Soutiree) + RS + String(Energie_T_Injectee);[span_126](end_span)
      [span_127](start_span)S += RS + String(Frequence);[span_127](end_span)
    }
    [span_128](start_span)if (Source_data == "Linky") {[span_128](end_span)
      [span_129](start_span)S += GS;[span_129](end_span)
      [span_130](start_span)while (LastIdx != IdxDataRawLinky) {[span_130](end_span)
        [span_131](start_span)S += String(DataRawLinky[LastIdx]);[span_131](end_span)
        [span_132](start_span)LastIdx = (1 + LastIdx) % 10000;[span_132](end_span)
      }
      [span_133](start_span)S += GS + String(IdxDataRawLinky);[span_133](end_span)
    }
    [span_134](start_span)if (Source_data == "Enphase") {[span_134](end_span)
      [span_135](start_span)S += GS + String(Tension_M) + RS + String(Intensite_M) + RS + String(PuissanceS_M - PuissanceI_M) + RS + String(PowerFactor_M) + RS + String(Energie_M_Soutiree) + RS + String(Energie_M_Injectee);[span_135](end_span)
      [span_136](start_span)S += RS + String(PactProd) + RS + String(PactConso_M);[span_136](end_span)
      [span_137](start_span)String SessionId = "Not Received from Enphase";[span_137](end_span)
      [span_138](start_span)if (Session_id != "") {[span_138](end_span)
        [span_139](start_span)SessionId = "Ok Received from Enphase";[span_139](end_span)
      }
      [span_140](start_span)String Token_Enphase = "Not Received from Enphase";[span_140](end_span)
      [span_141](start_span)if (TokenEnphase.length() > 50) {[span_141](end_span)
        [span_142](start_span)Token_Enphase = "Ok Received from Enphase";[span_142](end_span)
      }
      [span_143](start_span)if (EnphaseUser == "") {[span_143](end_span)
        [span_144](start_span)SessionId = "Not Requested";[span_144](end_span)
        [span_145](start_span)Token_Enphase = "Not Requested";[span_145](end_span)
      }
      [span_146](start_span)S += RS + SessionId;[span_146](end_span)
      [span_147](start_span)S += RS + Token_Enphase;[span_147](end_span)
    }
    [span_148](start_span)if (Source_data == "SmartG") {[span_148](end_span)
      [span_149](start_span)S += GS + SG_dataBrute;[span_149](end_span)
    }
    [span_150](start_span)if (Source_data == "ShellyEm" || Source_data == "ShellyPro") {[span_150](end_span)
      [span_151](start_span)S += GS + ShEm_dataBrute;[span_151](end_span)
    }
    [span_152](start_span)if (Source_data == "UxIx3") {[span_152](end_span)
      [span_153](start_span)S += GS + MK333_dataBrute;[span_153](end_span)
    }
    [span_154](start_span)if (Source_data == "Pmqtt") {[span_154](end_span)
      [span_155](start_span)S += GS + P_MQTT_Brute;[span_155](end_span)
    }
  }
  [span_156](start_span)server.sendHeader("Connection", "close");[span_156](end_span)
  [span_157](start_span)server.send(200, "text/html", S);[span_157](end_span)
}
void handleAjaxHisto48h() { // Envoi Historique de 50h (600points) toutes les 5mn
  if (!checkAuth()) return; // <-- SÉCURISÉ
  [span_158](start_span)String S = "";[span_158](end_span)
  [span_159](start_span)String T = "";[span_159](end_span)
  [span_160](start_span)String U = "";[span_160](end_span)
  [span_161](start_span)String Ouverture = "";[span_161](end_span)
  [span_162](start_span)int iS = IdxStockPW;[span_162](end_span)
  [span_163](start_span)for (int i = 0; i < 600; i++) {[span_163](end_span)
    [span_164](start_span)S += String(tabPw_Maison_5mn[iS]) + ",";[span_164](end_span)
    [span_165](start_span)T += String(tabPw_Triac_5mn[iS]) + ",";[span_165](end_span)
    [span_166](start_span)iS = (1 + iS) % 600;[span_166](end_span)
  }
  [span_167](start_span)for (int canal = 0; canal < 4; canal++) {[span_167](end_span)
    [span_168](start_span)iS = IdxStockPW;[span_168](end_span)
    [span_169]}

Imprimer cet élément

  Commande de chauffage avec circulateur
Posté par : DavidR79 - 25-10-2025, 01:56 PM - Forum : Evolutions faites, à faire, dont vous rêvez... - Réponses (2)

Bonjour,
Je souhaiterais installer un ballon tampon pour compléter la chauffe de ma chaudière gaz.
L'idée est de chauffer le ballon tampon par sa résistance électrique avec le surplus d'électricité et quand la température demandée est atteinte activer le circulateur du ballon tampon pour envoyer l'eau chaude vers la chaudière en circuit fermé. 
C'est la fonction du déclenchement du circulateur que je ne maîtrise pas.
Il faudrait qu'à une température atteinte ça enclenche le circulateur et quand la température est en dessous de la température demandée le circulateur s'arrête. 
Quel matériel utiliser pour la commande du circulateur. 
Pour info j'ai 2 départs sur la chaudière, le premier pour le chauffage central et le second qui sera utilisé par le ballon tampon.
Je pense à une fonction on off ssr commandé en fonction d'une température atteinte mais je préfère avoir vos avis.
En espérant que vous avez compris.
Merci d'avance
David

Imprimer cet élément

  Conflit entre mon routeur et ma batterie
Posté par : djipipi - 25-10-2025, 10:36 AM - Forum : Routeur Photovoltaïque - Réponses (6)

Bonjour à tous,

Je viens d’installer une batterie Venus E3 + CT002 en complément de mon installation photovoltaïque 5,7Kwc pour optimiser mon autoconsommation (je suis en Convention d'Autoconsommation Sans Injection CACSI).

J'ai un abonnement E.J.P Linky triphasé.

J’ai un routeur F1ATB piloté par un module Shelly 3em pour la régulation de l’injection de ma production solaire vers mon chauffe-eau électrique monophasé.

Jusque-là tout va bien si ce n’est que j’ai évidemment le même problème que beaucoup à propos de la concurrence entre mon routeur et ma batterie, dans la journée, la batterie se vide dans le chauffe-eau alors que je préférerais d’abord remplir la batterie et ensuite chauffer l’eau du CE, même partiellement car nous ne sommes plus que 2 à la maison.

Quelqu’un aurait une expérience à partager, pour le moment je gère en manuel mais c’est dommage pour du si beau matériel.
Merci pour vos conseils
P.S : je n’ai pas home assistant.

Imprimer cet élément


Utilisateurs en ligne
Il y a actuellement 294 utilisateurs connectés. » 7 Membre(s) | 284 Visiteur(s)
Bing, Google, Yandex, fazer31, H3rv3, Lolo69, nicomcla, Richard59, yankedy

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