Dev Integration pour Zoneminder

C’est le cas normalement, je sais pas très bien ce qui se passe … bon mon ZM est pas ouvert sur internet, c’est pas bien grave.

@damalgos j’ai regardé ton intégration netatmo, j’essaye de comprendre comment Gladys demande la mise à jour du jpg ?
Je n’envisage pas de poller l’image à intervalle régulier cote server, je pensais que l’image devrait être requetée quand l’utilisateur requête le dashboard, c’est bien ca ? auquel cas, comment intervient la demande du front vers le back ?

Edit 1:
Ok je vois dans server/lib/device/camera/camera.getImage.js :

return Promise.resolve(deviceFeature.last_value_string);

Edit 2:
Dois-je mettre du poll_frequency sur la feature Image …?

Edit 3:

C’est bon j’ai trouvé le truc ^^

Bon j’avance, j’ai ajouté les categories qui vont bien, j’ai mon image sur le dashboard.

Par contre, tant qu’à ajouter des catégories, j’ai ajouté :

CAMERA: {
    IMAGE: 'image',
    MODE: 'mode',
    MOTIONS: 'integer',
    POWER: 'power'
}

MODE = le mode de la caméra (capture de mouvement, enregistrement permanent…etc)
MOTIONS = le nombre d’évènements capturés (read only)
POWER = Si la caméra est on ou off (ici d’un point de vue Zoneminder)

Bon c’est bien mais coté Box, je vois ca :

// for now, we only supports binary on/off and sensors
if (feature.read_only || SUPPORTED_FEATURE_TYPES.includes(feature.type)) {
     roomDeviceFeatures.push(featureOption);
}

Donc je ne peux pas modifier dans le dashboard l’état ou le mode de la caméra.
De même, j’avais testé au début en mettant le mode en type SWITCH, met c’est pas top de savoir que 1 = enregistrement, 2 = surveillance …etc

Donc comment, d’une part, je pourrais avoir un menu déroulant par exemple avec les modes proposés, dans le dashboard ? je pense que c’est pas encoré prévu / codé / commencé ?

Mais est-ce que je peux le gérer dans une scène malgré tout ?

Coté model, le min et le max sont obligatoires dans la feature. Cela signifie-t-il qu’une valeur numérique doit systématiquement être enregistrée, et qu’on doit faire le mapping coté integration ?

Edit:
J’ai rajouté l’état de l’alarme Zoneminder, c’est à dire, est-ce que la camera est en Alarme suite à une détection d’intrusion.
Et donc j’ai cherché quelle catégorie.type mettre.
Coté box (SensorDeviceFeature.js), je vois qu’actuellement si c’est pas un Motion, Presence ou Opening sensor, le rendu est celui par défaut.

<td>{props.deviceFeature.name}</td>
    {SPECIAL_SENSORS.indexOf(props.deviceFeature.category) === -1 && (
      <td class={cx('text-right', { 'text-nowrap': props.deviceFeature.last_value !== null })}>
        {props.deviceFeature.last_value !== null && props.deviceFeature.last_value}
        {props.deviceFeature.last_value === null && <Text id="dashboard.boxes.devicesInRoom.noValue" />}
        {props.deviceFeature.last_value !== null && (
          <span>
            {' '}
            <Text id={`deviceFeatureUnitShort.${props.deviceFeature.unit}`} />
          </span>
        )}
      </td>
    )}

image

Y-a-t- il un type dédié à l’Alarme (de manière générale), j’ai vu une Catégorie “Siren” … j’attends vos retour avant d’aller plus loins sur ma classification du coup …

@pierre-gilles

:heart_eyes: :heart_eyes: :heart_eyes:

Je vois trop l’usage quand tu es pas chez toi via Telegram, finis de lancer mon OpenVPN, le navigateur, d’aller sur l’interface du Zoneminder …

Yes c’est normal, on affiche dans cette box que les appareils qu’on est capable de gérer dans l’UI :slight_smile: Après rien n’empêche d’ajouter dans le front un nouveau component pour gérer un nouveau type d’appareil !

Chaque affichage d’appareil dans le front est géré ici: Gladys/front/src/components/boxs/device-in-room/device-features at master · GladysAssistant/Gladys · GitHub

C’est à toi de créer une component frontend qui le fait :slight_smile:

Dans Gladys 4, on évite de faire des composants « super générique » (sauf quand ça peut être factorisé entre intégrations) pour au contraire faire des composants vraiment adapté, défini dans le code (et pas en base de donnée), ça permet:

  • D’avoir des traductions (car Gladys est disponible en plusieurs langues)
  • Que les comportements de ces components soient versionés et testés (on utilise Cypress pour les tests frontends)

