Père Bodul, raconte-nous une histoire !

Petit moment de vie personnelle, je suis le daron d’une super petite fille de 5 ans. On lui a offert il y a quelques années une fabrique à histoires qui la suit partout. Vous connaissez le principe ? Vous choisissez un héros, un lieu, un objet, et la boite vous raconte une jolie histoire, bien construite, bien racontée. La boite (l’objet physique) est sympa, facile à utiliser, pour les 3 / 6 ans je conseille vraiment.

Image générée grâce à Dall-E

Et puis en discutant avec un ami, on s’est demandé si ChatGPT ne pourrait pas générer une infinité d’histoires dans une application un peu cadrée (mais pas trop) ! Et puis tant qu’à faire, pourquoi ne pas demander à ChatGPT de coder lui même cette application. C’est donc un petit défi pour me rendre compte à quel point je serais capable d’avoir une application fonctionnelle en en codant le moins possible moi-même. Il fallait que ça marche à la fin de la soirée pour que j’estime cela OK. Petite difficulté en plus, j’ai utilisé uniquement mon iPad, et Gitpod pour un environnement de développement en ligne.

Voici la discussion que j’ai eu avec ChatGPT en lui mettant quelques contraintes, comme le langage, ou le fait de n’utiliser aucune librairie externe :

https://chat.openai.com/share/6aab6814-ccd6-448d-9ae6-8757964e1cd9

Le résultat

Bon déjà, est ce que j’ai réussi mon pari dans la soirée ? Oui. C’est même en ligne.

Mes impressions

Y être arrivé est déjà bluffant. Lisez la discussion, vraiment, qui aurait imaginé ça il y a encore quelques années ? Cependant, de temps en temps le code n’était pas fonctionnel. Il a fallu que j’ouvre la documentation de l’API de ChatGPT pour que j’oriente la discussion. Et l’orienter a suffit à ce que ChatGPT retombe sur ses rails, et s’excuse de son erreur. (ChatGPT ne se connait pas soit même, c’est presque décevant :p)

Cependant, j’ai le biais du développeur expérimenté (je crois pouvoir le dire à mon grand âge). Je savais à l’avance ce que je voulais, et ça change tout. Comment s’en sortirait un néophyte qui ne saurait pas débugger, ou sans aucune idée de l’implémentation attendue ? Mais quand je vois le travail en cours sur l’interprétation de code, notre façon de travailler devrait vraiment évoluer.

On parle de générer du code qui compilera, de sous traiter des traitements contextualisés à une discussion… Les prochaines années vont être intéressantes, et je suis curieux de voir comment nous allons nous approprier ces nouveaux outils.

Complément d’informations

Quid de la qualité de l’histoire ? Elle fait le job, sans plus. L’écriture est toujours un peu bizarre, mais elles font rire ma fille, ce qui étant quand même le but recherché. Je n’ai pas passé beaucoup de temps sur le prompt cela dit, il y a peut-être mieux à faire ? Je n’ai accès qu’à GPT3.5 à travers l’API, je verrai si le modèle GPT4 est plus sympa. Il devrait être généralisé sous peu.

Concernant le son, dans la première version du site, j’ai utilisé le Text to Speech natif au navigateur, et ce n’était franchement pas très convaincant. J’utilise maintenant l’API text to speech AI de Google Cloud qui a un rendu bien plus sympa! Mais il n’y a pas de continuité, pas d’intonation propre à l’histoire. Google devrait généraliser un nouveau modèle plus adapté aux histoires.

Bref, pour l’instant, la Lunii n’a pas trop à s’inquiéter. Rien de tel qu’une histoire bien écrite et bien racontée, et on est encore loin du compte. Faites marcher votre imagination et faites moi mentir !

LB.

Home Assistant vers PubSub vers BigQuery vers Datastudio

Tout un programme !

Connaissez-vous Home Assistant ? C’est un chouette logiciel de domotique, compatible avec une multitude d’objets, de protocoles…. Vous pourrez facilement faire des tableaux de bord, et avoir des interactions assez poussées avec vos objets à condition d’accepter d’écrire un peu de YAML. Sa communauté est vraiment dynamique, les plugins sont nombreux et on trouve à peu prêt ce que l’on veut.

Par défaut, Home Assistant va utiliser un stockage SQLite. C’est pratique, ça ne réclame pas de dépendance particulière, et ça fait le job. Mais par défaut, et je ne comprends franchement pas l’idée, nous n’avons qu’un historique de 24h sur nos différents capteurs. Dans mon cas j’ai un dongle ZWave, avec un capteur de température Fibaro:

L’oeil de Sauron… Ceux qui savent, savent.

Et ça me frustre. Avant j’utilisais Domotizc et je n’avais pas ce soucis. On avait un véritable historique, et ça me permettait d’analyser un peu l’effort énergétique que je devais mettre dans ma maison pour maintenir une certaine température.

Fort heureusement, beaucoup de plugins existent pour arranger ça.

rien que ça…

Pour votre utilisation personnelle, toutes ces solutions peuvent convenir en fonction de vos connaissances ou vos affinités.

Quand j’ai vu la présence de Google Pub/Sub, j’ai réalisé que je pourrais très vite réaliser des tableaux de bord grâce à la suite Google à un cout proche de 0€. (OK, tout service a un prix. Mais je ne souhaitais pas consacrer de réel budget à ce service).

Quelle est l’idée ?

Pousser les données Home Assistant dans Pub/Sub

