Bituo Technik SPM01 Capteur consommation Zigbee sous Zigbee2Mqtt

Salut à tous,
J’ai acheté des sensors Zigbee Bituo Technik SPM01-D2TZ-U01 et SPM02-D2TZ-U01 qui permettent de mesurer différentes informations sur l’éléctricité.
Je suis sous Zigbee2Mqtt.
J’ai pu ajouter les sensors sans problèmes.

Mon problème

Par contre, je n’arrive pas à avoir de valeurs pour la somme d’énergie consommée qui reste à null :

"energy": null,
"produced_energy": null

Les autres entités remontent bien des valeurs :

"ac_frequency": 49.94,
"current": 3.93,
"linkquality": 51,
"power": 0.91,
"power_apparent": 0.923,
"power_factor": 0.98,
"power_reactive": 0,
"voltage": 234.73,

Sur les 6 capteurs que j’ai achetés, j’ai le même problème. J’ai un appareillage similaire de chez Schneider et tout remonte sans problème. Aucun doutes que plusieurs dizaines de Kwh ont été consommés avec ces capteurs installés et que je devrais donc avoir des valeurs.
Est-ce que cela peut-être un problème de ma configuration ?

Ma configuration


[center]## System Information

version core-2024.4.4
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.2
os_name Linux
os_version 6.1.73-haos-raspi
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.34.0
Stage running
Available Repositories 1477
Downloaded Repositories 19
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 12.2
update_channel stable
supervisor_version supervisor-2024.04.0
agent_version 1.6.0
docker_version 25.0.5
disk_total 116.8 GB
disk_used 9.6 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Duck DNS (1.17.0), File editor (5.8.0), Let’s Encrypt (5.0.18), Samba share (12.3.1), Spotify Connect (0.13.0), FTP (5.0.2), deCONZ (6.23.0), VLC (0.3.0), Home Assistant Google Drive Backup (0.112.1), RPi Temp Monitor (0.4), Mosquitto broker (6.4.0), Frigate (0.13.2), eWeLink Smart Home (1.4.3), Zigbee2MQTT (1.36.1-1), Terminal & SSH (9.13.0), Zigbee2MQTT Edge (edge)
Dashboards
dashboards 4
resources 10
views 8
mode storage
Recorder
oldest_recorder_run 23 avril 2024 à 05:26
current_recorder_run 28 avril 2024 à 18:38
estimated_db_size 448.00 MiB
database_engine sqlite
database_version 3.44.2
[/center] ___

Bonjour, vous avez trouvé comment avoir les sommes d’énergies ?

Bonjour,
Normalement il y a eu une mise à jour Zigbee2Mqtt qui règle le problème.
J’ai utilisé un script de compensation en attendant la mise à jour qui réglait le problème.
Est-ce que tu as un problème ?

Bonjour, merci pour ton retour.

J’avais des « Sans valeurs »

J’ai mis à jour suivant : https://github.com/Koenkk/zigbee2mqtt/issues/19705 mais il doit y avoir un problème de virgule car mon four ne consomme vraiment pas grand chose d’après les données.

Quand tu dis que tu as mis à jour, tu as fait quoi ?
De mon coté, c’est la mise en place du custom_adapter indiqué dans le sujet que tu partages qui a réglé le problème. Mais quelques jour après, j’avais vu le log de la mise à jour de Zigbee2mqtt qui disait intégrer ce que fait le custom_adapter. De mon coté, je l’ai laissé, et ça marche toujours.

J’avais le même problème qui s’est réglé par la mise à jour de Zigbee2MQTT.
Par contre, comme toi j’ai un problème sur les puissances (en W, VA, VAR) d’un facteur 1000 : il y a une virgule qui ne devrait pas être là ou alors la mesure devrait être indiqué en kW. Je n’ai pas ce problème sur l’énergie ou j’ai bien la valeur en kWh.
Je ne sais pas comment régler le problème ?
Si quelqu’un a une solution je suis preneur. Merci.

Bonjour,

Dans /homeassistant/zigbee2mqtt/configuration.yaml j’ai rajouté à la fin

external_converters:
  - SPM01X001.js

Dans /homeassistant/zigbee2mqtt/ j’ai créer le fichier SPM01X001.js

const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const utils = require('zigbee-herdsman-converters/lib/utils');
const e = exposes.presets;

const energy_metering = {
    cluster: 'seMetering',
    type: ['attributeReport'],

    convert: (model, msg, publish, options, meta) => {
        if (utils.hasAlreadyProcessedMessage(msg, model)) return;
        const payload = {};
        if (msg.data.hasOwnProperty('currentSummDelivered')) {
            const data = msg.data['currentSummDelivered'];
            const value = (parseInt(data[0]) << 32) + parseInt(data[1]);
            payload.energy = value / 100;
        }
        if (msg.data.hasOwnProperty('currentSummReceived')) {
            const data = msg.data['currentSummReceived'];
            const value = (parseInt(data[0]) << 32) + parseInt(data[1]);
            payload.produced_energy = value / 100;
        }
        return payload;
    }
}