En gros toi ce serait un component « liste déroulante » avec plusieurs états, propre à l’intégration Zoneminder on est d’accord ?

Pareil, il faut ajouter dans l’action de contrôle de scène et dans le déclencheur de scène ce component avec les valeurs que tu veux

Exemple: Gladys/front/src/routes/scene/edit-scene/triggers/DeviceFeatureState.jsx at master · GladysAssistant/Gladys · GitHub

Note: ça peut paraitre être beaucoup de travail, mais c’est la philosophie de la v4: on prend du temps à faire bien les choses, et on préfère avoir un produit qui demande un poil plus de travail au développeur, mais pour qu’en bout de course l’expérience utilisateur soit la meilleure :slight_smile:

Alarme de quoi ? Je crois pas. Siren c’est juste une sirène extérieur (tu sais les boitiers qui font du bruit)

Magnifique !! :heart_eyes:

Sinon tu as déjà testé Gladys Plus pour l’accès à distance ? C’est chiffré de bout en bout, et j’ai rajouté un essai gratuit de 14 jours récemment si tu veux tester :slight_smile:

Je vais regarder comment faire pour ajouter le component en front pour gérer cela.

Concernant l’alarme, je pensais aux alarmes de surveillance, celle qui sonne quand un voleur rentre :smiley:
Dans mon cas, si ma caméra voit un mouvement, elle passe en “alarme” et sur mon instance Gladys3, m’envoit une notification.

Pour Gladys Plus, je n’ai pas testé sur Gladys4, actuellement mon instance est simplement en dev sur mon pc, je testerais lorsque je basculerais :wink:

On a pas encore une gestion native des alarmes, je voudrais faire un truc vraiment propre en mode “armer/désarmer” pour ta maison avec une belle UI et des triggers / actions dans les scènes pour pouvoir réagir à ce changement d’état (SI mouvement ET alarme armée ALORS…)

Mais je pense qu’en attendant tu peux te débrouiller avec un autre type binaire (0/1), ça fera le boulot en attendant :slight_smile:

Tu peux upvoter la fonctionnalité ici si tu veux la voir dans Gladys:

Cool, hésite pas à ce moment là si tu as des questions, on peut prendre du temps ensemble pour que tout soit bien configuré, il y a plein de possibilité avec Gladys Plus et j’essaie d’accompagner au maximum l’installation !

J’ai vu sur l’integration rtsp-camera qu’on pouvait ajouter une box au dashboard.
Mais est-ce possible, via une integration, d’ajouter des fonctionnalités aux devices utilisable depuis la box device d'une pièce afin d’éviter de rajouter une box dédiée ?

Tout à fait! :slight_smile: Si tu créé une nouveau couple (Category + type) pour un device, il est tout à fait possible de gérer ce nouveau couple dans la box « appareil de la pièce ».

Tu pense à quel genre de contrôle ?

