Frisquet Connect - les ordres ne passent plus

Bonjour, j’utilisais depuis au moins 2 ans le plugin Frisquet Connect dispo sur le market pour piloter ma chaudière à gaz Frisquet qui est équipée du boitier « Frisquet Connect » permettant la commande à distance via appli sur smartphone.
Grâce au plugin je pouvais modifier les réglages de ma chaudière avec Jeedom.

Je constate depuis quelques temps que les ordres envoyés à la chaudière ne passent plus (en revanche le plugin restitue bien les infos venant de la chaudière)

Chose étrange, lorsqu’on passe un ordre (changement de température de consigne ou de mode de fonctionnement) via le plugin à partir de Jeedom, cet ordre passe bien au niveau de l’appli Frisquet Connect (qui affiche alors l’état tel que demandé via le plugin), mais cet ordre n’est pas communiqué à la chaudière (et je reçois une notification m’indiquant qu’un ordre n’a pas été envoyé).

En revanche si je passe le même ordre directement depuis l’appli sur smartphone, la chaudière le prend bien en compte …

J’ai aussi testé les scripts proposés ici https://community.jeedom.com/t/plugin-frisquet-connect/92119/17 : le résultat est le même → les scripts récupèrent bien les infos, les actions sont bien envoyées vers les serveurs Frisquet et apparaissent dans l’appli, mais ces actions ne sont pas envoyées à la chaudière (mais une action directe dans l’appli fonctionne systématiquement)

D’autres rencontrent-ils le même problème ? Frisquet auraient-ils changé quelque chose pour éviter ce type d’interactions (qui restent en théorie non autorisées par leurs conditions générales de vente …).

Merci de vos avis

Bonjour,

Je confirme le même soucis : mail de Frisquet Connect " Un ordre n’a pas été envoyé à votre chaudière" lorsque l’ordre est envoyé depuis Jeedom, pb depuis le mois d’Avril environ.

J’ai réussi une fois à faire passer l’ordre après avoir débrancher/rebrancher l’alimentation de la box Frisquet Connect mais j’en suis resté là.

Je sais que @WillJ a le même pb pour avoir échangé avec lui.

Hello,
je confirme même problème cela était bien pratique… Je pense que Frisquet a mis en place une protection car ils « aiment » garder leur système fermé.

j’ai également fait un reset du Frisquet Connect enlevant l’association entre la chaudière et la box Frisquet, depuis j’obtiens régulièrement des messages « Un ordre n’a pas été envoyé à votre chaudière » alors que celle ci est tout de même envoyée…

Il faudrait réussir à sniffer les ordres envoyés depuis l’appli Frisquet vers leurs serveurs comme cela avait été fait mais je n’y suis pas parvenu (je m’y prend surement mal).

Merci de vos réponses ! Déjà ça me rassure : ce n’est pas un problème sur mon installation

Je n’avais pas été jusqu’à refaire l’association entre box et chaudière : comme les actions initiées directement depuis l’appli Frisquet Connect sur smartphone fonctionnent, cette association ne me paraissait pas en cause.

Il doit y avoir une subtilité introduite par Frisquet qui permet de discerner les ordres venant effectivement de l’appli de ceux venant d’ailleurs … Mais là, je suis comme vous incapable d’aller plus loin, mes connaissances techniques ne me le permettent hélas pas.

Je vais tenter de fouiller sur les forums relatifs à Home Assistant car je sais que des utilisateurs de HA avaient aussi développé une interface avec Frisquet Connect : ils devraient avoir le même problème.

Sinon je vais aussi tenter de recontacter l’auteur du plugin Frisquet Connect : j’avais été « béta testeur » de son plugin il y a quelques années et il avait été très réactif quand je lui faisais remonter des problèmes durant mes tests (mais à priori j’ai cru lire qu’il n’était plus actif ici hélas) … à suivre …

2 « J'aime »

Une info sur ce sujet, obtenue sur la communauté française des utilisateurs de Home Assistant
Il y a en effet une intégration dans Home Assistant qui a été faite par un développeur : j’ai donc demandé si elle fonctionnait toujours, voici la réponse du développeur HA:

« Oui cela fonctionne toujours. Nous avons du mettre a jour l’integration car Frisquet a fait des mise a jour et il faut maintenant gérer du websocket. Nous avons réussi a adapter les appels API avec cela »

Conclusion : ça peut toujours fonctionner mais la solution développée pour Jeedom doit être mise à jour … mais là s’arrêtent hélas mes compétences. Si quelqu’un pouvait comparer avec la solution HA disponible sur Github, ce serait top …

Effectivement, toutes les modifs concernant l’API sont bien détaillées sur GitHub pour HA avec les scripts en python:

Pour ma part sur Jeedom, j’utilise les scripts shell fournit par @zos93 ( Plugin Frisquet Connect ) et pas le plugin Frisquet Connect (qui est resté en « privé » d’ailleurs)

Hélas pas compétent pour savoir si les nouveaux appels API peuvent être adaptés sur les scripts shell.

voilà c’est exactement ça - les scripts que tu cites développés par @zos93 utilisent la même méthode que le plugin privé de @anto35 (auquel j’avais accès, mais hélas il ne semble plus intervenir sur ce forum) : j’ai testé et visualisé le code des 2 et c’est pareil - il faudrait effectivement intégrer à ces scripts (ou au plugin pour ceux qui l’utilisent, les évolutions comme fait pour Home Assistant … mais là je suis comme toi, pas suffisamment compétent … mais comme quand j’ai un os à ronger je m’avoue rarement vaincu, je vais essayer de comprendre ce qu’il faudrait faire … ça va occuper les longues soirées d’hiver :sweat_smile:

Hello @patoche94 @rhoazon,

J’ai trouvé une solution, il faut désormais utiliser Python pour exécuter des commandes avec websocket. n’étant pas développeur sur python j’ai fait appel à Gemini… qui a su adapter et réécrire le script à partir de la source Home Assistant…

Etape 1 : Créer un fichier FrisquetSet.py

import sys
import json
import requests
import websocket
import time
import ssl

# --- 1. Récupération des arguments passés par Jeedom ---
if len(sys.argv) < 6:
    print("Erreur : Arguments manquants.")
    print("Usage : python3 frisquet_set.py <EMAIL> <PASSWORD> <CLE_ORDRE> <TYPE> <VALEUR>")
    sys.exit(1)

EMAIL = sys.argv[1]
PASSWD = sys.argv[2]
CLE_ORDRE = sys.argv[3]
TYPE = sys.argv[4]
VALEUR = sys.argv[5]

# --- 2. Préparation de la Valeur (comme dans le script shell) ---
# Formatage de la température (ex: 20.5 -> "205")
if TYPE == "TEMPERATURE":
    VALEUR_str = str(VALEUR).replace('.', '')
    if len(VALEUR_str) <= 2:
        VALEUR_str += "0"
    VALEUR = VALEUR_str
else:
    VALEUR = str(VALEUR)


# --- 3. AUTHENTIFICATION (Récupération du Token et de l'ID) ---
AUTH_URL = 'https://fcutappli.frisquet.com/api/v1/authentifications?app_id=dXk9XRsJQ8WfuO3IAsgpxr'
AUTH_DATA = {
    "locale": "fr",
    "email": EMAIL,
    "password": PASSWD,
    "type_client": "IOS" # Le payload reste 'IOS'
}

# Headers Android requis par la nouvelle API
HEADERS = {
    'Content-Type': 'application/json; charset=UTF-8',
    'Accept-Language': 'FR',
    'Android-Version': '2.8.1',
    'User-Agent': 'okhttp/4.12.0',
    'Host': 'fcutappli.frisquet.com'
}

try:
    auth_response = requests.post(AUTH_URL, headers=HEADERS, json=AUTH_DATA, timeout=10)
    auth_response.raise_for_status()
    auth_json = auth_response.json()

    # Extraction du Token (niveau racine)
    TOKEN = auth_json.get('token')

    # CORRECTION : Extraction de l'ID Chaudière (imbriqué dans ['utilisateur']['sites'][0])
    try:
        # On suppose que le premier site/chaudière est celui que l'on veut contrôler
        ID_CHAUDIERE = auth_json['utilisateur']['sites'][0]['identifiant_chaudiere']
    except (KeyError, IndexError):
        ID_CHAUDIERE = None

    if not TOKEN or not ID_CHAUDIERE:
        print(f"Erreur d'authentification: Token ou ID chaudière manquant. Réponse: {auth_json}")
        sys.exit(1)

except requests.exceptions.RequestException as e:
    print(f"Erreur lors de l'authentification HTTP: {e}")
    sys.exit(1)


# --- 4. ENVOI DE L'ORDRE (POST) ---
ORDER_URL = f"https://fcutappli.frisquet.com/api/v1/ordres/{ID_CHAUDIERE}?token={TOKEN}"
ORDER_DATA = [
    {
        "cle": CLE_ORDRE,
        "valeur": VALEUR
    }
]

try:
    order_response = requests.post(ORDER_URL, headers=HEADERS, json=ORDER_DATA, timeout=10)
    order_response.raise_for_status()
    print(f"Ordre POST envoyé. Statut HTTP: {order_response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"Erreur lors de l'envoi de l'ordre HTTP: {e}")
    sys.exit(1)

# --- 5. CONFIRMATION PAR WEBSOCKET ---
# L'attente de confirmation est essentielle pour la nouvelle API
WS_URL = f"wss://fcappcom.frisquet.com/?token={TOKEN}&identifiant_chaudiere={ID_CHAUDIERE}"
WS_PAYLOAD = json.dumps({"type": "ORDRE_EN_ATTENTE"})

confirmation_received = False
TIMEOUT = 20 # Attente maximum de 20 secondes

try:
    # Création de la connexion WebSocket. Ignorer la vérification SSL est parfois nécessaire.
    ws = websocket.create_connection(WS_URL, timeout=TIMEOUT, sslopt={"cert_reqs": ssl.CERT_NONE})
    ws.send(WS_PAYLOAD)
    
    start_time = time.time()
    
    while time.time() - start_time < TIMEOUT:
        try:
            result = ws.recv()
            if result:
                data = json.loads(result)
                # La chaudière envoie 'ORDRE_OK' ou un statut 'OK' une fois la commande prise en compte
                if data.get('type') == 'ORDRE_OK' or data.get('statut') == 'OK':
                    confirmation_received = True
                    break
        except websocket.WebSocketTimeoutException:
            pass # Continue la boucle si rien n'est reçu immédiatement
        except Exception:
            # En cas d'autre erreur (connexion coupée), on sort
            break

    ws.close()

except Exception as e:
    print(f"Erreur de connexion WebSocket: {e}")
    # On considère la commande comme non confirmée si le WS échoue
    sys.exit(1)


# --- 6. RÉSULTAT FINAL ---
if confirmation_received:
    print(f"SUCCESS: Commande '{CLE_ORDRE}' avec valeur '{VALEUR}' confirmée.")
    sys.exit(0) # Code de succès
else:
    print(f"FAILURE: Délai d'attente dépassé. Commande non confirmée après {TIMEOUT} secondes.")
    sys.exit(1) # Code d'échec

Etape 2 : Modifier le fichier FrisquetSet.sh

#!/bin/bash
# Le $0 est le nom du script, les $1, $2, etc., sont les arguments.
python3 /var/www/html/plugins/script/data/FrisquetSet.py "$1" "$2" "$3" "$4" "$5"

Etape 3 : Tester dans le plugin script ! et normalement tout rentre dans l’ordre :smiley:

4 « J'aime »

Merci pour ton travail !

Je viens de tester mais j’ai une erreur:

File "/var/www/html/plugins/script/data/FrisquetSet.py", line 4, in <module>
    import websocket
ModuleNotFoundError: No module named 'websocket'

Je suis sur une VM Debian 12 jeedom 4.4.20, websocket n’est pas installé… à suivre

Ah j’ai oublié cette étape il me semble, peux-tu essayer cette commande sur ton Raspberry

sudo pip3 install requests websocket-client
root@DEBIAN12:/var/www/html/plugins/script/data# pip3 install requests websocket-client
error: externally-managed-environment

Ce n’est pas un raspberry mais une machine virtuelle sur un NAS

la commande qui a fonctionné :
sudo apt install python3-websocket

root@DEBIAN12:/var/www/html/plugins/script/data# ./FrisquetSet.sh ******@gmail.com motdepasse SELECTEUR_Z1 PERM 6
Ordre POST envoyé. Statut HTTP: 200
SUCCESS: Commande 'SELECTEUR_Z1' avec valeur '6' confirmée.

Tout est OK :+1:

1 « J'aime »

Good news :ok_hand:

Connais tu les commandes pour passer la chaudière « Confort », « Réduit », « Hors Gel » ou « Auto » ?
Idem sur le ballon d’eau chaude de la chaudière : « Max », « Eco », « Eco🕛 »; « Eco+ »; « Eco+🕛 »; « Stop »

Merci

Je me suis basé sur le fichier fournit par Zos93 dans le sujet déjà cité:

tu trouveras le fichier Doc_API.txt avec les informations de toutes les commandes

exemples pour les modes consignes, le mot clé est SELECTEUR_Z1
permanent CONFORT : FrisquetSet.sh ****@gmail.com mdp SELECTEUR_Z1 PERM 6
AUTO : FrisquetSet.sh ****@gmail.com mdp SELECTEUR_Z1 PERM 5
permanent REDUIT : FrisquetSet.sh ****@gmail.com mdp SELECTEUR_Z1 PERM 7
permanent HORS-GEL : FrisquetSet.sh ****@gmail.com mdp SELECTEUR_Z1 PERM 8

Pour le ballon eau chaude, le mot clé est MODE-ECS
FrisquetSet.sh email mdp MODE_ECS ECS 2
Correspondance des valeurs :
5 = Stop
4 = Eco + Timer
3 = Eco +
2 = Eco Timer
1 = Eco
0 = MAX

1 « J'aime »

Génial, effectivement ça fonctionne !

J’ai juste eu un petit soucis de message d’erreur lié au time out de 20 secondes initialement mis dans le script : en le poussant à 60 secondes ça semble OK

Bon boulot @WillJ , merci pour tout !

1 « J'aime »

Au top ça fonctionne chez moi aussi, merci beaucoup :slight_smile:

pour info, comme j’avais échangé avec lui en message privé, @anto35 vient de m’informer qu’il a poussé sur le market une nouvelle béta du plugin qu’il avait développé il y a 2 ou 3 ans, et qui intègre les corrections nécessaires. Je n’ai pas encore testé (ce soir), je vous dirai si ça fonctionne

1 « J'aime »

Est ce possible d’être intégré à cette bêta ?

je vais demander à l’auteur …
Sinon j’ai toujours ce message d’erreur sur le délai d’attente dépassé, quasi systématiquement quand j’envoie un ordre à la chaudière, même si l’ordre passe effectivement.
Ca se produit aussi avec le plugin béta que je viens de tester (mais dans le code je trouve le même timeout de 20s, ce qui explique que le comportement est le même qu’avec le script python)

Avez-vous aussi ce message d’erreur ? (pendant cette période de timeout, je comprends que le code entre dans une boucle d’attente de la confirmation de prise en compte de l’ordre par la chaudière - si cette confirmation n’arrive pas, on sort de la boucle et le message d’erreur est affiché - en passant le timeout à 60s ça se produit encore - je vais tenter à 90s je ne pense pas que cela ait d’incidence car le code est juste à l’écoute de la réponse du serveur)

Je n’ai pas ce message d’erreur de mon côté. À quel endroit vois tu ce message d’erreur ?

Bandeau rouge qui apparaît en bas à droite de la fenêtre Jeedom et on le retrouve dans les log du plugin script - ceci dit quand j’envoi un ordre même depuis l’appli il est toujours assez long à être pris en compte sur le satellite/thermostat de la chaudière et ça a toujours été comme ça depuis que j’ai le boîtier Frisquet Connect (que j’ai depuis au moins 5 ou 6 ans) - c’est instantané chez toi ?