- Por tener un dormitorio caluroso y sensibilidad a la temperatura corporal, compró un Sleep.me Chilipad 2.0 por 1,700 dólares y desarrolló
bedctl, que controla la API en la nube del fabricante - Chilipad combina un topper delgado por el que circula agua con una bomba, un depósito y un termostato, y admite programación de temperatura por día de la semana y una configuración modular que permite instalarlo primero en un lado de la cama
- La API permite consultar dispositivos en
/devicesy/devices/{:id}, y controlar conPATCHla temperatura, el estado de operación, el brillo de la pantalla, la zona horaria, etc.; también permite revisar el nivel de agua y la temperatura actual del agua bedctl, escrito en Zig, está compuesto por una biblioteca sin dependencias y una CLI delgada, con planes de ampliarlo en el futuro como una biblioteca dinámicalibbedctlcon interfaz en C- En el seguimiento inicial del sueño aumentó el tiempo de sueño reparador y disminuyeron los despertares nocturnos, pero como solo lleva unos días de uso, todavía está en una fase de luna de miel y es pronto para evaluar el efecto a largo plazo
Por qué necesitaba regular la temperatura de la cama
- Dormir ayuda al sistema inmunológico, la función cognitiva y la recuperación después de la actividad física, pero en los titulares sobre salud se pueden perder los matices científicos, así que le da importancia a si están respaldados por profesionales de la salud o por consenso experto
- Por el ADHD, los pensamientos siguen encadenándose y le cuesta quedarse dormido; el hábito de leer en la cama le ha ayudado a reducir la estimulación y a enviarle al sistema nervioso la señal de que es hora de dormir
- Por rasgos autistas, es sensible a ciertas texturas y sensaciones, y también le cuesta regular la temperatura corporal; para poder dormirse, la temperatura y el peso de las cobijas deben ser adecuados
- En su nuevo departamento en Portland, el aire acondicionado está solo en la sala y no hay ventilador de techo, por lo que el dormitorio en un piso alto se vuelve el espacio más caluroso por la noche
- También instaló sensores de temperatura y confirmó que el dormitorio era la zona más caliente del departamento
- La combinación de sueño irregular, consumo de estimulantes, un dormitorio sofocante y sensibilidad a la temperatura corporal lo llevó a decidir gastar en un dispositivo para regular la temperatura de la cama
Por qué eligió Chilipad 2.0
- Chilipad 2.0 controla la temperatura de la cama conectando un topper delgado de colchón lleno de agua a un dispositivo que incluye bomba, depósito y termostato
- Descartó BedJet, que sopla aire con un ventilador, porque en verano el aire frío le daría directamente en los pies
- Descartó Eight Sleep porque incluso su modelo más barato cuesta 3,000 dólares, requiere suscripción e incluye funciones de IA
- Chilipad es un producto modular que permite comprar primero el equipo para un solo lado de la cama, por lo que el precio inicial es más bajo
- Si se instalan dos unidades, cada lado puede configurarse a una temperatura distinta, útil para parejas con diferente sensación térmica
- Aunque es un producto conectado a internet, admite modo avión e incluye de serie un control remoto Bluetooth
- No verificó si el modo avión apaga solo el Wi‑Fi o bloquea todas las conexiones inalámbricas
- Al principio lo entendió erróneamente como una API local, pero en realidad se comunica con un servicio en la nube
- El fabricante ofrece una API para desarrolladores, una colección de Postman, una Swagger UI en línea y un esquema OpenAPI
Configuración del dispositivo Chilipad
- Chilipad está compuesto por el dock, que es la unidad de control, y un cover por el que circula agua
- El dock contiene el termostato, la bomba y el depósito
- Lo colocó al pie de la cama y cerca de la puerta para reducir que el aire caliente expulsado por el intercambiador de calor se volviera a dispersar dentro del dormitorio
- El cover consta de tres capas: una capa inferior, una hydrolayer hecha con una membrana de TPU y el cover superior
- Se abre el cierre del cover superior para instalar la hydrolayer del lado donde duerme la persona
- En la parte superior se usa una tela fresca al tacto y un acolchado delgado, de modo que la hydrolayer no se siente directamente
API de Sleep.me
-
Autenticación y ejemplos de Postman
- Para usar la API primero hay que generar un token de usuario, y la documentación requiere tener una cuenta para acceder
- Los ejemplos de Postman ayudan cuando faltan detalles en la documentación, pero requieren una cuenta corporativa aparte y la configuración también es compleja
- Prefiere alternativas como scripts open source de
hurl - La mayoría de los ejemplos tienen errores tipográficos en nombres de variables
- Hay que usar
{{SleepMeAPI_Url}}, respetando mayúsculas y minúsculas, no{{SleepMeAPI_URL}} - El ejemplo “Set Device Status” configura
set_temperature_fen 69 ythermal_control_statusenstandby
-
Endpoints y estructura de respuestas
- La API ofrece dos tipos de endpoints: uno para la lista de dispositivos y otro para dispositivos individuales
GET /devices: devuelve la lista de dispositivos vinculados al tokenGET /devices/{:id}: devuelve toda la información de un dispositivo específicoPATCH /devices/{:id}: modifica atributos del dispositivo- Cada elemento de
/devicesincluye el ID del dispositivo, el nombre definido por el usuario yattachments - No está claro si
attachmentssignifica otros dispositivos conectados - La respuesta detallada se divide en los objetos
about,controlystatusabout: información de solo lectura como versión de firmware, IP externa, IP LAN, dirección MAC, modelo y número de seriecontrol: atributos modificables como brillo de pantalla, unidad de temperatura mostrada, temperatura configurada, estado de control térmico y zona horariastatus: estado de solo lectura, como si está conectado a la API, si falta agua, nivel de agua de 0 a 100 y temperatura actual del agua
- Las propiedades de
controlpueden variar según el dispositivo, y a veces se devuelven claves no documentadas comobrightness_level thermal_control_statuspuede seractiveostandby, e indica si el dispositivo está regulando activamente la temperatura
-
Valores de temperatura y control del dispositivo
- Las temperaturas en Fahrenheit se manejan como enteros y las temperaturas en Celsius como números de punto flotante
- El rango normal es 55–115°F o 13.0–48.0°C
MAX_COLDse representa como-1o-1.0, yMAX_HEATcomo999o999.0- Que
status.water_temperature_*sea-1en estado de espera parece ser un valor centinela, pero no está documentado - Para cambiar atributos del dispositivo, se envía una solicitud
PATCHcon solo las claves que se quieren modificar en el cuerpo JSON - Para configurar únicamente la temperatura Fahrenheit en 73, se envía
{ "set_temperature_f": 73 } - No hace falta incluir todas las claves de control ni envolverlas en
{ "control": ... } - Esta forma de hacer la solicitud se confirmó mediante la colección de Postman, no por la documentación oficial
Estructura y uso de bedctl
bedctlse construyó alrededor de un módulo Zig, y la CLI es un wrapper delgado que llama a esa biblioteca- El nombre sigue la convención de añadir el sufijo
-ctla programas de control, y también toma en cuenta que “bed cuttle” suena como “bed cuddle” - Los comandos principales son los siguientes
bedctl devices: consulta los nombres e IDs de los dispositivos registrados en el tokenbedctl status: consulta firmware, direcciones de red, modelo, temperatura configurada, estado operativo, nivel de agua y temperatura observadabedctl set temp 74: configura la temperatura objetivo
- El token y el ID del dispositivo pueden especificarse mediante variables de entorno o pasarse con las flags
--tokeny--device
Por qué eligió Zig y dependencias
- Aunque usó Rust unos 5 años en el trabajo y desde 2018 como hobby, lo implementó en Zig, que últimamente prefiere, porque quería retroalimentación inmediata y una menor carga mental
- En una MacBook Pro con M1 Max,
zig build check --watch -fincrementalse actualiza en unos 75 ms - La única dependencia externa de la CLI es un parser de argumentos extraído y modificado del código de TigerBeetle, adaptado a Zig 0.16.0
- La biblioteca no tiene dependencias aparte de la biblioteca estándar de Zig, y usa
std.http.Clientpara las solicitudes HTTP - La CLI no enlaza con
libc, y el plan es que la futura biblioteca dinámica también se construya sinlibc - Gracias a la capacidad básica de cross-compilation de Zig, puede crear builds para plataformas soportadas sin acceso directo al sistema de destino
Modelo de datos y sistema de tipos
- Las estructuras centrales son
Devicepara la lista de dispositivos yDeviceStatuspara la respuesta detalladaDeviceincluyeid,nameyattachmentsDeviceStatusestá compuesto porDevice.About,Device.ControlyDevice.Status
- Como las propiedades de
Controlpueden no existir según el modelo, representa como valores opcionales el brillo, la unidad mostrada, la temperatura configurada, el estado de operación y la zona horaria - En lugar de usar cadenas JSON directamente, aprovecha los enum anónimos de Zig
- La unidad de temperatura es
.cy.f - El estado de control térmico es
.activey.standby
- La unidad de temperatura es
- Para la temperatura configurada en Fahrenheit, asigna nombres de enum con significado a valores enteros específicos
- En vez de recordar
-1, se puede usar.max_cold - Las temperaturas normales pueden pasarse como literales enteros como
78
- En vez de recordar
- No encontró una forma de limitar solo con el tipo el rango válido de 55–115°F, y tampoco hace una validación separada antes de la solicitud
- Como los valores en Celsius son de punto flotante, no pudo representar el rango permitido mediante el tipo
Experiencia implementando el cliente HTTP en Zig
- El cliente HTTP estándar de Zig exige un procedimiento de más bajo nivel que una abstracción simple de URI, cuerpo y
send- Crear el objeto URI
- Modificar la URI para especificar la ruta
- Crear el objeto de solicitud con la URI base, headers y configuración de conexión
- Enviar la cabecera de la solicitud
- Recibir la cabecera de la respuesta
- Crear el reader del cuerpo
- Consumir el cuerpo de la respuesta desde el reader
- Permite un control preciso, pero a diferencia de Rust, donde se puede bajar de nivel solo cuando hace falta, en Zig se siente como estar haciendo siempre trabajo de bajo nivel
- La implementación de
/devicesenvía una solicitudGETcon el header de autenticación mediantesendBodiless(), luego lee la respuesta hasta un máximo de 64,000 bytes y parsea el JSON como[]const Device - Usa
parseFromSliceLeaky, pero gracias a una configuración con arena allocator que no expone hacia afuera, no hay problema de liberación de memoria
Planes para extenderlo como biblioteca dinámica
- El objetivo final es crear una biblioteca dinámica sin dependencias usable desde lenguajes de más alto nivel
- La estructura prevista es la siguiente
- Módulo Zig
bedctl - CLI
bedctlque usa directamente el módulo Zig libbedctl, que proporciona una interfaz en C al módulo Zigbedctl-dl, que usa la biblioteca dinámica y valida por su cuenta la interfaz en C
- Módulo Zig
- Si se crea un wrapper para Python, le gustaría usarlo en Home Assistant, pero no planea escribirlo personalmente
- El build de la biblioteca dinámica y la interfaz aún no están listos, y planea agregarlos pronto
Experiencia de sueño tras unos días de uso
- Durante los pocos días de uso, subjetivamente durmió profundo, y su fitness tracker también mostró fases de sueño reparador más largas y menos despertares nocturnos
- Incluso durmió mejor que de costumbre un día en que tomó whisky, pero eso no debe interpretarse como que el alcohol sea bueno para dormir
- El alcohol sigue siendo dañino para la salud y el sueño; solo es posible que el dispositivo haya reducido parte del deterioro del sueño
- Como apenas lleva unos días usando el dispositivo y
bedctlfue escrito a lo largo de unas 3 noches, los resultados todavía están en la fase de luna de miel - Cuando al principio configuró la temperatura demasiado baja, sintió una frialdad como si estuviera acostado sobre algo mojado, pero desapareció tras ajustar la temperatura
- No midió directamente el tiempo de transición, pero se sintió rápido, más cerca de 1 minuto que de 10 minutos
- Como requiere menos de 1 galón de agua para llenarse, no hay una gran capacidad térmica que calentar o enfriar
Control remoto, ventilador y uso de calor
- El control remoto incluido tiene forma de una perilla grande con pantalla táctil, por lo que es fácil cambiar la temperatura de inmediato mientras ajusta la temperatura programada
- La sensación táctil de la perilla no es satisfactoria, pero vibra por cada unidad de temperatura, así que se puede ajustar sin mirar la pantalla
- Incluso usando antifaz para dormir, la retroalimentación háptica permite saber cuánto cambió
- También necesita un flujo de aire suave; antes tenía que equilibrar al mismo tiempo el caudal necesario para enfriar la habitación y una intensidad que no le pegara directamente al cuerpo ni le secara las vías respiratorias
- Después de usar Chilipad, basta con encender el ventilador en el nivel más bajo
- Subir un poco la temperatura por la mañana se siente acogedor, y espera usar en invierno la función de precalentar la cama
- Al poner el topper, la transpirabilidad de la base disminuye un poco
- No se siente como acostarse sobre plástico, pero a temperaturas altas notó una sensación muy leve de sudor en la piel que estaba en contacto con la cama
- Es una experiencia ligada a sus características personales de regulación térmica, así que puede no ser igual para otros usuarios
- La experiencia inicial en general es positiva, y es posible que publique una actualización después de preparar la biblioteca dinámica
1 comentarios
Opiniones de Lobste.rs
Publicó esto justo antes de quedarse dormido, muy acorde con el tema
bedctlpara bajar mucho la temperatura a cierta horaTanto el título como el texto están buenísimos. Me pregunto si también ha probado una manta con peso y si de verdad le funcionó
Dependiendo de cómo esté hecha, puede tener poca ventilación y además ser cara. Después de comprar un Chilipad me da hasta pena decir que algo es caro, pero el producto que guardé para revisar después es este de tejido abierto que se ve bien transpirable: https://bearaby.com/products/tree-napper
Llevo tiempo viendo este tipo de productos y algún día pienso probar uno. Según este video, la solución con mejor relación costo-beneficio es una cubeta, aunque en ese caso seguramente no hay API
Un artículo algo relacionado: https://trufflesecurity.com/blog/removing-jeff-bezos-from-my-bed (discusión)
En la parte donde compara Fahrenheit y Celsius, supongo que no quiso escribir Celsius is the better temperature
El texto es divertido y coincido bastante con la forma de pensar, incluida la parte sobre los ventiladores, pero no queda claro qué logró controlar con este trabajo
El párrafo donde dice que, por su experiencia como doctor en física, desconfía de la cobertura científica y de salud hasta ver pruebas puede sonar peligrosamente parecido al escepticismo antivacunas. Aun así, lo interpreto como que el doctorado le hizo dejar de aceptar los “hechos” de la prensa en blanco y negro, y me da curiosidad qué fue exactamente lo que le dejó esa mala experiencia
Cuando salió el artículo de Andrew Wakefield sobre vacunas, hubo gente que leyó una nota breve escrita por periodistas que apenas habían leído el resumen y concluyó tajantemente que las vacunas eran absolutamente peligrosas; entre ellos, un profesor de biología de preparatoria con maestría en zoología y hasta tres doctores en física se opusieron a las vacunas. Pero el consenso médico seguía siendo que las vacunas son seguras, eficaces y una de las herramientas más poderosas para salvar vidas, y todos los investigadores médicos que conocí coincidían en eso
Lo que me marcó del doctorado fue darme cuenta de lo enorme que es la brecha entre los descubrimientos reales en mi campo y cómo los reportan las noticias. Como no podemos entender por completo todas las áreas, hay que confiar en médicos para medicina, ecólogos para medio ambiente y climatólogos para clima. He visto doctores en física “refutar” a expertos con matemáticas de secundaria y ciencia de primaria, mientras que los verdaderos especialistas sí entendían la enorme diferencia entre el conocimiento escolar y el conocimiento de la realidad. Como vi esa brecha en el área que estudié, termino confiando todavía más en los expertos en las áreas que no estudié
Si puedes aventar campos con cualquier estructura, seguro que en el manejador están haciendo algo como una búsqueda con regex tipo
re.search('set_temperature_f\": (\\d+)',...)