Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Version V15.01 du routeur
#1
2 petites améliorations suite au passage de la V15.00 à la V15.01
  •  Nettoyage du code HTML,CSS,JavaScript grâce à l'analyse approfondie du code par Michy. Cela ne va rien changer. Juste un meilleur respect des recommandations du W3c.
  • Augmentation du timeout à l'établissement de la connexion vers un autre ESP ou Shelly et une deuxième tentative de connexion si la première échoue. Modification proposée par Lolo69 qui diminue les messages comme : "Connection to ESP_RMS ... failed" ou "connection to Shelly Em failed"

Pour passer de la V15.00 à la V15.01, il n'est pas nécessaire de sauvegarder vos paramètres. Allez dans Paramètres/Mise à jour par OTA, téléchargez la version 15.01 sur votre PC et envoyez-la à l'ESP32.

Cordialement

André
Répondre
#2
Super André !
Même en plein été , toujours d'attaque pour faire évoluer ce petit bijou.

Un grand merci encore

Bravo également à Michy et Lolo69 pour leur propositions d'évols et les investigations

Vive la communauté F1atb et une excellent dimanche , à l'ombre ;-) !
Config : 3 routeurs F1ATB en V14.25 - 2 routeurs fixes en mode Triacs + 1 routeur mobile polyvalent en mode : Triac+SSR
PV 3kw (8 panneaux TrinaSolar 425W + Onduleur SunGrow 3KW) - Supervision : Home Assistant / Shelly & MQTT
Autoconsommation moyenne >96 % depuis l'usage des routeurs f1atb Smile
Répondre
#3
Merci beaucoup pour cette mise à jour que je viens d'effectuer. Ayant moi même un Shelly EM comme moyen de mesures, je ne manquerais pas de vous faire un retour  Tongue
Routeur v15.01, mesures Shelly EM + sonde de température DS18B20
Triac Robodyn 24A/600V avec radiateur externe
Réglages réactivité 5, seuil de déclenchement -50, multi sinus
3 panneaux photovoltaïques Sunology Play 405W
Cumulus 200L 2200W méca 62°
Répondre
#4
Bonjour
Mise à jour effectué sans problème en 2 minutes sur deux routeurs grâce à la mise a jour par OTA.
C'est presque trop facile.
Merci André
1 esp32 wroom v15.1 -> Linky
1 esp32 wroom v15.1 -> UxIx2, 1 module JSY-MK-T
1 esp32 wroom V15.1 -> Film infrarouge, 1 sonde T° ,1 ssr
6 Panneaux 2,5 kw
Répondre
#5
Bonjour,

Mise à jour effectuée ce matin à la première heure (avant que le (chaud) soleil ne se pointe), en utilisant pour ma part comme d'habitude la procédure par OTA après compilation du code source un peu modifié, sans aucun soucis.
Effectivement, il y a beaucoup (mais vraiment beaucoup) moins d'alertes de déconnexion sur mon Shelly PRO EM50, c'est parfait !
Merci à tous (André, Lolo69, Michy) pour cette nouvelle version !
_________________________________________________
Routeur Solaire en v15.01 (modifié avec écran OLED)
Pilotage d'un cumulus de 3kW + Jeedom v4.4.19 + Station solaire 3,5kW
Répondre
#6
Bonjour ,
Petit retour sur la maj 15.01
précédemment j'avais pas mal de messages Shelly Failed ...
si avec la 15.01, j'ai moins de messages ou plutôt les messages sont plus espacés , 
j'ai maintenant des messages " client Shelly Em Timeout !" que je n'avais pas avant .
voir en PJ recopie écran des données brutes de mon routeur maitre situé à 1 m du shelly dans la même pièce.


Pièces jointes Miniature(s)
   
Config : 3 routeurs F1ATB en V14.25 - 2 routeurs fixes en mode Triacs + 1 routeur mobile polyvalent en mode : Triac+SSR
PV 3kw (8 panneaux TrinaSolar 425W + Onduleur SunGrow 3KW) - Supervision : Home Assistant / Shelly & MQTT
Autoconsommation moyenne >96 % depuis l'usage des routeurs f1atb Smile
Répondre
#7
(Hier, 07:41 AM)Sgb31 a écrit : Bonjour ,
Petit retour sur la maj 15.01
précédemment j'avais pas mal de messages Shelly Failed ...
si avec la 15.01, j'ai moins de messages ou plutôt les messages sont plus espacés , 
j'ai maintenant des messages " client Shelly Em Timeout !" que je n'avais pas avant .
voir en PJ recopie écran des données brutes de mon routeur maitre situé à 1 m du shelly dans la même pièce.

C'est très étrange parce que je ne rencontre pas du tout ce problème.

En tous cas pour moi cela fonctionne parfaitement, j'ai quelques erreurs par ci par là à une fréquence de 2 par exemple hier mais franchement par rapport à avant c'est anecdotique. Et en effet on a comme une impression que la régulation fonctionne encore mieux. A voir avec le temps.

