[BDD JEEDOM] Comment sont stockés les valeurs dans la base de données?

Bonjour,

Ma question est assez simple.

Comment sont stockés les valeurs (états) des différents objets dans la base de données.
Exemple :

Un virtuel :
Nous avons les valeurs id, eqLogic_id, etc… configuration, …et value
Mais value est … vide

Cela se retrouve dans plusieurs plugins.

Mon constat est le suivant : Les valeurs ne sont pas mise à jour dans la table « cmd » et dans la colonne « value ».

Cependant, les données sont stockées quelques part…
Ma question est : Où ?

Sont-elles uniquement mise en mémoire (ce qui est finalement pas super), ou sont-elles persistées (Hdd, Bdd) ??

Par avance, merci

Salut,

Sur son blog jeedom-facile @benj29 explique comment installer adminer si tu veux étudier ce qu’il y a en base.

1 « J'aime »

J’utilise MySQL Workbench, je vois la base de données. (Je sais comment fonctionne une bdd, et l’administration de bdd).

A partir l’archivage de l’historique, je ne vois pas les valeur en live. D’où le fait que je me dis que les données ne sont pas persistées en base. Juste les configuration des commandes. (dans la table cmd).

Il y a bien la table history, mais est-ce pour les valeurs uniquement historisée ou pour toutes les valeurs ?

[EDIT]

Je me répond : Afin de pouvoir utiliser les valeurs en temps réèl directement depuis la base de données, j’ai trouvé une solution. Historiser la valeur désirée. On peux alors faire une requête de ce style

SELECT
 datetime AS "Time",
 value
FROM history
WHERE
  cmd_id = 1172
ORDER BY datetime

où cmd_id est le numéro Id de l’objet que l’on souhaite suivre.

Effectivement j’avais lu un peu vite.

C’est pour quel usage du coup? Parce qu’à priori y’a pas besoin d’aller taper en base pour récupérer la valeur d’une commande.

C’est un usage un peu spécial (orienté DevOps)

C’est pour utiliser dans Grafana avec un Data source MariaDb/MySQL plutôt que de passer par la mise en place d’un « jeedom exporter » pour Prometheus.

xD :slight_smile:

En gros ca me donne ça. Mais certaines valeurs sont par en temps réèls. J’ai fait un exporter prometheus pour différente valeur via un scenario jeedom mais limité au cron (donc min toutes les minutes). J’aimerais que certaines valeurs soient real time based. Donc en tapant direct dans la bdd dès la mise à jour.

Le tout sert d’affichage de contrôle et me servira pour la fabrication d’un ‹ Miroir intelligent › avec l’affichage temps réèl des données en dessous (genre mirroir sans teint avec un écran derrière pour afficher les valeurs).

Dans grafana, je créer une playlist avec plusieurs page qui défileront sur l’écran du miroir

Ca donne ca en gros.


2 « J'aime »

Ah oui sympa !

Bientôt un tuto sur le forum ? :grin:

Pourquoi pas, mais (et c’est sans être orgueilleux pour le coup), cela demande un bonne connaissance de :

  • Docker avec un orchestrateur (Genre Swarm ou Kubernetes)
  • La configuration d’un Load Balancer (Genre Traefik) et que chacun pourra configurer en fonction de son infrastructure,
  • L’utilisation de Prometheus (à minima, si on ne prend que les métriques de Jeedom et non la surveillance de la stack). Pour ma part, ne pas utiliser Cadvisor, Node exporter etc… serait alors un erreur.
  • La configuration de Grafana (Ce qui implique la connaissance des Langages PromQL et SQL)

Je pense que, malheureusement, cela n’est pas forcément à la portée des débutants. Cependant, je reste disponible pour accompagner les personnes souhaitant approfondir leur connaissance sur tous ces sujets.

Pour une configuration simple pour avoir des Dashboard Grafana, il faudrait compter

1 container genre Treafik (Load Balancer, Ingress)
1 Conteneur Jeedom
1 conteneur MariaDB
1 Conteneur Prometheus
1 conteneur Zwave2mqtt (evite le mode host / macvlan)
1 Conteneur Master mqtt

5 subnet docker swarm