Pub/Sub, c’est un message broker. L’idée est donc de recueillir tous les événements Home Assistant grâce à ce plugin : https://www.home-assistant.io/integrations/google_pubsub/
Ce plugin est préinstallé dans Home Assistant. Vous n’aurez donc qu’à modifier le fichier configuration.yaml selon la documentation du plugin. Chez moi, cela ressemble à ça :

google_pubsub:
project_id: <GCP_PROJECT_ID>
topic_name: <GCP_PUBSUB_TOPIC>
credentials_json: <CREDENTIALS>.json
filter:
include_entities:
- sensor.salon_temperature
- sensor.salon_humidity
- sensor.fgms001_motion_sensor_air_temperature

Cela me permet de pousser dans pubsub uniquement les évènements relatifs à mon fibaro, et à mon thermostat Nest.

OK, des messages arrivent dans Pub/Sub, qu’est ce que j’en fais maintenant ?

Déjà, vérifions si des messages arrivent. Les messages sont publiés dans un « topic » ou « sujet » en français.

Bonne nouvelle en ce qui me concerne, on voit quelques messages passer. Home Assistant parle, et assez peu (ce qui est aussi une bonne nouvelle, les filtres configurés ont l’air de fonctionner).

Plusieurs options s’offrent maintenant à vous pour faire quelque chose de ces messages. Pub/Sub vous propose deux options pré-construites : « Exporter vers BigQuery » ou « Exporter vers Cloud Storage ». Ces tâches, qui vont en effet fonctionner, sont basées sur Dataflow. C’est une solution basée sur Apache Beam qui permet d’exécuter du code sur de volumineux flux de données avec différents patterns (agrégation, filtre, transformation…).
Je ne vous conseille pas son utilisation pour ce cas précis, juste parce que vous allez le payer cher (€) pour pas grand chose.

Une autre option m’intéresse un peu plus. En haut de l’écran, on peut lire une option « Déclencher une cloud function ». Qu’est ce donc ? C’est la possibilité d’exécuter un bout de code, simple et unitaire, pour chaque message qui arrive. Et c’est exactement ce que nous souhaitons vu l’objectif : lire les messages et les stocker quelque part. La volumétrie impliquera un coût proche de 0.

Pré-requis : Création du dataset BigQuery

Avant de s’occuper de la Cloud Function, allons préparer la base de données. Pour cela, rien de plus simple, on se connecte à la console d’administration de BigQuery pour y créer un dataset. Vous pourrez choisir l’emplacement des données. Dans l’exemple de code que je vais vous donner, j’ai choisi de ne garder que 3 simples informations :
– Le device id
– La date de l’évènement
– La valeur associée
C’est la définition d’une Time Série…

Un dataset, une table et son schéma.

Création de la Cloud Function

Maintenant que BigQuery est prêt à accueillir nos données, allons les déverser.
Sur l’écran de votre sujet Pub/Sub, cliquez sur « Déclencher une cloud function ». Cela vous amènera à un écran pré-rempli où vous pourrez mettre un nom à votre cloud function, une région d’exécution (par habitude je prends local, Europe-West1 😉 ). Et si vous voulez utiliser un bout de code pré-écrit, il y aura 3 variables d’environnement d’exécution à fournir dans les paramètres avancés :

Paramètres avancés pour la Cloud function

Etape suivante, le code.
Je vous propose ce dépot : https://github.com/lborie/home-assistant-to-big-query

Soit vous essayez de lier ce dépot que vous aurez forké à votre compte GCP, soit vous copiez coller le contenu dans l’éditeur intégré. Le code est en golang 1.13, le point d’entrée étant une fonction Main

function.go, go.mod et go.sum

Et plus qu’à déployer.

Si tout va bien, une fois déployée, vous devriez voir votre fonction se déclencher à chaque nouveau message dans Pub/Sub ! Sur l’écran d’administration de la cloud function, vous trouverez un onglet pour accéder aux logs générés.

La fonction est lancée, le message qui provient de Home Assistant est loggé et doit être sauvé dans BigQuery

Et normalement, votre table BigQuery devrait aussi s’alimenter…

De la donnée ! Victoire !

Comment en faire un graphique ? Direction Datastudio

Datastudio permet de faire des tableaux de bord en se connectant à plein de sources de données différentes, dont BigQuery. Lors de la création d’un nouveau rapport, vous allez pouvoir ajouter des données au rapport.

BigQuery parmi les centaines de connecteurs disponibles…

Vous allez pouvoir pointer vers la table Data du bon dataset. Une fois que la source de données est ajoutée, vous allez pouvoir éditer le rapport. En haut à droite, différents types de graphiques seront disponibles, dont un qui me parait pertinent : « Graphique de série temporelle lissée ». Comme on parle de température, un lissage me parait approprié.

Une date, un type et une valeur : on est bien dans la timeserie

Et magie…

La température dans mon bureau… On voit quand les moniteurs sont allumés, pas besoin de chauffage.

Conclusion

Tout ça pour ça me direz-vous ?
BigQuery est un outil extrèmement puissant. Pour une volumétrie Domotique, vous n’aurez jamais à vous soucier de quoi que ce soit, à condition de ne pas réclamer une réactivité trop grande. La puissance est illimitée, les couts de stockage ridicules. Intéressez-vous à cet outil.
Datastudio possède une grande variété de données, et vous serez capable de croiser les informations, peut-être avec une autre source de données que vous avez quelque part ?
On aura aussi vu du PubSub, de la Cloud Function, bref une chaine de traitement complète autour de l’IOT ! Et le tout sera scalable… Amusez-vous en jouant avec les filtres de configuration Home Assistant par exemple !

L.B.