Merci à tous pour cette amélioration !
Routeur v15.01, mesures Shelly EM + sonde de température DS18B20
Triac Robodyn 24A/600V avec radiateur externe
Réglages réactivité 5, seuil de déclenchement -50, multi sinus
3 panneaux photovoltaïques Sunology Play 405W
Cumulus 200L 2200W méca 62°
Répondre
#8
(Hier, 08:23 AM)clyon44 a écrit :
(Hier, 07:41 AM)Sgb31 a écrit : Bonjour ,
Petit retour sur la maj 15.01
précédemment j'avais pas mal de messages Shelly Failed ...
si avec la 15.01, j'ai moins de messages ou plutôt les messages sont plus espacés , 
j'ai maintenant des messages " client Shelly Em Timeout !" que je n'avais pas avant .
voir en PJ recopie écran des données brutes de mon routeur maitre situé à 1 m du shelly dans la même pièce.

C'est très étrange parce que je ne rencontre pas du tout ce problème.

En tous cas pour moi cela fonctionne parfaitement, j'ai quelques erreurs par ci par là à une fréquence de 2 par exemple hier mais franchement par rapport à avant c'est anecdotique. Et en effet on a comme une impression que la régulation fonctionne encore mieux. A voir avec le temps.

Merci à tous pour cette amélioration !

Voilà également ce que je constate sur le second routeur esclave du premier ..
C'est assez étrange ...


Pièces jointes Miniature(s)
   
Config : 3 routeurs F1ATB en V14.25 - 2 routeurs fixes en mode Triacs + 1 routeur mobile polyvalent en mode : Triac+SSR
PV 3kw (8 panneaux TrinaSolar 425W + Onduleur SunGrow 3KW) - Supervision : Home Assistant / Shelly & MQTT
Autoconsommation moyenne >96 % depuis l'usage des routeurs f1atb Smile
Répondre
#9
Bonjour,
MAJ effectué. Rien à signaler Tout est OK. Gestion via Enphase.
Grand merci à André, Michi et Lolo69
Répondre
#10
(Hier, 07:41 AM)Sgb31 a écrit : Bonjour ,
Petit retour sur la maj 15.01
précédemment j'avais pas mal de messages Shelly Failed ...
si avec la 15.01, j'ai moins de messages ou plutôt les messages sont plus espacés , 
j'ai maintenant des messages " client Shelly Em Timeout !" que je n'avais pas avant .
voir en PJ recopie écran des données brutes de mon routeur maitre situé à 1 m du shelly dans la même pièce.

