SONOFF ZBMINIL2 - différencier la valeur statut lors d'une action manuelle sur l'interrupteur

Bonjour,

Mon problème

SONOFF ZBMINIL2
Utilisation hybride (manuel/Automatique).
Récupérer l’info lors de l’usage manuel.

Ma configuration


  • core-2024.10.2
  • Home Assistant OS 13.2
  • Zigbee2MQTT (1.40.2-1)

Bonjour,

Dans le cadre de l’implémentation d’un scenario de détection de mouvement sur un éclairage extérieurs. J’ai installé un contrôleur ZBMINIL2 mis derrière un interrupteur (bistable).

Il fonctionne très bien et HA remonte bien le statut à partir des infos mqtt :
The current state of this switch is in the published state under the state property (value is ON or OFF ) (SONOFF ZBMINIL2 control via MQTT | Zigbee2MQTT)

Donc cela marche parfaitement dans un cas simple, où je l’associe à un détecteur de mouvement et c’est HA qui contrôle le switch derrière l’interrupteur en fonction de la valeur du statut a ON ou OFF.

Par contre si j’appuie sur l’interrupteur le statut passe à ON mais il m’est impossible de savoir dans HA si ce ON est lié à un script de détection de mouvement ou au bouton interrupteur ?

Toutefois dans le journal de HA l’entrée est différente (pas le même texte et pas de user Supervisor).
Est-il possible d’enregistrer une variable ou détecter lorsque l’on est dans un appui manuel pour éviter d’éteindre quand il y a plus de mouvement ?

Je vous remercie.

Salut
Sujet abordé il n’y a pas si longtemps mais je serai incapable de t’en donné le titre.
De mémoire @BBE avait proposé une solution.

1 « J'aime »

J’ai un automatisme qui marche dans ma description pour gérer automatisme et controle manuel.

Il faut soit des booléens, soit jouer avec le timer.

Tu ne peux pas détecter l’appui manuel… par contre tu peux faire l’inverse et détecter l’allumage automatique…

J’ai trouvé un sujet qui pourrait faire la distinction mais je n’ai pas encore compris le code.

en tout cas ma solution marche…

Ca tourne depuis des années chez nous…

1 « J'aime »

On va dire que ca fonctionne quasiment :wink:

Il me reste le cas de l’allumage via interrupteur alors qu’il y a du mouvement détecté !
Pas trouvé l’idée encore.

J’avoue que je ne comprend rien à NR…

Difficile de t’aider dans ce cadre mais:
D’un point de vue théorique (NodeRed ou autre le principe reste valide):

  • 1/ soit tu utilises des ressources complexes pour détecter tes appuis boutons (et dashboard tant qu’à faire car c’est du manuel aussi) pour créer un booléen « mode manuel » qui interdit le mode auto par le détecteur de mouvement lorsque la lumière a été allumée en manuel. (perso, avec le même module que toi, je n’ai pas réussi à séparer les appui boutons, les commandes dashboard et les commandes via les automatisations.)

  • 2/ soit tu active un booléen « mode auto » lorsque c’est l’automatisme qui déclenche et auquel cas il faut:

    • remettre le booléen à « false » dès que la lampe est eteinte, quel que soit le moyen de l’éteindre
    • il faut interdire à l’automatisme d’éteindre lorsque ce booléen est « false ».
    • Il faut interdire à l’automatisme d’allumer si il y a detection, que la lumière est déjà allumée et que le booléen sur ‹ false › (cas de l’allumage manuel)

A première vue, je ne vois pas ça dans tes automatisations (mais je suis une bille en NodeRed :rofl:)

Là encore suivant les deux cas décrit au dessus:

  • 1/ soit tu utilises des ressources complexes pour détecter tes appuis boutons (et dashboard tant qu’à faire car c’est du manuel aussi) pour créer un booléen « mode manuel » qui interdit le mode auto par le détecteur de mouvement lorsque la lumière a été allumée en manuel.
    => dans ce cas tu peux basculer ton booléen à « true » lorsque tu détecte un allumage par le bouton et ainsi interdire à l’automatisme d’éteindre, ou faire comme sur le cas en dessous.

  • 2/ soit tu active un booléen « mode auto » lorsque c’est l’automatisme qui déclenche
    => dans ce cas, si la lumière est allumée automatiquement mais que tu veux qu’elle reste allumée, il faut au bouton: éteindre puis rallumer pour « désactiver » le mode auto qui a été activé au premier allumage.

Personnellement j’utilise le cas no2, avec une petite variante. Au lieu d’utiliser un booléen, je lance un timer. Et c’est l’état du timer que je viens tester:

  • timer ‹ actif › = booléen « mode auto » ‹ true ›
  • timer ‹ off › = booléen « mode auto » ‹ false ›

Bonjour tout le monde,

