pyhaseiq
Bibliothèque Python en lecture seule pour les poêles à bois Hase iQ, via leur WebSocket local. Entièrement locale : ni cloud, ni application constructeur, ni compte.
🔍 LECTURE SEULE — cette bibliothèque ne commande rien
pyhaseiqinterroge le poêle : température, phase de combustion, performance. Elle n'écrit rien, ne règle rien, n'allume rien, n'éteint rien. Aucune commande d'écriture n'a été observée dans le protocole, aucune n'est implémentée, et c'est un choix permanent du projet — voir les interdits.Un poêle à bois est un appareil à combustion : sa conduite reste manuelle et relève de son utilisateur. Cette bibliothèque observe, elle ne se substitue à aucun organe de sécurité.
⚠️ PROJET INDÉPENDANT, SANS AUCUNE AFFILIATION
pyhaseiqn'est en aucun cas affilié, soutenu, approuvé ou validé par HASE Kaminofenbau GmbH, ou l'une quelconque de ses filiales, marques, sociétés apparentées, sous-traitants ou partenaires. HASE, Hase iQ et flamemonitor sont des marques de leurs titulaires respectifs, citées uniquement pour décrire le matériel avec lequel cette bibliothèque communique, à des fins d'interopérabilité.👉 Lisez l'avertissement complet ci-dessous avant toute utilisation. Il couvre l'absence totale de garantie, la garantie constructeur et les conditions d'usage. En utilisant cette bibliothèque, vous reconnaissez les avoir lues et acceptées.
⚠️ Avertissement complet — à lire avant toute utilisation
Ce projet est totalement indépendant et n'est en aucun cas affilié, soutenu, approuvé ou validé par HASE Kaminofenbau GmbH (Niederkircher Straße 14, 54294 Trier, Amtsgericht Wittlich HRB 4937), ou l'une quelconque de ses filiales, marques, sociétés apparentées, sous-traitants ou partenaires.
HASE, Hase iQ et flamemonitor sont des marques de leurs titulaires respectifs. Elles ne sont citées ici que pour décrire le matériel avec lequel cette bibliothèque est susceptible de communiquer, à des fins d'interopérabilité. Aucun code, aucun binaire, aucun micrologiciel, aucune clé cryptographique et aucune documentation du fabricant n'est reproduit ni redistribué dans ce dépôt.
Nom du projet — pyhaseiq est un nom d'usage choisi pour sa lisibilité. Il
n'emporte aucune affiliation, ne constitue ni une marque, ni une revendication
d'origine, ni une autorisation du titulaire de la marque Hase. Cette bibliothèque est
un composant tiers compatible avec ce matériel, et rien d'autre.
Méthode — le protocole documenté ici a été reconstitué par la seule observation du dialogue réseau entre l'application constructeur et un poêle acquis légalement, sur une installation appartenant à l'auteur. Aucune décompilation de micrologiciel, aucune extraction ni publication de clé cryptographique constructeur n'a été réalisée. Ce travail relève de l'exception d'interopérabilité (art. L122-6-1 III et IV du Code de la propriété intellectuelle, directive 2009/24/CE art. 5 et 6).
Lecture seule — cette bibliothèque n'émet aucune commande d'écriture vers le poêle. Elle ne modifie aucun réglage, ne déclenche ni n'interrompt aucune combustion. La conduite du poêle reste entièrement manuelle et sous la responsabilité de son utilisateur, conformément à la notice du fabricant.
Aucun rôle de sécurité — les valeurs lues sont fournies à titre indicatif. Elles ne constituent ni une mesure certifiée, ni une alarme, ni un dispositif de sécurité, et ne remplacent en rien un détecteur de fumée, un détecteur de monoxyde de carbone ou le ramonage réglementaire de votre installation. Ne fondez aucune décision de sécurité sur cette bibliothèque.
Usage — cette bibliothèque est destinée à la lecture d'équipements dont vous êtes propriétaire ou légitime utilisateur, et à eux seuls.
Absence de garantie — ce logiciel est fourni « tel quel », sans aucune garantie d'aucune sorte, expresse ou implicite, y compris, sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et d'absence de contrefaçon. Dans les limites permises par le droit applicable, l'auteur ne saurait être tenu responsable d'un quelconque dommage : dysfonctionnement, détérioration de matériel, perte de données, ou tout dommage direct ou indirect résultant de l'utilisation de cette bibliothèque.
Garantie constructeur — l'usage de ce logiciel avec votre matériel est susceptible d'en affecter la garantie. Vérifiez-le avant de l'utiliser.
Support — assuré bénévolement, sans engagement de délai ni de résultat.
Licence — MIT, voir LICENSE.
En utilisant cette bibliothèque, vous reconnaissez avoir lu et accepté l'ensemble de ces conditions.
Sommaire
- Quelle génération ?
- Démarrage rapide
- État du projet
- Installation
- Utilisation
- Logging
- Développement
- Contribuer
- Sécurité
Quelle génération ?
Deux générations de poêles portent le nom « Hase iQ », et elles ne parlent pas le même langage. Elles se distinguent à l'application que vous utilisez :
| votre application | génération | pyhaseiq |
|---|---|---|
flamemonitor |
ancienne | ✅ supportée |
HASE iQ |
nouvelle | ❌ non supportée |
La nouvelle génération n'a pas été observée et son protocole est inconnu. Rien n'est prévu à ce sujet, et les retours sont les bienvenus.
Le protocole de l'ancienne est intégralement décrit dans
docs/SPEC-PROTOCOLE-WS.md, où chaque affirmation porte un statut
✅ validé / 🟡 partiel / ❓ supposé.
Démarrage rapide
Avec uv et l'adresse IP de votre poêle :
git clone https://github.com/bbayszczak/pyhaseiq
cd pyhaseiq
uv run demo.py 192.168.1.165
uv crée l'environnement et installe les dépendances tout seul. demo.py n'écrit rien :
il affiche un tableau rafraîchi en continu avec la phase du poêle et les mesures disponibles.
C'est le moyen le plus rapide de vérifier que votre poêle répond.
État du projet
🚧 Alpha. La lecture fonctionne et le protocole est documenté. L'API peut encore changer.
Les changements de chaque version sont consignés dans le CHANGELOG, tenu à jour automatiquement à partir des messages de commit.
Installation
pip install pyhaseiq
Ou directement depuis le dépôt :
pip install git+https://github.com/bbayszczak/pyhaseiq
Utilisation
L'API est asynchrone : le poêle est un serveur WebSocket, et c'est le modèle qu'attend un hôte comme Home Assistant.
import asyncio
from pyhaseiq import Client, Phase
async def main() -> None:
async with Client("192.168.1.165") as stove:
phase = await stove.get_phase()
print(phase) # Phase.HEATING_UP
if phase is Phase.HEATING_UP:
print(await stove.get_temperature()) # 163.3 °C dans le foyer
print(await stove.get_heat_up_percent()) # 53.5 % de la montée en chauffe
elif phase is Phase.NOMINAL:
print(await stove.get_performance()) # 69 % de performance de combustion
asyncio.run(main())
Les phases
get_phase() rend un Phase, qui est un IntEnum :
| valeur | nom | signification |
|---|---|---|
0 |
Phase.IDLE |
pas de feu, le poêle attend |
1 |
Phase.HEATING_UP |
feu en cours, la température monte |
2 |
Phase.NOMINAL |
température nominale atteinte |
3 |
Phase.NEEDS_WOOD |
il faut recharger en bois |
4 |
Phase.BURNING_OUT |
le feu s'éteint, ne plus ajouter de bois |
⚠️ Toutes les mesures ne sont pas lisibles dans toutes les phases. L'application constructeur ne demande
appTetappAufheizqu'en phaseHEATING_UP, etappPqu'en phaseNOMINAL. On ignore si le poêle répond quand même hors de ces phases ou s'il reste muet — auquel cas l'appel se solde par unResponseTimeoutError. Testez la phase avant de lire, comme le fait l'exemple ci-dessus.
Les erreurs
Toutes dérivent de HaseIQError, ce qui permet de rattraper la bibliothèque entière d'un seul
except :
| exception | quand |
|---|---|
ConnectionFailedError |
poêle injoignable, ou connexion perdue en cours de dialogue |
ResponseTimeoutError |
le poêle n'a pas répondu dans le délai imparti |
ProtocolError |
réponse illisible, ou phase inconnue |
Le client ne se reconnecte jamais tout seul : il ne conserve aucun état, et la politique de reprise appartient à l'appelant. Une connexion perdue reste perdue — ouvrez un nouveau client.
Requêtes brutes
Les requêtes documentées mais non exposées par une méthode typée — les séries de mesures, les versions du micrologiciel — restent joignables :
await stove.get("_wversion") # '1.4'
await stove.get("appP30Tx") # '30'
await stove.get("appP30T[15;29]") # '41;40;40;40;40;39;...'
Les noms sont listés dans docs/SPEC-PROTOCOLE-WS.md.
Essayer sans écrire de code
uv run demo.py 192.168.1.165 # tableau rafraîchi en continu
uv run demo.py 192.168.1.165 --once # une seule lecture
uv run demo.py 192.168.1.165 --request _wversion # une requête brute, répétable
uv run demo.py 192.168.1.165 --debug # afficher le dialogue WebSocket
Exemple de sortie :
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┓
┃ parameter ┃ value ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━┩
│ Last update │ 09/21/26 - 08:51:12 │
│ Phase │ heating up (1) │
│ Temperature (°C) │ 163.3 │
│ Heat-up (%) │ 53.5 │
│ Performance (%) │ — │
└──────────────────┴───────────────────────┘
Logging
La bibliothèque utilise le module logging standard et ne configure rien : ni handler, ni
niveau, ni format. C'est l'application hôte qui décide. Chaque module a son logger, nommé
d'après le paquet — pyhaseiq.client — ce qui permet de filtrer au paquet entier comme au
module.
Tout est en DEBUG : l'ouverture de la connexion et chaque couple requête / réponse. Les
erreurs ne sont pas loguées, elles sont levées ; c'est à l'appelant de décider ce qu'il en
fait.
Dans Home Assistant, via configuration.yaml :
logger:
logs:
pyhaseiq: debug
En script autonome :
import logging
logging.basicConfig(level=logging.DEBUG)
Exemple de trace :
DEBUG pyhaseiq.client: connecting to ws://192.168.1.165:8080
DEBUG pyhaseiq.client: appPhase = 1
DEBUG pyhaseiq.client: appT = 163.3
DEBUG pyhaseiq.client: appAufheiz = 53.5
Le poêle n'expose ni identifiant, ni clé, ni donnée personnelle : une trace DEBUG peut être
jointe telle quelle à un rapport de bug.
Développement
uv run ruff check . # lint
uv run ruff format . # formatage
uv run pytest # tests — aucun matériel requis, le poêle est simulé
Contribuer
Les retours sont bienvenus, en particulier sur d'autres modèles de poêles et sur la
génération pilotée par l'application HASE iQ, jamais observée.
- Signaler un bug ou proposer une évolution — ouvrir une issue, en précisant l'application avec laquelle vous pilotez habituellement votre poêle.
- Proposer du code — périmètre, conventions et interdits sont décrits dans CONTRIBUTING.md, à lire avant d'ouvrir une pull request.
Sécurité
Le poêle expose un WebSocket non chiffré et sans aucune authentification sur le port
8080 : toute machine de votre réseau local peut l'interroger. Ce n'est pas un choix de cette
bibliothèque, c'est ainsi que le poêle est conçu.
N'exposez jamais ce port sur Internet, et ne le redirigez pas depuis votre box. Laissez le poêle sur le réseau local, derrière votre routeur.
Pour signaler une faille dans cette bibliothèque, utilisez le signalement privé — jamais une issue publique.
Metadata
Release files for pyhaseiq 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyhaseiq-0.1.0.tar.gz | 50.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyhaseiq-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 64.1 kB
Release files / pyhaseiq-0.1.0.tar.gz
| Download URL | pyhaseiq-0.1.0.tar.gz |
|---|---|
| Size | 50.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a29e997413447ef7725d9c2070fa9f6debeff75a0273294e6571bb0e349c4d55
|
|
BLAKE2b-256 checksum How to use checksums |
573f7d03d9b72468662cbcf3515521f4b85dbb78d7fd25a457a09f2c378f9773
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / pyhaseiq-0.1.0-py3-none-any.whl
| Download URL | pyhaseiq-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2d86e43b9e1b39296213c3cc93492263175d6c84d08d18202d49540d7de865da
|
|
BLAKE2b-256 checksum How to use checksums |
fed4ff57632a1bb79d2188d8988433842bafbbecb84457a5b1592dcee6a660f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log