const definition = {
    zigbeeModel: ['SPM01X001'],
    model: 'SPM01-D2TZ-U01',
    vendor: 'BITUO TECHNIK',
    description: 'Smart Energy Sensor',
    fromZigbee: [fz.electrical_measurement, energy_metering],
    toZigbee: [],
    exposes: [e.power(), e.current(), e.voltage(), e.ac_frequency(), e.power_factor(), e.power_apparent(), e.power_reactive(), e.energy(), e.produced_energy()], // e.energy(), e.produced_energy()
    configure: async (device, coordinatorEndpoint, logger) => {
        const endpoint = device.getEndpoint(1);
        await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
		await reporting.readMeteringMultiplierDivisor(endpoint);
        await reporting.readEletricalMeasurementMultiplierDivisors(endpoint, readFrequencyAttrs=true); // , readFrequencyAttrs=true
        endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', { acPowerDivisor: 1, acPowerMultiplier: 1 }); // Power seems to be transmitted as kW with divisor 
    },
};

module.exports = definition;

Ainsi tu peux jouer sur value/1000 → value/100

@lepalois Dans le script que tu proposes, c’est pour corriger energy et produced_energy, qui pour moi sont réglés depuis la dernière mise à jour (peut-être qu’il faut réinitialiser les capteurs pour que cela s’applique). En tous cas, j’ai dû supprimer les « converters » car sinon j’avais des valeurs beaucoup trop élevées, et maintenant c’est cohérent.
Par contre, je constate comme @Kiki256 que power, power_apparent et power_reactive qui sont 1000 fois trop petites. Est-ce que vous avez un converter pour ces valeurs ?

Salut,
J’ai régulièrement un pic de consommation anormal sur chacun de mes capteurs et je viens de comprendre la raison. Un bref instant l’entité « energy » (utilisée dans le dashboard Energie) revient à 0 et se remet immédiatement à son cumul. Sauf que le dashboard energie comprend qu’il a une consommation égale à la somme de energy depuis le début (voir mes captures pour mieux comprendre). Est-ce que d’autres ont le même problème ? Est-ce que vous avez une solution à me conseiller ?
imageimage

Hello Même probleme, les puissance sont divisées par 1000, en changeant l’unité rien y fait . Tu as trouvé ?

J’ai fait ce qu’indique nicolinuxfr sur [New device support]: Add SPM01-D2TZ-U01 · Issue #19705 · Koenkk/zigbee2mqtt · GitHub
Ca marche pour quasiment tous mes capteurs sauf un que je n’arrive pas à faire remonter. C’est du temporaire, mais j’ai pas l’impression que les problèmes de ces capteurs soient bien suivis.

Pour ceux que cela intéresse, j’ai également un autre problème avec ces capteurs car j’ai des micro-coupures de l’entité Energie, et cela ajoute la consommation totale du capteur dans le tableau de bord énergie. Exemple, vous consommez 0.3 kWh sur les 10 dernières minutes, mais à cause d’une micro-coupure de la liaison Zigbee, cela va vous faire une consommation de 357 kWh (le total mesuré depuis le début du capteur). Et je peux avoir ce problème plusieurs fois par jour.
La solution que j’ai retenue est de créer une nouvelle entité par un template qui enregistre que dans le cas où la variation est modérée.

Pour créer cette entité

  1. Dans « Paramètres », choisir « Appareils et services », puis « Entrées », « Créer une entrée »
  2. Choisir « Template »
  3. Choisir « Modéliser un capteur »
  4. Compléter le nom, l’unité de mesure avec kWh, la classe d’appareil avec « energy », classe d’état avec « Total » et l’appareil dont on va récupérer l’entité energy
  5. Dans le modèle d’état :
{% set current_value = states('sensor.NOM_DU_SENSOR_energy') | float %}
          {% set previous_value = states('sensor.NOM_DU_SENSOR_energy_cumul_1') | float(0) %}
          
          {% if previous_value == 0 %}
            {{ current_value }}
          {% else %}
            {% set variation = (current_value - previous_value) / previous_value * 100 %}
            {% if variation < 10 %}
              {{ current_value }}
            {% else %}
              {{ previous_value }}
            {% endif %}
          {% endif %}

Il faut remplacer : sensor.NOM_DU_SENSOR_energy par l’entité Energie consommée de notre appareil Bituo.