Alors je vais ajouter mon grain de sel même si je ne sais pas si cela peut être utile.
Mais avez-vous essayé de détecter l’event du call_service pour détecter toute action manuelle sur HA ?

Avec l’interrupteur physique, l’état de l’entité change sans générer ce call_service.

Salut

Si tu as un exemple n’hésite pas. De mon côté j’ai regardé vite fait les évents mais j’ai pas encore tout compris.

C’est bon ! solution opérationnelle :grin:

@BBE : oui le booléen était déjà dans la solution : input_booleen qui modifie la variable helper dans HA. (facile avec Node Red).

@ArminasTV : très bonne idée merci bcp.

J’ai utilisé le event all pour surveiller uniquement les state_changed en filtrant sur l’entity switch du micromodule !
Puis un switch pour verifier le context et filtrer les event qui n’ont pas de user_id ! Et voila !

Le résultat est parfait tout fonctionne comme voulu et l’interrupteur physique permet de forcer l’état des luminaires Terrasse en contrôlant ou non la détection de mouvement.

Merci pour vos idées.

[{"id":"daeb3e2167eb6afe","type":"api-call-service","z":"dfaf3ee676ee5dd3","name":"Lumieres terrasse - On","server":"2a98b88a.a75098","version":7,"debugenabled":false,"action":"switch.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["switch.interrupteur_lumieres_exterieures_cuisine"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"switch","service":"turn_on","x":1360,"y":200,"wires":[[]]},{"id":"b9012222ced9ec40","type":"api-call-service","z":"dfaf3ee676ee5dd3","name":"Lumieres terasse - Off","server":"2a98b88a.a75098","version":7,"debugenabled":false,"action":"switch.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["switch.interrupteur_lumieres_exterieures_cuisine"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"switch","service":"turn_off","x":1360,"y":300,"wires":[[]]},{"id":"45a6679f8d311fed","type":"comment","z":"dfaf3ee676ee5dd3","name":"Eclairage Terasse (Auto)","info":"","x":190,"y":120,"wires":[]},{"id":"c6a66387b609bff1","type":"server-state-changed","z":"dfaf3ee676ee5dd3","name":"Mouvement Terrasse","server":"2a98b88a.a75098","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["binary_sensor.detecteur_mouvement_terrasse_occupancy"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":200,"wires":[["9b464c7095659e7f"]]},{"id":"36b0bc68498e76a8","type":"time-range-switch","z":"dfaf3ee676ee5dd3","name":"Du couché au levé du Soleil","lat":"44.805615","lon":"-0.6308396","startTime":"sunset","endTime":"sunrise","startOffset":"-40","endOffset":"40","x":820,"y":200,"wires":[["5a72b15e3839b334"],[]]},{"id":"5a72b15e3839b334","type":"api-current-state","z":"dfaf3ee676ee5dd3","name":"Lumieres terasse Off ?","server":"2a98b88a.a75098","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"switch.interrupteur_lumieres_exterieures_cuisine","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1100,"y":200,"wires":[["daeb3e2167eb6afe"],[]]},{"id":"c185a17c11c232bb","type":"trigger","z":"dfaf3ee676ee5dd3","name":"","op1":"","op2":"true","op1type":"nul","op2type":"str","duration":"2","extend":true,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":780,"y":300,"wires":[["b9012222ced9ec40"]]},{"id":"9b464c7095659e7f","type":"api-current-state","z":"dfaf3ee676ee5dd3","name":"Detection mouvement activée (Terrasse) ?","server":"2a98b88a.a75098","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"input_boolean.activer_detection_mouvement_terasse","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":480,"y":200,"wires":[["36b0bc68498e76a8","c185a17c11c232bb"],[]]},{"id":"eee50e27939dc039","type":"comment","z":"dfaf3ee676ee5dd3","name":"Utilisation du bouton interupteur (Terrasse)","info":"","x":240,"y":380,"wires":[]},{"id":"7bde1da096b04d1b","type":"server-events","z":"dfaf3ee676ee5dd3","name":"Events (State changed) : switch interrupteur lumieres Terrasse","server":"2a98b88a.a75098","version":3,"exposeAsEntityConfig":"","eventType":"state_changed","eventData":"{\"entity_id\":\"switch.interrupteur_lumieres_exterieures_cuisine\"}","waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":300,"y":440,"wires":[["7cf72655f4f24ef3"]]},{"id":"7cf72655f4f24ef3","type":"switch","z":"dfaf3ee676ee5dd3","name":"Interrupteur / Script ?","property":"payload.context.user_id","propertyType":"msg","rules":[{"t":"null"},{"t":"nnull"}],"checkall":"true","repair":false,"outputs":2,"x":800,"y":440,"wires":[["f556b1e7e4a6ad62"],[]]},{"id":"e82f22bff54606a6","type":"comment","z":"dfaf3ee676ee5dd3","name":"user_id ?","info":"Quand on declenche à partir de l'interrupteur\n-> pas de user_id\n\nQuand on passe par HA : un user_id (supervisor)","x":760,"y":480,"wires":[]},{"id":"f556b1e7e4a6ad62","type":"switch","z":"dfaf3ee676ee5dd3","name":"On / Off ?","property":"payload.event.new_state.state","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1060,"y":440,"wires":[["2c2b394a5be34456"],["a7b0f6cd4e05de31"]]},{"id":"2c2b394a5be34456","type":"api-call-service","z":"dfaf3ee676ee5dd3","name":"Desactiver la detection de mouvement (Terrasse) ","server":"2a98b88a.a75098","version":7,"debugenabled":false,"action":"input_boolean.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.activer_detection_mouvement_terasse"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"input_boolean","service":"turn_off","x":1370,"y":420,"wires":[[]]},{"id":"a7b0f6cd4e05de31","type":"api-call-service","z":"dfaf3ee676ee5dd3","name":"Activer la detection de mouvement (Terrasse) ","server":"2a98b88a.a75098","version":7,"debugenabled":false,"action":"input_boolean.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.activer_detection_mouvement_terasse"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"input_boolean","service":"turn_on","x":1350,"y":480,"wires":[[]]},{"id":"2a98b88a.a75098","type":"server","name":"zHome HA","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
1 « J'aime »

Et en faisant ça tu filtres bien uniquement les appuis boutons en entrée du module, c’est ça?

Quelques questions / pistes d’améliorations potentielles:

  • Est ce que tu traites de la même façon les commandes via un dashboard ou une commande vocale? Ce sont de mon point de vue aussi des commandes « manuelles »…
  • Tu lances une tempo de 2min, tes lumières restent elles bien allumées si tu es toujours là au bout de 2min (relance de la tempo « tant que » il y a detection)?

Oui tout a fait le user_id == null permet de filtrer les requêtes uniquement « manuelle ».
C’est a dire à partir de l’interrupteur ou de l’application (dashboard ou vocale).

La tempo de 2 min est prolongée à chaque détection de mouvement (dans le cas ou la détection de mouvement est activée donc dans un script d’automatisation).

N’hésite pas si tu as d’autres questions.

1 « J'aime »

Impec.

Du coup ça marche comme chez moi, bien que je fasse « l’inverse » c’est à dire logger le booléen (chez moi le timer) uniquement quand c’est automatique…

Ca donne une façon de faire pour les adeptes de NodeRed…

Salut

N’ayant pas encore de détecteur mais c’est prévu et la fonction m’intéressant j’ai testé un peu les state_changed et les trigger.to_state.

Je simule un détecteur avec un switch(bureau), qui m’allume un autre switch(chambre)
Si switch.bureau on allume switch.chambre 5 secondes.
Si switch.chambre on allume chambre et on désactive le détecteur.

Il faut du coup 2 automatisation qui gère le détecteur et une qui gère les différents scénarios.

Pour le détecteur c’est tout bête :

alias: test context detecteur
description: ""
triggers:
  - trigger: state
    entity_id:
      - switch.bureau
    to: "on"
conditions: []
actions:
  - action: switch.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: switch.chambre
mode: single

Pour les scénarios :

alias: test context
description: ""
triggers:
  - trigger: state
    entity_id:
      - switch.chambre
    to: "on"
  - trigger: state
    entity_id:
      - switch.chambre
    to: "off"
    id: eteindre
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - eteindre
        sequence:
          - action: automation.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: automation.test_context_detecteur
        alias: Extinction
      - conditions:
          - condition: template
            value_template: "{{ trigger.to_state.context.parent_id != none }}"
        sequence:
          - delay:
              hours: 0
              minutes: 0
              seconds: 5
              milliseconds: 0
          - action: switch.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: switch.chambre
        alias: allumage par detecteur
      - conditions:
          - condition: template
            value_template: "{{ trigger.to_state.context.parent_id == none }}"
        sequence:
          - action: automation.turn_off
            metadata: {}
            data:
              stop_actions: true
            target:
              entity_id: automation.test_context_detecteur
        alias: allumage manuel, voice assistant, lovelace, companion
mode: single

Cela fonctionne plutôt pas mal à condition de bien mettre l’option d’extinction en première option.
J’ai mis un délai mais on peut envisager in timer bien sur.

On peut donc différencier, l’allumage manuel par l’inter de l’allumage par automatisation /script comme dans cette exemple mais on peut également en plus différencier si c’est allumer par lovelace/companion/voice assistant en modifiant les conditions suivant le tableau donné dans le lien plus haut.

Bonjour,
serait-il possible d’avoir le code de tout ceci ?
Parce ce que là, je ne vois pas bien comment tout ça fonctionne !
Merci d’avance

C’est update pour le code !

Thx a lot !
Rapide !!!