Ah, ça me rassure de ne pas être le seul à avoir ces TimeOut venant du Shelly (Shelly Pro 3EM dans mon cas, connecté en filaire. Et le routeur est tout près du point d'accès Wifi 2.4GHz) 

Et donc globalement le routeur (injection du surplus) fonctionne correctement malgré ces erreurs épisodiques ? Quels paramètres tu utilises pour les actions ?
Vu que de mon côté la régulation ne marche pas, je suspectais que ça puisse en être la raison. 

Et effectivement dans le version 15.01, André a augmenté le temps de Timeout de la connexion au Shelly à 3 secondes, et en cas d'erreur, réessaie dans la foulée une autre connexion avec ce même TimeOut de 3 seconde. Ce n'est que si les deux échouent qu'on a le message d'erreur.

Si tu veux essayer ce petit script Python, je suis curieux de voir de que ça te donne (il te suffit de changer l'IP du Shelly Ligne 6). A la fin, le script t'affiche un récap et génère un .csv contenant le détail des mesures effectuées:
Code :
import requests
import time
import csv
from requests.exceptions import ConnectTimeout, ReadTimeout, RequestException

SHELLY_URL = "http://192.168.1.34/rpc/Shelly.GetStatus"
WAIT_AFTER_RESPONSE = 0.1  # 50ms après la réponse
MAX_RETRIES = 3
CONNECT_TIMEOUT = 3
READ_TIMEOUT = 3
DURATION = 180  # secondes

def get_status_with_retry(request_number, timeout_counter, start_time):
    """
    Effectue la requête avec retries, affiche le détail complet en cas de timeout ou erreur
    + indique le temps écoulé depuis le début du test.
    """
    for attempt in range(1, MAX_RETRIES + 1):
        try:
            r = requests.get(SHELLY_URL, timeout=(CONNECT_TIMEOUT, READ_TIMEOUT))
            r.raise_for_status()
            return r.json(), timeout_counter, False
        except ConnectTimeout:
            timeout_counter += 1
            elapsed = time.time() - start_time
            print(f"[Requête #{request_number}] ConnectTimeout {timeout_counter} "
                  f"(tentative {attempt}/{MAX_RETRIES}, à {elapsed:.2f}s depuis le début, "
                  f"timeout={CONNECT_TIMEOUT}s)")
            time.sleep(0.05)
        except ReadTimeout:
            timeout_counter += 1
            elapsed = time.time() - start_time
            print(f"[Requête #{request_number}] ReadTimeout {timeout_counter} "
                  f"(tentative {attempt}/{MAX_RETRIES}, à {elapsed:.2f}s depuis le début, "
                  f"timeout={READ_TIMEOUT}s)")
            time.sleep(0.05)
        except RequestException as e:
            elapsed = time.time() - start_time
            print(f"[Requête #{request_number}] Erreur: {e} "
                  f"(à {elapsed:.2f}s depuis le début)")
            time.sleep(0.05)
    return None, timeout_counter, True  # échec complet

def main():
    response_times = []
    refresh_intervals = []
    timeout_counter = 0
    request_number = 0
    success_count = 0
    last_values = None
    last_change_time = None
    start_time = time.time()

    # Préparer le CSV
    with open("shelly_log.csv", "w", newline="", encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile, delimiter=";")
        writer.writerow([
            "req_num", "timestamp_s", "resp_time_ms", "timeout_flag",
            "U1", "I1", "P1", "U2", "I2", "P2", "U3", "I3", "P3"
        ])

        while time.time() - start_time < DURATION:
            request_number += 1
            t0 = time.perf_counter()
            data, timeout_counter, failed = get_status_with_retry(request_number, timeout_counter, start_time)
            t1 = time.perf_counter()

            resp_time = (t1 - t0) * 1000 if not failed else None
            timestamp_s = time.time() - start_time

            if data is None:
                writer.writerow([request_number, f"{timestamp_s:.3f}", "", 1, "", "", "", "", "", "", "", "", ""])
                time.sleep(WAIT_AFTER_RESPONSE)
                continue

            try:
                values = tuple(
                    (
                        data[f"em1:{i}"]["voltage"],
                        data[f"em1:{i}"]["current"],
                        data[f"em1:{i}"]["act_power"]
                    )
                    for i in [0, 1, 2]
                )
            except KeyError:
                print(f"[Requête #{request_number}] Structure inattendue")
                writer.writerow([request_number, f"{timestamp_s:.3f}", f"{resp_time:.2f}", 0, "", "", "", "", "", "", "", "", ""])
                time.sleep(WAIT_AFTER_RESPONSE)
                continue

            # Détection changement global
            if values != last_values:
                now = time.perf_counter()
                if last_change_time is not None:
                    refresh_intervals.append((now - last_change_time) * 1000)
                last_change_time = now
                last_values = values

            response_times.append(resp_time)
            success_count += 1

            # Écriture CSV
            writer.writerow([
                request_number,
                f"{timestamp_s:.3f}",
                f"{resp_time:.2f}",
                0,
                values[0][0], values[0][1], values[0][2],
                values[1][0], values[1][1], values[1][2],
                values[2][0], values[2][1], values[2][2],
            ])

            time.sleep(WAIT_AFTER_RESPONSE)

    # Ignorer le premier intervalle
    filtered_intervals = refresh_intervals[1:] if len(refresh_intervals) > 1 else []

    # Résultats
    if response_times:
        print("\n=== Temps de réponse API (réussites uniquement) ===")
        print(f"Min: {min(response_times):.2f} ms")
        print(f"Max: {max(response_times):.2f} ms")
        print(f"Moy: {sum(response_times)/len(response_times):.2f} ms")

    if filtered_intervals:
        print("\n=== Intervalle de mise à jour global (3 phases) ===")
        print(f"(Première valeur ignorée, {len(filtered_intervals)} intervalles utilisés)")
        print(f"Min: {min(filtered_intervals):.2f} ms")
        print(f"Max: {max(filtered_intervals):.2f} ms")
        print(f"Moy: {sum(filtered_intervals)/len(filtered_intervals):.2f} ms")

    total_time = time.time() - start_time
    print("\n=== Bilan final ===")
    print(f"Durée totale du test : {total_time:.2f} s")
    print(f"Nombre total de requêtes tentées : {request_number}")
    print(f"Nombre de requêtes réussies : {success_count}")
    print(f"Nombre de changements détectés (hors 1er) : {len(filtered_intervals)}")
    print(f"Taux de réussite : {100 * success_count / request_number:.1f} %")
    print(f"Total timeouts : {timeout_counter}")
    print("\n? Détails enregistrés dans 'shelly_log.csv'")

if __name__ == "__main__":
    main()


Dans mon cas, voici la répartition des temps d'accès au Shelly, sur un test intensif pendant 3 minutes (861 accès effectués). On voit que la grande majorité des accès se fait en environ 200 ms. Seuls 3 accès sur 861 dépassent une seconde, le pire étant à 2.55s. 
   
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : seb19781981, 1 visiteur(s)