Mise à l'heure Heiman CO2

Bonjour,

Je viens de basculer sur Z2M, non sans difficulté pour l’appairage de certains modules, principalement les SNZB-02, qui ne s’appairent pas complétement.
Mais mon post est surtout concernant le détecteur de CO2 Heiman (HS3AQ), sur le plugin zigbee il y avait la possibilités de le mettre à l’heure, je ne retrouve pas cette option sur Z2M ce qui est un peu dérangeant car l’afficghage s’active celon l’heure.
Quelqu’un aurait la solution
Merci

Bonjour
Que dit la doc zigbee2mqtt sur ce module ?

Il ne parle pas de l’heure sur la doc mqtt,

Sur le plugin zigbee il y a avait un bouton mettre a l’heure.

Oui sur le plugin il y en avait un mais la c’est pas le meme plugin et si le moteur le support pas je peux mettre un bouton ca ne servira pas a grand chose… la faudrait poser la question sur leur github et peut être faire une recherche avant tu dois pas etre le premier avec ce soucis

Bonjour à tous
Je reprend mon pb, car toujours impossible de mettre le module à l’heure malgré plusieurs post sur le github de Z2m.
J’ai pu voir que sur le module sous l’onglet « binding » on retrouve « Gentime »


Mais a priori personne n’a réussi à en faire quoique ce soit.
Quelqu’un aurait il une idée.

Bonjour,

Je suis dans le même cas depuis le passage à Z2M : des mois et des mois que je cherche comment mettre à l’heure automatiquement ce fichu afficheur CO², mais partout où je passe tout le monde pose la question et personne n’apporte de réponse :frowning:

J’ai fini par arriver à qqch de fonctionnel mais malheureusement manuel :

Déterminer le nombre de secondes écoulées depuis 00h00 :
Windows (PowerShell) :

$now = Get-Date
$midnight = Get-Date -Hour 0 -Minute 0 -Second 0
[timespan]$diff = $now - $midnight
$diff.TotalSeconds

Linux (bash) :

echo $(( $(date +%s) - $(date -d "00:00" +%s) ))

Ensuite aller écrire l’offset de la timezone à 0 et le nombre de secondes écoulées obtenu précédemment, comme suit dans Z2M :


(cliquer sur « Write » une fois les chiffres renseignés)

Nota : je mets la TZ à 0, car si je la met à 3600 (+1h) ou 7200 (+2h), ça finit toujours pas m’ajouter un offset dans l’afficheur au bout de quelques heures et je sais pas pourquoi.


Je n’ai pas réussi à en faire un scénario, je n’arrive pas à comprendre comment fonctionne l’envoi de commandes Zigbee en code :cry:

Si jamais un plus doué que moi en programmation (ça peut pas être pire LOL) passe par ici et sait faire, je veux bien un petit coup de main SVP, ça aidera tous les possesseurs de ce capteur :wink:

Génial, merci beaucoup ! J’attendais une solution de la communauté depuis des mois !
En espérant maintenant, tout comme toi, que quelqu’un arrivera à intégrer la solution via un scénario !
Encore merci @LMQT !

1 « J'aime »

Moi aussi car l’affichage est inutilisable sinon : chez moi l’heure se décale de 5’ par jour environ.

Y’a pas un pro du ZigBee Z2M par ici qui sait comment programmer des commandes dans un scénario ? Please please please :grin:

Salut,

Super, merci pour l’infos, cela fonctionne.
Maintenant en effet si une âme charitable qui a les compétence pouvez nous compiler un petit truc ça serait top.

En passant les logs zigbee2mqtt en debug, il y a moyen de voir comment le cluster genTime est adressé. Et de là en déduire une possible commande à rajouter dans l’équipement sur z2m. Faire un scénario qui utilisera cette commande en poussant la différence de secondes.

En essayant un read puis un write sur « TimeZone », j’obtiens ça dans les logs de Z2M :

info 2025-01-11 16:08:07`zhc:tz: Read result of 'genTime': {"timeZone":0}`
info 2025-01-11 16:08:09`zhc:tz: Wrote '{"timeZone":0}' to 'genTime'`

et dans le log Z2M du plugin Jeedom :