C’est se compliquer la vie pour un simple Dashboard, non ? Jeedom a de très bonne capacité pour faire des chose très belle et poussée.


Pour donner un ordre d’idée, sur une configuration somme toute basique, j’ai 7 Stacks Swarm sur 3 nodes. Avec 13 services et 25 containers
Avec du nis, nfs. Le tout déployer avec ansible et un gestion CI/CD avec Gitlab, et une VM sur GCP, avec gestion des sauvegardes Jeedom, remontée mqtt etc…

Pour ma part, il n’y a pas que Jeedom, d’où une stack un peu plus complexe. Et puis, c’est mon métier (passion) en tant qu’architecte DevOps.

1 « J'aime »

Tu sors un peu le bazooka pour écraser une miette, mais c’est assez funky comme usage :slight_smile:

Petite question : tu te poses souvent à Trudeau ?

Bonjour,
Elles ne sont pas en DB mais en cache pour optimisation (inutile de faire un aller retour DB à chaque demande). Le cache est persisté régulièrement et à chaque fois que nécessaire.

Rapport à tout historiser et accéder directement à la DB, ce n’est pas le choix le plus judicieux selon moi:

  • Ça rajoute de la charge non négligeable.
  • une api existe pour récupérer les valeurs des commandes; c’est cette api qui doit être utilisée en mode pull. En push c’est soit jeedom soit un plug-in qui doit le gérer.
  • en IT, un système, une application ne devrait jamais accéder au stockage d’une autre application (jeedom ici); c’est vraiment moche de faire un design pareil sans compter le fait que si la structure change, ta query sera cassée (et ça ne sera pas là faute de jeedom, aucune retro-compatibilite n’est a garantir sur la structure de la DB)
5 « J'aime »

En fait, @Mips, je suis en parti d’accord avec toi.
Mais cela dépend des usages en fait. Dans le cas de Jeedom, oui, des aller retour en Bdd vs le Cache peut se comprendre. Dans le cas d’une donnée « Critique », la case « historique » fait le job en cas de crash.

Pour des applications HA, on Cloud voire Hybride (onPrem et Cloud), ou real time cela peux parfois être nécessaires. D’autant que la persistance en bdd permet la persistance des données en cas de défaillance (Rejeu des transactions, etc…). les Bdd sont assez performantes pour traiter des millions de transaction par secondes.

Par ailleurs, les applications de monitoring doivent utiliser les données des autres applications, sinon elles ne monitorent … rien. Et à un moment, si un élément change, quel qu’il soit, la métrique ne sera plus remontée de toute façon, car ne correspondant plus à rien. Comme dans l’utilisation d’application telle que Prometheus, Nagios, ou Sensu par exemple. un Reqête PromQL sera valide jusqu’au moment ou la métrique change. Il faudra alors la refaire.

Donc, je suis entièrement d’accord avec toi qu’une bdd relationnelle et une application sont un système monolithique. Qu’une application de « prod » destinées à des utilisateurs finaux ne devraient pas utiliser la bdd ou le stockage d’une autre application. Et c’est le problème des applications monolithiques. Cependant pour des usages de monitoring, c’est autre chose. Non destiné au grand public mais à des équipes IT dédiées. En cas de changement, les équipes sont là pour effectuer les corrections/ajustements nécessaires.

Par ailleurs, et c’est là justement que les nouveau modèles IT sont intéressants, l’utilisation des Microservices, Faas (les AWS Lambda par exemple), etc autres joyeusetés sont souvent amenées à utiliser des données d’autres applications pour leur usages.

En effet, prenons le cas d’une fonction Lambda. Elle est stateless et son environnement est supprimé à chaque fois donc pas d’historique, de stockage ou autre.
Imaginons une application liée à une bdd de type DynamoDb. Dans l’infrastructure, il est nécessaire d’utiliser 1 conteneur pour une tâche spécifique qui tourne continuellement.
Ce conteneur met à jour la bdd toutes les 50ms, mais les données, il ne les lis pas. il s’en fou.
Un site web (dans une instance EC2 par exemple), avec un script javascript, qui lui va lire les données de la bdd à chaque fois qu’on arrive sur la page.
Un utilisateur final utilise la page, le script se lance et appelle une API de la qui va lancer une fonction lambda. Cette fonction à besoin d’une valeur en bdd afin de faire un traitement. Le choix de la lambda est moins coûteux qu’une instance EC2 dans ce cas là. la lambda va interroger la bdd, remplie par le conteneur, et l’utiliser pour afficher une donnée « traitée »… On peux même avoir un Step Function avec plusieurs Lambda, etc… Ayant besoin de lire voire stocker ou mettre à jour une données de la Bdd.