J’ai 2 cas d’usage en particulier.
Dans les 2 cas, il s’agirait d’une action avec un choix déroulant. (et pour l’un, le top ce serait un choix dynamique sur la base de ce que permet le device. (ici l’effet de couleur d’un ruban led, pas simplement la couleur)
Pour Zoneminder, c’était ce dont je parlais, l’activation d’un mode spécifique d’une caméra, je peux prendre un choix de type SWITCH, mais c’est pas intuitif de dire 1 = normal, 2 = surveillance, 3 = enregistrement…etc

Ok, dans les deux cas je pense on peut faire un contrôle “custom” avec les traductions et cie

Pour le switch zoneminder, ça va être du super custom (propre à ZoneMinder), pour l’effet ruban led, à voir à quel point il y a des similitudes avec d’autres marques de ruban de LED pour factoriser.

Dans tous les cas, si on se rend compte que factoriser ça dégrade l’expérience utilisateur, on fera du custom :slight_smile:

Pour le ruban LED, en fait c’est surtout pour gérer Hyperion (GitHub - hyperion-project/hyperion.ng: The successor to Hyperion aka Hyperion Next Generation)

Bon le lien c’est la dernière version que j’ai pas testé.
Sur l’ancienne version, et bien on peut lui passer soit une couleur, soit un effet, les 2 via une chaine de caractères… je ne sais pas trop comment le gérer.

Pour la box custom, tu aurais un exemple sur comment je déclare ca dans mon integration ?

Les couleurs tu peux les gérer avec le contrôle couleur qui existe déjà:

Il faut juste que tu gère une petite routine de conversion du format de couleur entre Hyperion et Gladys (regarde comment font les autres services, on a déjà quelques fonctions de conversions)

Ce n’est pas dans ton intégration, c’est dans la box « device-in-rooms » dans le frontend, tu peux coder ça ici:

Après avant de te lancer si tu pouvais écrire une petite spec ici pour qu’on en discute, c’est mieux :slight_smile: L’idée c’est vraiment de voir si c’est pas un comportement qu’on peut factoriser avec d’autres intégrations, et si c’est pas factorisable, je pense qu’on peut en discuter quand même pour que tu partes dans la bonne direction !

Pour la conversion des couleurs, je vais regarder, Hyperion, actuellement dans sa vieille version, demande par exemple red ou blue.

Pour la feature, c’est pareil, le besoin actuel, si je prends zoneminder, c’est que je vais passer ca à l’API:

Monitor[Function]=Modect

Ce qui m’intéresse ici, c’est Modect
C’est donc cette chaine de caractère qu’il me faut. Auparavant, dans la V3, je faisais différement car j’exploitais pas l’API, j’avais un truc custom juste chez moi qui appelait un script… Mais la finalité était la même, coté Gladys, j’envoyais un Integer (1, 2, 3…) et je fais le mapping.
Mais coté UI, c’est nul, tu dois savoir que 1=Modect, 2=Monitor…

Donc j’aimerais avoir soit un Menu déroulant avec les String qui vont bien, soit autre chose.

Je pourrais aussi a la rigueur avoir N features pour chaque mode possible, chacune étant un Binary et quand l’une est On, toutes les autres sont basculées en Off.
Ca ne nécessite pas de dev ailleurs que dans l’integration.

Hésite pas à regarder la logique côté home assistant, il y’a une integration avec auto detection

Je pense que dans ce cas, c’est le mieux :slight_smile: Avec les bonnes traductions qui vont bien comme ça ça marche en français et en anglais

Bon en fait c’est super le color picker, je croyais passer à mon instance Hyperion, une couleur du type red ou blue mais pas du tout, je lui passe du RGB comme Hue, donc ca fonctionne direct.
Je n’ai que les Effets à gérer.

Donc tu me suggères de développer une box sur le front qui gère un menu déroulant avec des options issues de l’integration qui gère ce device, c’est bien l’idée ?
Dans ce cas, comme la value reste un Integer, il faudrait donc que l’option retournée soit un objet du type:

{ 
  name: <string: Nom de la valeur>,
  id: <int:value>
}

Donc j’aurais dans l’idée une API sur l’intégration qui retourne la liste a proposer coté front…
Coté back, c’est l’intégration qui gérerait donc le mapping entre la valeur reçue au setValue et le nom à balancer au client derrière.
Suis-je dans la bonne direction ?

Pas exactement une box, juste un component de la box « devices-in-room », mais oui c’est l’idée, ça sera juste un simple component avec une select box qui envoie les bonnes valeurs entières.

Si tu as besoin d’aide on peut le faire ensemble, n’hésite pas :slight_smile:

Pas besoin, c’est du statique, c’est juste un component front et des traductions dans les trads frontend.

Exactement!

Hello,

Je reprends un peu ce sujet de la box avec un select.
Je me disais qu’une solution de facilité, c’état de créer un device_feature pour chaque option possible du mode (ici le mode de la camera).
Mais dans le cas de l’integration que j’écris pour gérer mon install Hyperion, j’ai une 15ne de modes pour le ruban derrière ma TV, ce qui me ferait une 15ne de device feature, tous en binary… bref je trouve pas ca élégant.

Donc l’option de modifier le composant devices-in-room me parait le mieux. Je regardais le code, et notamment:

const ROW_TYPE_BY_FEATURE_TYPE = {
  [DEVICE_FEATURE_TYPES.LIGHT.BINARY]: BinaryDeviceFeature,
  [DEVICE_FEATURE_TYPES.LIGHT.COLOR]: ColorDeviceFeature,
  [DEVICE_FEATURE_TYPES.SWITCH.DIMMER]: MultiLevelDeviceFeature,
  [DEVICE_FEATURE_TYPES.LIGHT.BRIGHTNESS]: MultiLevelDeviceFeature,
  [DEVICE_FEATURE_TYPES.LIGHT.TEMPERATURE]: LightTemperatureDeviceFeature
};

Mais la ou je sais pas comment gérer, c’est pour les options du SELECT que je veux créer, tu indiques de mettre des valeurs entières en statique, ok, mais on est d’accord qu’il faut différencier les valeurs selon le service ? donc vi une détection du service au travers du selector de la device_feature par exemple ?

ça me parait plus clean aussi !

Bah dans ton cas je te recommanderais de créer un couple category/type spécifique pour ce select, et de différencier sur ça.