[2025-01-11 16:08:03] e[34mdebuge[39m: 	z2m:mqtt: Received MQTT message on 'zigbee2mqtt/[Salle à manger][Capteur CO2]/1/set' with data '{"read":{"attributes":["timeZone"],"cluster":"genTime","options":{}}}'
[2025-01-11 16:08:03] e[34mdebuge[39m: 	zh:controller:endpoint: ZCL command 0x84fd27fffe07f617/1 genTime.read(["timeZone"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"reservedBits":0,"writeUndiv":false})
[2025-01-11 16:08:03] e[34mdebuge[39m: 	z2m: Received Zigbee message from '[Salle à manger][Capteur CO2]', type 'readResponse', cluster 'genTime', data '{"timeZone":0}' from endpoint 1 with groupID 0
[2025-01-11 16:08:03] e[34mdebuge[39m: 	z2m: Received Zigbee message from '[Salle à manger][Capteur CO2]', type 'readResponse', cluster 'genTime', data '{"timeZone":0}' from endpoint 1 with groupID 0
[2025-01-11 16:08:03] e[32minfoe[39m: 	zhc:tz: Read result of 'genTime': {"timeZone":0}
[2025-01-11 16:08:05] e[34mdebuge[39m: 	z2m:mqtt: Received MQTT message on 'zigbee2mqtt/[Salle à manger][Capteur CO2]/1/set' with data '{"write":{"cluster":"genTime","options":{},"payload":{"timeZone":0}}}'
[2025-01-11 16:08:05] e[34mdebuge[39m: 	zh:controller:endpoint: ZCL command 0x84fd27fffe07f617/1 genTime.write({"timeZone":0}, {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"reservedBits":0,"writeUndiv":false})
[2025-01-11 16:08:05] e[32minfoe[39m: 	zhc:tz: Wrote '{"timeZone":0}' to 'genTime'

est-ce que ça peut aider ?

essayez de créer une commande comme ceci :

avec json::{"timeZone":#slider#} ou json::{"genTime":{"timeZone":#slider#}}

Hello,

ça ne fonctionne avec aucune des deux commandes, voici ce que j’obtiens dans le log Z2M :

error <small>2025-01-12 11:56:29</small>`z2m: No converter available for 'timeZone' (3600)`
error <small>2025-01-12 11:57:07</small>`z2m: No converter available for 'genTime' ({"timeZone":3600})`

Edit :
J’ai aussi essayé la méthode du sous-topic décrite dans la doc Jeedom-Z2M, mais ça ne marche pas mieux (erreur identique), ou bien je n’ai pas compris comment il fallait faire :

Effectivement ça suit la logique de la doc et c’est sensé utiliser le topic set de l’équipement…
Serait-il possible d’avoir le json des infos brutes de l’équipement ? (via le bouton configuration du module)

Sinon il reste la solution de créer cette commande via le plugin Mqtt manager.

Voici le json brut :

{
    "date_code": "2021.06.29",
    "definition": {
        "description": "Smart air quality monitor",
        "exposes": [
            {
                "access": 1,
                "description": "The measured CO2 (carbon dioxide) value",
                "label": "CO2",
                "name": "co2",
                "property": "co2",
                "type": "numeric",
                "unit": "ppm"
            },
            {
                "access": 1,
                "category": "diagnostic",
                "description": "Remaining battery in %, can take up to 24 hours before reported",
                "label": "Battery",
                "name": "battery",
                "property": "battery",
                "type": "numeric",
                "unit": "%",
                "value_max": 100,
                "value_min": 0
            },
            {
                "access": 1,
                "description": "Measured relative humidity",
                "label": "Humidity",
                "name": "humidity",
                "property": "humidity",
                "type": "numeric",
                "unit": "%"
            },
            {
                "access": 1,
                "description": "Measured temperature value",
                "label": "Temperature",
                "name": "temperature",
                "property": "temperature",
                "type": "numeric",
                "unit": "\u00b0C"
            },
            {
                "access": 1,
                "category": "diagnostic",
                "description": "Link quality (signal strength)",
                "label": "Linkquality",
                "name": "linkquality",
                "property": "linkquality",
                "type": "numeric",
                "unit": "lqi",
                "value_max": 255,
                "value_min": 0
            }
        ],
        "model": "HS3AQ",
        "options": [
            {
                "access": 2,
                "description": "Calibrates the co2 value (absolute offset), takes into effect on next report of device.",
                "label": "Co2 calibration",
                "name": "co2_calibration",
                "property": "co2_calibration",
                "type": "numeric"
            },
            {
                "access": 2,
                "description": "Calibrates the humidity value (absolute offset), takes into effect on next report of device.",
                "label": "Humidity calibration",
                "name": "humidity_calibration",
                "property": "humidity_calibration",
                "type": "numeric"
            },
            {
                "access": 2,
                "description": "Number of digits after decimal point for humidity, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
                "label": "Humidity precision",
                "name": "humidity_precision",
                "property": "humidity_precision",
                "type": "numeric",
                "value_max": 3,
                "value_min": 0
            },
            {
                "access": 2,
                "description": "Calibrates the temperature value (absolute offset), takes into effect on next report of device.",
                "label": "Temperature calibration",
                "name": "temperature_calibration",
                "property": "temperature_calibration",
                "type": "numeric"
            },
            {
                "access": 2,
                "description": "Number of digits after decimal point for temperature, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
                "label": "Temperature precision",
                "name": "temperature_precision",
                "property": "temperature_precision",
                "type": "numeric",
                "value_max": 3,
                "value_min": 0
            }
        ],
        "supports_ota": false,
        "vendor": "HEIMAN"
    },
    "description": "[Salle \u00e0 manger][Capteur CO2]",
    "disabled": false,
    "endpoints": {
        "1": {
            "bindings": [
                {
                    "cluster": "msRelativeHumidity",
                    "target": {
                        "endpoint": 1,
                        "ieee_address": "0x00212effff098e0e",
                        "type": "endpoint"
                    }
                },
                {
                    "cluster": "genPowerCfg",
                    "target": {
                        "endpoint": 1,
                        "ieee_address": "0x00212effff098e0e",
                        "type": "endpoint"
                    }
                },
                {
                    "cluster": "msTemperatureMeasurement",
                    "target": {
                        "endpoint": 1,
                        "ieee_address": "0x00212effff098e0e",
                        "type": "endpoint"
                    }
                },
                {
                    "cluster": "msCO2",
                    "target": {
                        "endpoint": 1,
                        "ieee_address": "0x00212effff098e0e",
                        "type": "endpoint"
                    }
                }
            ],
            "clusters": {
                "input": [
                    "genBasic",
                    "genPowerCfg",
                    "genIdentify",
                    "genAlarms",
                    "genTime",
                    "msTemperatureMeasurement",
                    "msRelativeHumidity",
                    "msCO2",
                    "haDiagnostic",
                    "heimanSpecificAirQuality"
                ],
                "output": [
                    "genTime",
                    "genOta"
                ]
            },
            "configured_reportings": [
                {
                    "attribute": "measuredValue",
                    "cluster": "msTemperatureMeasurement",
                    "maximum_report_interval": "300",
                    "minimum_report_interval": "1",
                    "reportable_change": "10"
                },
                {
                    "attribute": "batteryPercentageRemaining",
                    "cluster": "genPowerCfg",
                    "maximum_report_interval": "720",
                    "minimum_report_interval": "60",
                    "reportable_change": "0"
                },
                {
                    "attribute": "measuredValue",
                    "cluster": "msRelativeHumidity",
                    "maximum_report_interval": "300",
                    "minimum_report_interval": "1",
                    "reportable_change": "10"
                },
                {
                    "attribute": "measuredValue",
                    "cluster": "msCO2",
                    "maximum_report_interval": 300,
                    "minimum_report_interval": 1,
                    "reportable_change": 5.0e-5
                }
            ],
            "scenes": []
        },
        "242": {
            "bindings": [],
            "clusters": {
                "input": [],
                "output": [
                    "greenPower"
                ]
            },
            "configured_reportings": [],
            "scenes": []
        }
    },
    "friendly_name": "[Salle \u00e0 manger][Capteur CO2]",
    "ieee_address": "0x84fd27fffe07f617",
    "interview_completed": true,
    "interviewing": false,
    "manufacturer": "HEIMAN",
    "model_id": "HS3AQ-EFA-3.0",
    "network_address": 28494,
    "power_source": "DC Source",
    "supported": true,
    "type": "Router"
}

Il faut mettre quoi comme syntaxe exacte dans une commande MQTT Manager ?

Il faut créer un équipement et lui mettre en topic racine zigbee2mqtt/[Salle \u00e0 manger][Capteur CO2]

Après en commande action c’est plus simple. le 1er champ c’est le chemin du topic de l’équipement à adresser, et le 2nd c’est la data à envoyer.

On peut tenter ceci en se basant sur les logs :
topic : 1/set
msg : json::{"write":{"cluster":"genTime","options":{},"payload":{"timeZone":0}}}

1 « J'aime »

J’ai essayé plusieurs choses en me basant sur un autre équipement MQTT Manager qui fonctionne (une sirène), puis la commande que tu m’indiques => aucune ne fonctionne :frowning:

15785 = z2m: No converter available for 'genTime' ({"timeZone":7200})
15792 = z2m: No converter available for 'genTime' ({"timeZone":7200})
15797 = aucun message dans le log, mais pas d’action non plus.

Alors j’ai testé ta commande mais dans le plugin Z2M plutôt, car le « json:: » devant m’interpellait pour le plugin MQTT Manager.

Du coup ça fonctionne !!! Merci beaucoup :slight_smile:
Pour l’heure => json::{"write":{"cluster":"genTime","options":[],"payload":{"time":1800}}}
Pour la zone => json::{"write":{"cluster":"genTime","options":[],"payload":{"timeZone":#select#}}}

Me reste plus qu’à trouver comment envoyer l’heure en nombre de secondes depuis minuit maintenant, ça va être une autre histoire ça encore :joy:

1 « J'aime »

La 3ème doit échouée à cause du format.
Il faudrait conserver le chemin entier comme les 2 autres, mais avec le 1/set.
La capture ne ressemble pas à un équipement mqtt manager, on dirait jMQTT non ?
Si c’est bien jMQTT, pas la peine de luis préciser json:: je crois

Tant mieux si ça passe directement sur l’équipement z2m, ça m’aurait étonné du contraire.
Pour ce qui est du calcul des secondes depuis minuit, c’est pas bien compliqué dans les scénarios en utilisant les tags : https://doc.jeedom.com/fr_FR/core/4.5/scenario?theme=dark#Les%20tags