Dans ce cas précis, ce genre d’application offre un découplage des fonctionnalités (microservice, serverless, FaaS, etc).

Mais cela fait partie d’une architecture pensée ainsi. Ce qui implique d’voir un politique de gestion du changement. Mais c’est très courant avec les nouvelles applications.

Maintenant, pour revenir à Jeedom.

C’est un cas très simple d’application monolithique. Le découpage microservice ou autre est impossible (Cron, Base de données etc…). Malgré tout, j’essaie de découpler les fonctionnalités quand cela est possible (Zwave, Blea, Mqtt, etc). Cela me permet de gérer ces fonctions dans des conteneurs comme des services.

Faire une application client fortement liée à la bdd de Jeedom est une hérésie. Je suis entièrement d’accord avec toi.
Cependant, utiliser la Bdd pour la gestion de métriques de monitoring, c’est pas pareil. C’est une utilisation technique pour récupérer des données techniques. Si une Query est cassée, l’impact n’est pas le même. La retro-compatibilité est inutile (et même une mauvaise pratique) car si le système change, le monitoring doit évoluer pour s’adapter au nouveau système. On ne veux pas rester sur l’ancien. De plus, les logiciels de monitoring utilise des times series pour la construction des courbes etc… Ce qui implique que le « pull » de Jeedom ne convient pas car on ne conserve que la dernière des données alors que l’on souhaite monitorer une période.
A ce niveau, plusieurs solutions, un exporter Prometheus, une export de chaque des données souhaitées dans une Bdd InnoDB, ou utiliser la Bdd Jeedom par exemple. C’est d’ailleurs comme cela que fonctionne l’historique de Jeedom comme j’ai pu le constaté. Pour une donnée est historisée, et pour chaque changement => Hop, une entrée en Bdd pour l’historique. Il n’y a pas le choix de toute façon.

Avec tout ça… J’espère que je suis assez clair dans ce que je veux dire. :slight_smile:

Sinon, non @axelpg, je ne me pose pas souvent à Trudeau. Je suis basé à Saint-Hubert. Mais les avions « léger » peuvent y atterrir. Il y a même une école de pilotage :slight_smile: Mais je me sert des données pour analyser la météo avant vol.
Sinon dans mon utilisation, Jeedom est 1 application de ma stack. Cela me permet de mieux balancer les ressources matériels entre toutes mes applications (Iptv, Monitoring, Jeedom, Jenkins, Gitlab, etc…).
Si par exemple Gitlab/Jenkins et Jeedom sont à un moment sur la même ressource matérielle. Que Gitlab ou Jenkins effectue une grosse tâche CI et que les ressources manques, ça permet de faire poper Jeedom dans un autre conteneur sur un autre Odroid automatiquement. Lorsque le nouveau est UP, l’ancien conteneur s’arrête et Gitlab peux bénéficier de plus de ressource sans que Jeedom en pâtisse, le tout sans coupure de service :slight_smile:

Hello.

Très interressé par ce genre d’initiative également.
Ingé devops également, je pense installer un prometheus + grafana sur mon nouveau NAS, en complément de Jeedom.

Si tu as des pointeurs / tutos sur ce sujet, je suis preneur ^^

Bonjour @adlord,

J’ai pas vraiment de Tuto à te fournir en document.
Mais, il y a une chaine youtube qui permet de voir le potentiel et comment utiliser les outils si tu le souhaites.
C’est la chaine Xavki. Il parle de bcp de sujet. Docker, Kubernetes, Rancher, Prometheus, Grafana et plein d’autres choses.

C’est bien expliqué lorsque l’on souhaite découvrir les choses.

Après, en fonction des ce que tu souhaites mettre en place, tu peux me poser les questions que tu souhaites. Je me ferais un plaisir de te répondre et te guider :slight_smile: