MQTT - Permettre l'intégration d'un "device" externe (smartphone)

,

Salut @spenceur

Peux-tu m’aider dans la configuration de l’application ?
Lorsque je clique sur “Check Connection” j’ai toujours une erreur “Connection Failed”.

Quel port as-tu configuré ? TLS ou pas ?

Merci pour ton aide :slight_smile:

Hello

Pas de tls

Merci pour ta réponse :slight_smile:

Je comprends pas, mais impossible de se connecter avec le “test connection”. A chaque fois j’ai une erreur “Timeout”.

Pourtant j’ai même vérifié le pare feu dans mon Raspberry Pi, le port 1883 est ouvert, le mdp Gladys est correct, je n’ai plus d’idée pour debugguer…

Je me demande s’il n’y a pas de restriction sur le serveur MQTT par défaut au localhost.

[EDIT]

$ sudo cat /var/lib/gladysassistant/mosquitto/mosquitto.conf

allow_anonymous false
connection_messages true
password_file /mosquitto/config/mosquitto.passwd
listener 1883

Les ports sont ouverts en entrée et en sortie sur iptables, donc je ne vois pas ce qui marche pas.

Niveau logs mosquitto, il n’y a que les connexions de Gladys :

0: mosquitto version 2.0.12 starting
0: Config loaded from /mosquitto/config/mosquitto.conf.
0: Opening ipv4 listen socket on port 1884.
0: Opening ipv6 listen socket on port 1884.
0: mosquitto version 2.0.12 running
0: New connection from 127.0.0.1:32768 on port 1884.
0: New client connected from 127.0.0.1:32768 as mqttjs_cb088900 (p2, c1, k60, u'z2m').
0: New connection from 127.0.0.1:32770 on port 1884.
0: New client connected from 127.0.0.1:32770 as gladys-main-instance-473225 (p2, c1, k60, u'gladys').

[EDIT 2]

Via mon VPN Wireguard qui est sur le Raspberry Pi, j’arrive à connecter l’application à MQTT. C’est donc bien un pb de flux entrant.
Merci pour ta confirmation de la confi de l’application :slight_smile:

1 Like

Dans la partie “Schedule” de l’application, tu as configuré comment ?

J’ai mis ça dans l’application Android, ça part avec succès, mais Gladys ne semble pas comprendre les données (je ne vois rien dans Gladys, ou dans les logs) :

  • Presence Topic : oneplus7tpro/presence
  • Battery Topic : oneplus7tpro/battery

[EDIT]

En fait c’est indiqué dans Gladys, à savoir :

gladys/master/device/mqtt:oneplus7tpro/feature/mqtt:oneplus7tpro:presence/state

1 Like

Exactement :slight_smile:
Si tu as besoin de plus d’info hésite pas

Je viens de créer quelques scènes pour gérer ma présence mais ça marche pas comme voulu.

  1. En cas de changement d’état de mon téléphone, ça indique “Utilisateur vu a la maison”.

  2. Toutes les 16 minutes ça déclenche “Vérifier la présence sur les 15 dernières min” et me marque absent si c’est le cas.

Mon téléphone envoie toutes les 15 minutes un signal en wifi pour dire que je suis là. Si je coupe mon wifi, le signal n’est plus reçu et Gladys me marque absent, Parfait !

SAUF QUE lorsque je réactive le wifi, le signal est bien reçu par Gladys, mais identique aux précédents, il ne déclenche pas la scène 1, qui ne me marque jamais présent.

Or le bloc “Vérifier la présence” peut me marquer absent mais ne me marque pas présent s’il me détecte (c’est même explicité que Gladys ne fais rien si elle me détecte).

Comment gérer ce cas ? Pour moi c’est une problématique que l’on devrait pas avoir, soit il manque un déclencheur soit le bloc Vérifier la présence est à améliorer.
Soit j’ai raté un truc aussi :sweat_smile:

tu as bien setter dans l’application 1 lorsque tu te connecte au réseau ?
Voici mon device :


Pour information, j’envoie l’état de ma batterie aussi ça peut toujours servir :slight_smile:

Et côté application



J’en ai deux car j’ai plusieurs réseau à la maison :slight_smile:

Après niveau scène je check l’état de mon OnePlus (présence et absence) et zou

