- À cause d'une chambre trop chaude et d'une forte sensibilité à la température corporelle, l'auteur a acheté un Sleep.me Chilipad 2.0 pour 1 700 dollars et a développé
bedctlpour piloter l'API cloud du fabricant - Le Chilipad combine un surmatelas fin dans lequel circule de l'eau avec une pompe, un réservoir et un régulateur de température, et prend en charge une configuration modulaire avec programmation de température par jour de la semaine et installation possible sur un seul côté du lit
- L'API permet de consulter les appareils via
/deviceset/devices/{:id}, puis de contrôler parPATCHla température, l'état de fonctionnement, la luminosité de l'écran, le fuseau horaire, etc., tout en donnant accès au niveau d'eau et à la température actuelle de l'eau - Écrit en Zig,
bedctlse compose d'une bibliothèque sans dépendances et d'une CLI légère, avec un projet d'extension futur vers une bibliothèque dynamiquelibbedctldotée d'une interface C - Lors des premiers suivis de sommeil, le temps de sommeil récupérateur a augmenté et les réveils nocturnes ont diminué, mais il ne s'agit encore que de quelques jours d'utilisation, donc trop tôt pour juger des effets à long terme de cette phase de lune de miel
Pourquoi il fallait réguler la température du lit
- Le sommeil aide l'immunité, les fonctions cognitives et la récupération après l'activité physique, mais les gros titres sur la santé peuvent faire disparaître les nuances scientifiques ; l'auteur attache donc de l'importance au fait que les affirmations soient étayées par des soignants ou un consensus d'experts
- À cause du TDAH, le fil des pensées se prolonge et l'endormissement est difficile ; l'habitude de lire au lit aide à réduire la stimulation et à envoyer au système nerveux le signal du coucher
- En raison de traits autistiques, l'auteur est sensible à certaines textures et sensations, et régule difficilement sa température corporelle ; pour s'endormir, la température et le poids de la couverture doivent être adaptés
- Dans le nouvel appartement à Portland, la climatisation n'est présente que dans le salon et il n'y a pas de ventilateur de plafond, si bien que la chambre en étage élevé devient l'endroit le plus chaud la nuit
- L'installation de capteurs de température a aussi confirmé que la chambre était la pièce la plus chaude de l'appartement
- Sommeil irrégulier, prise de stimulants, chambre étouffante et sensibilité thermique se cumulant, la décision a été prise de dépenser de l'argent pour un système de régulation thermique du lit
Pourquoi choisir le Chilipad 2.0
- Le Chilipad 2.0 contrôle la température du lit en reliant un fin surmatelas rempli d'eau à un appareil intégrant pompe, réservoir et régulateur thermique
- Le BedJet, qui souffle de l'air avec un ventilateur, a été écarté car en été l'air froid soufflerait directement sur les pieds
- Le modèle le moins cher d'Eight Sleep coûte tout de même 3 000 dollars, nécessite un abonnement et inclut même des fonctions IA, ce qui l'a exclu de l'achat
- Le Chilipad est un produit modulaire qu'on peut acheter d'abord pour un seul côté du lit, ce qui réduit le prix initial
- Avec deux unités installées, il est possible de régler chaque côté à une température différente, utile pour les couples qui ne perçoivent pas la chaleur de la même façon
- C'est un produit connecté à Internet, mais il prend en charge le mode avion et inclut une télécommande Bluetooth par défaut
- Il n'a pas été vérifié si le mode avion ne coupe que le Wi‑Fi ou bloque toutes les connexions sans fil
- Au départ, l'auteur a cru à tort qu'il s'agissait d'une API locale, mais en réalité l'appareil communique avec un service cloud
- Le fabricant fournit une API développeur, une collection Postman, une interface Swagger UI en ligne et un schéma OpenAPI
Composition de l'appareil Chilipad
- Le Chilipad se compose du dock, l'unité de contrôle, et d'un cover dans lequel circule l'eau
- Le dock contient le régulateur thermique, la pompe et le réservoir
- Il est placé au pied du lit, près de la porte, afin de limiter la rediffusion dans la chambre de l'air chaud rejeté par l'échangeur thermique
- Le cover est formé de trois couches : une couche de base, une hydrolayer en membrane TPU et un cover supérieur
- En ouvrant la fermeture du cover supérieur, l'utilisateur installe la hydrolayer du côté où il dort
- La partie supérieure utilise un tissu au toucher frais et un rembourrage fin, de sorte que la hydrolayer ne se sent pas directement
API Sleep.me
-
Authentification et exemples Postman
- Pour utiliser l'API, il faut d'abord générer un token utilisateur, et la documentation n'est accessible qu'avec un compte
- Les exemples Postman sont utiles quand les détails de la documentation manquent, mais ils exigent un compte entreprise séparé et leur configuration est complexe
- L'auteur préfère des alternatives comme des scripts
hurlopen source - La plupart des exemples contiennent des fautes dans les noms de variables
- Il faut utiliser
{{SleepMeAPI_Url}}sensible à la casse, et non{{SleepMeAPI_URL}} - L'exemple « Set Device Status » règle
set_temperature_fsur 69 etthermal_control_statussurstandby
-
Endpoints et structure des réponses
- L'API fournit deux types d'endpoints : l'un pour la liste des appareils, l'autre pour un appareil individuel
GET /devices: renvoie la liste des appareils liés au tokenGET /devices/{:id}: renvoie toutes les informations d'un appareil donnéPATCH /devices/{:id}: modifie les propriétés de l'appareil- Chaque élément de
/devicesinclut l'ID de l'appareil, le nom défini par l'utilisateur etattachments - Il n'est pas certain que
attachmentsdésigne d'autres appareils connectés - La réponse détaillée est divisée en objets
about,controletstatusabout: informations en lecture seule comme la version du firmware, l'IP externe, l'IP LAN, l'adresse MAC, le modèle et le numéro de sériecontrol: propriétés modifiables comme la luminosité de l'écran, l'unité de température affichée, la température de consigne, l'état du contrôle thermique et le fuseau horairestatus: état en lecture seule, avec notamment la connectivité API, l'absence d'eau, le niveau d'eau de 0 à 100 et la température actuelle de l'eau
- Les propriétés de
controlpeuvent varier selon l'appareil, et des clés non documentées commebrightness_levelpeuvent aussi être renvoyées thermal_control_statusvautactiveoustandbyet indique si l'appareil régule activement la température
-
Valeurs de température et contrôle de l'appareil
- Les températures en Fahrenheit sont traitées comme des entiers, celles en Celsius comme des nombres flottants
- La plage normale va de 55 à 115°F ou de 13,0 à 48,0°C
MAX_COLDest représenté par-1ou-1.0, etMAX_HEATpar999ou999.0- Quand l'appareil est en veille, la valeur
-1dansstatus.water_temperature_*semble être une valeur sentinelle, mais ce n'est pas documenté - Pour modifier les propriétés d'un appareil, il suffit d'envoyer une requête
PATCHavec dans le corps JSON uniquement les clés à changer - Pour régler seulement la température en Fahrenheit à 73, il faut envoyer
{ "set_temperature_f": 73 } - Il n'est pas nécessaire d'inclure toutes les clés de contrôle ni d'envelopper le tout dans
{ "control": ... } - Cette méthode de requête a été confirmée via la collection Postman, et non par la documentation officielle
Structure et usage de bedctl
bedctlest construit autour d'un module Zig, et la CLI n'est qu'un wrapper léger qui appelle cette bibliothèque- Son nom reprend la convention du suffixe
-ctlpour les programmes de contrôle, avec en prime le jeu de sonorité entre « bed cuttle » et « bed cuddle » - Principales commandes :
bedctl devices: consulter les noms et ID des appareils enregistrés pour le tokenbedctl status: consulter le firmware, les adresses réseau, le modèle, la température définie, l'état de fonctionnement, le niveau d'eau et la température observéebedctl set temp 74: définir la température cible
- Le token et l'ID de l'appareil peuvent être fournis via des variables d'environnement ou avec les options
--tokenet--device
Pourquoi Zig et quelles dépendances
- Après environ 5 ans d'usage professionnel de Rust et un usage loisir depuis 2018, l'auteur a choisi Zig, qu'il préfère actuellement pour son retour immédiat et sa moindre charge mentale
- Sur un MacBook Pro M1 Max,
zig build check --watch -fincrementalse met à jour en environ 75 ms - La seule dépendance externe de la CLI est un argument parser extrait et modifié à partir du code de TigerBeetle, puis adapté à Zig 0.16.0
- La bibliothèque elle-même n'a aucune dépendance en dehors de la bibliothèque standard Zig et utilise
std.http.Clientpour les requêtes HTTP - La CLI n'est pas liée à
libc, et la future bibliothèque dynamique devrait elle aussi fonctionner sanslibc - Les capacités de cross-compilation natives de Zig permettent de produire des builds pour les plateformes prises en charge sans accès direct aux systèmes cibles
Modèle de données et système de types
- Les structures centrales sont
Devicepour la liste des appareils etDeviceStatuspour la réponse détailléeDevicecontientid,nameetattachmentsDeviceStatusse compose deDevice.About,Device.ControletDevice.Status
- Les propriétés de
Controlpouvant être absentes selon le modèle, la luminosité, l'unité d'affichage, la température de consigne, l'état de fonctionnement et le fuseau horaire sont représentés par des valeurs optionnelles - Au lieu d'utiliser directement des chaînes JSON, le code s'appuie sur les enum anonymes de Zig
- Pour l'unité de température :
.cet.f - Pour l'état du contrôle thermique :
.activeet.standby
- Pour l'unité de température :
- La température de consigne en Fahrenheit donne des noms d'enum parlants à certaines valeurs entières spécifiques
- Au lieu de mémoriser
-1, on peut utiliser.max_cold - Une température normale peut être passée comme littéral entier, par exemple
78
- Au lieu de mémoriser
- L'auteur n'a pas trouvé de moyen d'imposer par le type la plage valide 55–115°F, et n'effectue pas non plus de validation séparée avant l'envoi de la requête
- Les valeurs Celsius étant flottantes, leur plage autorisée ne peut pas être exprimée dans le système de types
Expérience d'implémentation du client HTTP Zig
- Le client HTTP standard de Zig demande une procédure plus bas niveau qu'une simple abstraction URI/corps/
send- création d'un objet URI
- modification de l'URI pour y spécifier le chemin
- création d'un objet requête à partir de l'URI de base, des en-têtes et de la configuration de connexion
- envoi des en-têtes de requête
- réception des en-têtes de réponse
- création d'un reader pour le corps
- lecture du corps de réponse depuis ce reader
- Cela permet un contrôle précis, mais contrairement à Rust où l'on peut descendre au bas niveau seulement quand c'est nécessaire, Zig donne ici l'impression de travailler en bas niveau en permanence
- L'implémentation de
/devicesenvoie une requêteGETavec l'en-tête d'authentification viasendBodiless(), lit jusqu'à 64 000 octets de réponse, puis parse le JSON en[]const Device parseFromSliceLeakyest utilisé, mais la configuration d'arena allocator non exposée publiquement évite tout problème de libération mémoire
Projet d'extension vers une bibliothèque dynamique
- L'objectif final est de créer une bibliothèque dynamique sans dépendances utilisable depuis des langages de plus haut niveau
- L'architecture prévue est la suivante
- module Zig
bedctl - CLI
bedctlutilisant directement le module Zig libbedctl, qui expose une interface C au module Zigbedctl-dl, qui utilise la bibliothèque dynamique et vérifie lui-même l'interface C
- module Zig
- Si un wrapper Python voit le jour, l'auteur aimerait l'utiliser dans Home Assistant, mais ne prévoit pas de l'écrire lui-même
- Le build de la bibliothèque dynamique et son interface ne sont pas encore prêts, mais devraient être ajoutés prochainement
Quelques jours d'usage et effets sur le sommeil
- Au bout de quelques jours d'utilisation, l'impression subjective est celle d'un meilleur sommeil, et le tracker fitness montre une phase de sommeil récupérateur plus longue ainsi qu'une baisse du nombre de réveils nocturnes
- Même après avoir bu du whisky, l'auteur a mieux dormi que d'habitude, mais il ne faut pas interpréter cela comme une preuve que l'alcool améliore le sommeil
- L'alcool reste nuisible à la santé et au sommeil ; au mieux, l'appareil a peut-être atténué une partie de cette dégradation
- L'appareil n'est utilisé que depuis quelques jours et
bedctla été écrit en environ trois nuits, donc les résultats sont encore dans une phase de lune de miel - Quand la température a été réglée trop bas au début, la sensation évoquait le fait d'être allongé sur une surface mouillée, mais cela a disparu après ajustement
- Le temps de transition n'a pas été mesuré directement, mais il semble plus proche de 1 minute que de 10 minutes
- Comme il faut moins d'un gallon d'eau pour le remplir, la capacité thermique à chauffer ou refroidir n'est pas énorme
Télécommande, ventilateur et chauffage
- La télécommande fournie a la forme d'une grosse molette avec écran tactile, ce qui facilite le changement immédiat de température pendant qu'on ajuste les programmations
- Le toucher de la molette n'est pas particulièrement satisfaisant, mais elle vibre à chaque unité de température, ce qui permet de l'ajuster sans regarder l'écran
- Même avec un masque de sommeil, le retour haptique permet de savoir de combien la valeur a changé
- Un léger flux d'air reste nécessaire ; auparavant, il fallait trouver un compromis entre une ventilation suffisante pour rafraîchir la pièce et une intensité qui ne souffle pas directement sur le corps ni n'assèche les voies respiratoires
- Depuis l'utilisation du Chilipad, il suffit de laisser le ventilateur sur son niveau le plus faible
- Relever légèrement la température le matin donne une sensation douillette, et l'auteur attend avec intérêt la fonction de préchauffage du lit en hiver
- L'ajout du surmatelas réduit un peu la respirabilité de la surface
- La sensation n'est pas celle d'être allongé sur du plastique, mais à température élevée, la peau en contact avec le lit semblait très légèrement moite
- Il s'agit d'une expérience liée aux particularités personnelles de thermorégulation, qui peut ne pas être la même pour d'autres utilisateurs
- L'expérience initiale est globalement positive, et un suivi pourrait être publié après la mise en place de la bibliothèque dynamique
1 commentaires
Commentaires sur Lobste.rs
Publication de ce billet juste avant de s’endormir, parfaitement dans le thème
bedctlcomme réveil en le configurant pour faire chuter fortement la température à une heure préciseLe titre comme le billet sont excellents. Je me demande aussi si tu as essayé une couverture lestée, et si ça a vraiment été efficace
Selon la façon dont c’est fabriqué, ça peut être peu respirant et assez cher. Après avoir acheté un Chilipad, c’est un peu gênant de parler de prix, mais un produit que j’avais noté pour y revenir plus tard est le https://bearaby.com/products/tree-napper, qui semble avoir une structure à tissage ouvert plus respirante
Je regarde ce type de produit et je pense qu’un jour j’essaierai moi-même. D’après cette vidéo, la meilleure solution en rapport qualité-prix, c’est un seau, mais dans ce cas il n’y a sans doute pas d’API
Article plus ou moins lié : https://trufflesecurity.com/blog/removing-jeff-bezos-from-my-bed (discussion)
Dans le passage qui compare les degrés Fahrenheit et Celsius, je suppose que tu ne voulais pas écrire Celsius is the better temperature
Le billet est amusant et je me reconnais beaucoup dans la façon de penser, notamment la partie sur le ventilateur, mais il n’est pas très clair ce que ce travail permet réellement de contrôler
Le paragraphe expliquant que ton expérience de doctorat en physique t’a appris à te méfier des articles science/santé tant qu’ils ne sont pas étayés peut donner une impression dangereuse, un peu proche de la défiance vaccinale. Je comprends néanmoins que tu veux dire que la thèse t’a appris à ne pas prendre les « faits » relayés par les médias de manière binaire, et je serais curieux de savoir plus précisément ce qui t’a laissé cette impression
Quand l’article d’Andrew Wakefield sur les vaccins est sorti, des gens qui n’avaient vu qu’un court article de journaliste basé sur le résumé affirmaient avec certitude que les vaccins étaient absolument dangereux, et même un professeur de biologie au lycée titulaire d’un master en zoologie ainsi que trois docteurs en physique se sont opposés aux vaccins. Pourtant, le consensus médical continuait d’affirmer que les vaccins étaient sûrs, efficaces et l’un des moyens les plus puissants de sauver des vies, et tous les chercheurs en médecine que j’ai rencontrés disaient la même chose
Si le doctorat m’a marqué, c’est parce qu’il m’a fait comprendre l’ampleur du fossé entre les découvertes réelles dans mon domaine et leur traitement dans l’actualité. Comme on ne peut pas comprendre entièrement tous les domaines, il faut faire confiance aux médecins pour la médecine, aux écologues pour l’environnement, aux climatologues pour le climat. J’ai vu des docteurs en physique « réfuter » des experts avec des maths de niveau collège et des sciences de niveau primaire, alors que les vrais spécialistes connaissaient l’énorme différence entre les connaissances scolaires et la connaissance du réel. Ayant constaté cet écart dans les domaines que j’ai étudiés, j’ai au contraire tendance à faire davantage confiance aux experts dans les domaines que je n’ai pas étudiés
S’ils acceptent qu’on balance n’importe quels champs avec la structure voulue, il y a de fortes chances que le gestionnaire fasse quelque chose comme une recherche par expression régulière du genre
re.search('set_temperature_f\": (\\d+)',...)