Lave-linge et capteur de vibration

J'avais une prise Z-Wave sur mon lave linge afin de suivre sa consommation et surtout d'être notifié a la fin du cycle.
Malheureusement cette prise a rendu l'âme et j'ai cherché une solution de remplacement pour continuer à être notifié en fin de cycle.
On m'a soufflé que les capteurs de vibration Xiaomi Aqara pourraient répondre à ce besoin.

On va voir comment les utiliser.

Configuration dans Zigbee2MQTT

Le capteur de vibration s'inclus rapidement dans Zigbee2MQTT après avoir pressé le bouton d'inclusion.

J'ai choisi le capteur DJT11LM qui en plus de détecter les vibrations permet de choisir un niveau de sensibilité et repérer d'autres types de mouvement (drop et tilt).

La première étape dans mon cas a été de régler la sensibilité à high afin d'être sur que les vibrations soient bien détectées. Suivant votre machine, cela ne sera peut être pas nécessaire :

mosquitto_pub -t "zigbee2mqtt/lave_linge/set" -h localhost -m '{"sensitivity": "high"}'

On secoue le capteur, la vibration est bien détectée :

info  2021-01-03 09:20:32: MQTT publish: topic 'zigbee2mqtt/vibration_lave_linge', payload '{"action":"vibration","angle":5,"angle_x":2,"angle_x_absolute":88,"angle_y":78,"angle_y_absolute":12,"angle_z":11,"battery":97,"linkquality":54,"strength":18,"voltage":2995}'

Plus qu'a installer le capteur sur la machine à laver !

Configuration Node-RED

Le fonctionnement est le suivant :

  • Via un node mqtt in, je souscris au topic correspondant à mon capteur de vibration
  • Si payload.action vaut vibration je lance un compteur pour 10 prochaines minutes pour compter ces vibrations
  • Je vérifie à la fin de ces 10 minutes que msg.count est supérieur à 5. Si c'est le cas, je considère que le lave linge est démarré et qu'un cycle est en cours
  • Avec un node trigger, je positionne un timer à 10 minutes en ayant coché extend delay if new message arrives. Lorsqu'il n'y aura plus de vibration détectée pendant 10 minutes, le trigger s'exécutera et une notification sera envoyé via un node Pushover.

Les valeurs sont probablement à adapter, mais dans mon cas cela me permet de détecter quasiment à chaque fois la fin d'un cycle (sauf dans le cas d'un cycle très court).

Le flow associé :

[
    {
        "id": "ac75c24c.7f1cd",
        "type": "mqtt in",
        "z": "6f571665.ded7f8",
        "name": "Zigbee2MQTT",
        "topic": "zigbee2mqtt/lave_linge",
        "qos": "1",
        "datatype": "json",
        "broker": "1949a812.2568e8",
        "x": 110,
        "y": 2620,
        "wires": [
            [
                "2f7f8fb6.a2127"
            ]
        ]
    },
    {
        "id": "2f7f8fb6.a2127",
        "type": "switch",
        "z": "6f571665.ded7f8",
        "name": "Check state",
        "property": "payload.action",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "vibration",
                "vt": "str"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 1,
        "x": 270,
        "y": 2620,
        "wires": [
            [
                "7e11dabf.d7e044"
            ]
        ]
    },
    {
        "id": "53a803e1.4d179c",
        "type": "pushover api",
        "z": "6f571665.ded7f8",
        "keys": "ba2429f8.075b98",
        "title": "Lave linge",
        "name": "Notification",
        "x": 830,
        "y": 2620,
        "wires": []
    },
    {
        "id": "7e11dabf.d7e044",
        "type": "timed-counter",
        "z": "6f571665.ded7f8",
        "name": "Count",
        "timelimit": "10",
        "timeunit": "60000",
        "withhold": false,
        "fixedtimeout": false,
        "pertopic": false,
        "x": 410,
        "y": 2620,
        "wires": [
            [
                "3d4f8a35.23dc5e"
            ]
        ]
    },
    {
        "id": "3d4f8a35.23dc5e",
        "type": "switch",
        "z": "6f571665.ded7f8",
        "name": "Check count",
        "property": "count",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gte",
                "v": "5",
                "vt": "num"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 1,
        "x": 550,
        "y": 2620,
        "wires": [
            [
                "26e4a714.a23298"
            ]
        ]
    },
    {
        "id": "26e4a714.a23298",
        "type": "trigger",
        "z": "6f571665.ded7f8",
        "name": "Wait",
        "op1": "",
        "op2": "Cycle lave linge terminé !",
        "op1type": "nul",
        "op2type": "str",
        "duration": "10",
        "extend": true,
        "units": "min",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 690,
        "y": 2620,
        "wires": [
            [
                "53a803e1.4d179c"
            ]
        ]
    },
    {
        "id": "1949a812.2568e8",
        "type": "mqtt-broker",
        "name": "Mosquitto",
        "broker": "192.168.0.47",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closeRetain": "false",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": ""
    },
    {
        "id": "ba2429f8.075b98",
        "type": "pushover-keys",
        "name": "Pushover-Domoticz"
    }
]