1 Like

La différence entre nos deux situations se situe sur le type de message.

Tout est identique de mon côté sauf que je n’envoie pas de messages d’absence.
Je veux plutôt que Gladys détecte le signal comme un “keepalive”.

  • Si le signal a moins de 16 minutes, je suis là
  • Sinon je suis absent

J’ai trouvé le problème, c’est le déclencheur “Détecter la présence” qui attend un signal qui change. Contrairement au déclencheur sur un device basique qui peut prendre en compte tous les évènements.
Et dans mon cas il n’y a qu’un signal de présence envoyé toutes les 15 minutes et aucun signal d’absence. Donc les nouveaux signaux sont pas pris en compte.
C’est voulu @pierre-gilles ?

Ma seule astuce c’est justement d’utiliser la valeur de la batterie de mon téléphone pour avoir une valeur de capteur qui permet d’utiliser le déclencheur standard pour tous les capteurs.

C’est bien le fonctionnement qui est prévu :slight_smile: L’intégration Bluetooth fonctionne de la même manière, elle s’attend à recevoir un “1” à chaque fois qu’un appareil bluetooth est vu, en revanche elle ne s’attend pas à ce qu’un appareil bluetooth envoie “0” quand il n’est pas vu, c’est justement son absence d’envoie de “1” qui créé une absence côté Gladys.

De même, quand tu reviens, normalement pas besoin d’être passé par un 0 pour que le 1 soit compatibilisé.

Cf tutoriel bluetooth:

Tu peux développer ? :slight_smile:

Tu peux nous faire des screenshots de tes scènes pour qu’on voit là où ça cloche ?

Voici les deux scènes que j’utilise pour gérer ma présence.

1 - Présence

2 - Absence


Investigations

Dans la scène n°1, si je me repose seulement sur “Changement d’état de l’appareil”, Gladys ne me marque jamais présent, alors que l’affichage du device “presence” dans le dashboard est correct (il y a quelques secondes par exemple).
En ajoutant le device “battery” lié à mon téléphone et envoyé en même temps que ma présence, alors je peux décocher l’option “Exécuter seulement lorsque le seuil est passé” ce qui permet de me marquer présent à chaque message reçu.

[EDIT]

Dernière question : Pourquoi le bloc “Vérifier la présence” ne peut pas me marquer Présent ou Absent s’il détecte un signal dans la période déclarée ?
Actuellement, il ne peut que me marquer absent, mais j’aurais aimé pouvoir utiliser aussi cette fonction pour être noté présent.

Super étrange! Les triggers “détection présence” ont l’option “executer seulement lorsque le seuil est passé” de masquée et mis à “faux” par défaut. Tu peux d’ailleurs vérifier dans les appels API, la route GET /api/scene/:scene_selector devrait t’afficher un truc comme ça:

Je viens de faire le test chez moi, et je n’arrive pas à reproduire ton problème: la scène est bien exécutée à chaque fois chez moi…

Parce qu’on veut marquer l’utilisateur comme présent le plus vite possible quand tu rentre, et pas forcément toutes les X minutes si tu fais ta scène programmée toutes les X minutes.

Si tu fais ta scène programmée toutes les 10 minutes, ça veut dire que ton utilisateur ne sera marqué comme à la maison qu’au bout de 10 minutes potentiellement.

En faisant une scène qui se déclenche dès que le device est vu, au moins c’est quasi instantanée et si tu as une scène “quand je rentre à la maison” qui allume la lumière et tout, tu veux que ce soit direct.

Je comprends, dans ce cas il manque une option a ce bloc “me marquer absent si aucun signal n’a été détecté sur la période”.

Parce que c’est ce que je voulais faire sans y arriver, car pas possible par défaut j’ai l’impression.

Justement, je ne pense pas qu’on veuille cette option, c’est pas terrible niveau expérience utilisateur !

Par contre j’aimerais vraiment comprendre pourquoi ça ne fonctionne pas chez toi cette détection de présence, chez moi ça fonctionne parfaitement ! ^^

Tu peux regarder le JSON de ta scène via l’API comme montré dans mon post précédent ? :slight_smile:

{
    "id": "b1a0b488-02eb-4b3d-b5d9-d8fb3b016328",
    "name": "Présence : Louis est là",
    "icon": "home",
    "active": true,
    "selector": "presence-louis-est-la",
    "actions": [
        [
            {
                "type": "user.set-seen-at-home",
                "user": "louis",
                "house": "ermont"
            }
        ],
        []
    ],
    "triggers": [
        {
            "type": "device.new-state",
            "device_feature": "mqtt-oneplus7tpro-presence",
            "value": 1,
            "operator": "=",
            "threshold_only": false
        },
        {
            "type": "device.new-state",
            "device_feature": "mqtt-oneplus7tpro-battery",
            "value": 0,
            "operator": ">="
        }
    ],
    "last_executed": null,
    "created_at": "2021-03-29T16:02:53.000Z",
    "updated_at": "2021-10-14T20:51:33.668Z"
}

“threshold_only”: false

ça me parait bon donc !

Tu as des logs spécifique côté Gladys sinon qui pourrait expliquer pourquoi ça ne marche pas ? Tu es sûr à 1000% qu’une valeur entière 1 est envoyée via l’intégration MQTT à chaque fois que tu rentre ?

Parce que j’arrive vraiment pas à reproduire, chez moi si j’envoie 1 plusieurs fois de suites, la scène s’execute à chaque fois

En fait je crois que ça vient de mon application présence publisher qui envoie "online” au lieu de “1”.

Je viens de faire la modif dans l’application (qui manque de documentation) ça devrait résoudre le problème !

Par contre pour le composant de détection de présence, je pose la question différemment :
Comme détecter que je suis présent basé sur un signal visible quand je suis en wifi puis une absence de signal ?

Je me disais bien.

C’est à dire ? Tu veux faire quoi ?

Je veux que Gladys me détecte à la maison quand mon téléphone est en wifi et envoie un signal en mqtt.
Et si le signal n’est pas reçu dans les 15 minutes c’est que je suis absent. Et c’est cette partie que je n’arrive pas à faire

Bah c’est pas ce que tu fais déjà avec l’action “Vérifier la présence”? Je pensais que cette partie marchait bien

Désolé je crois que je me suis emmêlé les pinceaux !

Pour résumer et redonner du contexte :

  • Gladys est installé chez moi, sur un Raspberry pi et n’est pas exposée ni accessible sur internet.
  • Je n’ai pas encore d’abonnement Gladys Plus, donc aucun accès à Gladys en direct depuis internet.
  • Besoin : Me définir “présent” quand mon téléphone est en wifi uniquement.

Procédure :

  • J’utilise presence publisher pour Android, qui permet, une fois connecté en Wifi chez moi, d’envoyer des messages en MQTT à Gladys.
  • Dans Gladys, sous “MQTT”, je créé un nouvel équipement de type “présence” avec comme valeurs “1” et “0” (pas le choix que ce soit des chiffres).
  • Détection de la présence : Dans une scène, le bloc “Changement d’état de l’appareil” sur l’équipement MQTT lié à ce qu’envoie mon application, permet de me noter présent.
  • Détection de l’absence : Dans une autre scènes je me note absent quand le signal date de plus de 15 minutes. Pour cela, le bloc “Vérifier la présence” sur les 15 dernières minutes me permet de me noter absent lorsque le signal n’est plus reçu.

Attention : par défaut, l’application envoie “online” et pas “1” à Gladys. Une fois que j’ai modifié le paramètre dans l’application Android, les scènes sont fonctionnelles comme attendu (avant je pensais que c’était 1 et 0).

Astuce : Je voulais que l’application envoie des messages sans pour autant lui donne l’accès au GPS et garder mon GPS toujours allumé (nécessaire pour lui permettre de connaître le SSID wifi).
J’utilise ce que l’application appelle “Absence messages” pour notifier Gladys que je suis chez moi en wifi (logique :sweat_smile:). Sachant que Gladys me note présent quand elle a des messages et absent quand elle n’a rien, ça fonctionne comme je veux !

Pour cela :

  1. Refuser la permission GPS (localisation)
  2. Dans “conditions”, activer “Send without wifi”
  3. Dans la partie “None of the above matches”, activer “Send absence message” et modifier la valeur “Absence message” à “1”.
1 Like