Recherche d'une scène ou dahsboard qui utilise un élément précis (appareil MQTT, appareil Zigbee,...)

Bonjour,
J’ai désormais quelques centaines de scènes, et je ne me rappelle plus du détail de chacune d’elles. Alors ça devient parfois compliqué de retrouver la scène qui provoque tel ou tel comportement…

Concrètement aujourd’hui, je voudrais retrouver facilement la ou les scènes qui remettent à zéro un appareil MQTT que j’ai créé pour suivre la durée de fonctionnement de ma pompe à chaleur… Et j’ai quelques dizaines de scènes qui interviennent sur cet appareil.
Rien d’impossible en soi, je n’ai qu’à ouvrir et relire chacune des scènes que j’ai taggué « pompe à chaleur ».

Mais y a-t-il un moyen plus rapide ? Un ‹ grep › dans les fichiers de gladys avec le nom de l’appareil MQTT, peut-être ?

Et est-ce que ce serait une bonne idée de fonctionnalité à ajouter à Gladys pour que ce soit réalisable sans ‹ bidouiller › dans les fichiers ?

Ce serait peut-être aussi utile pour retrouver les dashboard…

Et je verrais bien un bouton ‹ recherche… › dans la configuration d’une fonctionnalité d’un appareil MQTT, dans ce style :

Si tu veux bidouiller, le plus simple serait via l’API ou en SQL dans la base SQLite :slight_smile:

Je ne sais pas quel niveau de bidouille est acceptable pour toi ^^

Sinon, oui pourquoi pas faire ça via Gladys !

ça pourrait être aussi un filtre sur la liste de scènes, mais ça complexifie un peu cette vue ^^

Les scènes sont stockées dans le fichier db ? Ok, j’irai fouiller en SQL…
(Je n’avais pas pensé à l’API, j’irai chercher aussi, par curiosité…)

Mais du coup je pense que permettre ça depuis Gladys serait vraiment pratique. Je trouve qu’un filtre dans les scènes serait effectivement une complexité de plus, pas utile très souvent.

Je crois donc plus au bouton ‹ chercher › dans la config de l’appareil, comme la maquette rapide que j’ai mis plus haut. En plus, ça a du sens à côté du bouton ‹ supprimer › : avant de supprimer, je peux vérifier facilement que ce n’est plus utilisé…

1 « J'aime »

J’ai transformé ce sujet en demande de fonctionnalité.

Le plus simple de nos jours pour ce genre de tâches, c’est d’écrire un petit script avec ChatGPT, même si ça te fait du code crado on s’en fout pour ce genre de tâches one-shot :smiley:

L’API est simple:

Ce qui t’intéresse:

Exemple d’une scène (j’ai pris un exemple chez moi :stuck_out_tongue: )

{
    "id": "e352584c-1aaf-4cc7-a9a2-5caa6293419c",
    "name": "Allumage automatique toilettes journée",
    "description": "Allumage via capteur entre 8h et 20h",
    "icon": "loader",
    "active": true,
    "selector": "allumage-automatique-toilettes",
    "actions": [
        [
            {
                "type": "condition.check-time",
                "after": "08:00",
                "before": "20:00"
            }
        ],
        [
            {
                "type": "device.set-value",
                "device_feature": "zigbee2mqtt-ampoule-toilettes-light-brightness-brightness",
                "value": "215"
            }
        ],
        []
    ],
    "triggers": [
        {
            "type": "device.new-state",
            "device_feature": "zigbee2mqtt-capteur-mouvement-toilettes-motion-sensor-binary-occupancy",
            "value": 1,
            "operator": "=",
            "threshold_only": true
        }
    ],
    "last_executed": null,
    "created_at": "2024-03-30T07:36:29.090Z",
    "updated_at": "2024-07-05T07:08:47.591Z",
    "tags": [
        {
            "name": "Toilettes"
        }
    ]
}

Je suis certain que si tu copie colle ce message dans ChatGPT, tu as un script fonctionnel :joy:

1 « J'aime »

Exemple:

La réponse de ChatGPT (j’ai relu rapidement, il manque juste l’authentification mais sinon c’est bon):

Voici un script en Node.js qui utilise axios pour interagir avec l’API, récupère la liste des scènes, et cherche celles qui utilisent une device_feature spécifique, en l’occurrence « capteur_humidite ». Si cette device_feature est trouvée dans les actions ou les déclencheurs de la scène, le script affiche le selector de cette scène dans les logs.

Pour exécuter ce script, assurez-vous d’avoir axios installé en exécutant npm install axios.

Voici le code :

const axios = require('axios');

// URL de base de l'API
const API_BASE_URL = 'http://votre-api.com/api/v1/scene';

// Fonction pour récupérer toutes les scènes
async function fetchScenes() {
    try {
        const response = await axios.get(`${API_BASE_URL}`);
        return response.data;
    } catch (error) {
        console.error('Erreur lors de la récupération des scènes:', error);
        return [];
    }
}

// Fonction pour récupérer une scène complète par son sélecteur
async function fetchSceneBySelector(selector) {
    try {
        const response = await axios.get(`${API_BASE_URL}/${selector}`);
        return response.data;
    } catch (error) {
        console.error(`Erreur lors de la récupération de la scène ${selector}:`, error);
        return null;
    }
}

// Fonction principale pour trouver les scènes qui utilisent "capteur_humidite"
async function findScenesWithHumiditySensor() {
    const scenes = await fetchScenes();

    for (const scene of scenes) {
        const sceneData = await fetchSceneBySelector(scene.selector);

        if (sceneData) {
            const hasHumiditySensor = sceneData.actions.some(actionGroup =>
                actionGroup.some(action => action.device_feature === 'capteur_humidite')
            ) || sceneData.triggers.some(trigger =>
                trigger.device_feature === 'capteur_humidite'
            );

            if (hasHumiditySensor) {
                console.log(`Scène avec "capteur_humidite" trouvée: ${scene.selector}`);
            }
        }
    }
}

// Exécution du script
findScenesWithHumiditySensor();

Instructions pour lancer le script :

Assurez-vous d’avoir Node.js et axios installés dans votre projet. Si nécessaire, installez axios avec :

npm install axios

Remplacez ‹ http://votre-api.com/api/v1/scene › par l’URL de votre API.

Exécutez le script en lançant la commande suivante dans le terminal :

node votre-script.js

Le script va afficher le selector de chaque scène qui contient un device_feature avec la valeur « capteur_humidite ».

1 « J'aime »