1 puntos por GN⁺ 17 시간 전 | 1 comentarios | Compartir por WhatsApp
  • 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 /devices y /devices/{:id}, y controlar con PATCH la 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ámica libbedctl con 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_f en 69 y thermal_control_status en standby
  • 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 token
    • GET /devices/{:id}: devuelve toda la información de un dispositivo específico
    • PATCH /devices/{:id}: modifica atributos del dispositivo
    • Cada elemento de /devices incluye el ID del dispositivo, el nombre definido por el usuario y attachments
    • No está claro si attachments significa otros dispositivos conectados
    • La respuesta detallada se divide en los objetos about, control y status
      • about: información de solo lectura como versión de firmware, IP externa, IP LAN, dirección MAC, modelo y número de serie
      • control: atributos modificables como brillo de pantalla, unidad de temperatura mostrada, temperatura configurada, estado de control térmico y zona horaria
      • status: 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 control pueden variar según el dispositivo, y a veces se devuelven claves no documentadas como brightness_level
    • thermal_control_status puede ser active o standby, 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_COLD se representa como -1 o -1.0, y MAX_HEAT como 999 o 999.0
    • Que status.water_temperature_* sea -1 en estado de espera parece ser un valor centinela, pero no está documentado
    • Para cambiar atributos del dispositivo, se envía una solicitud PATCH con 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

  • bedctl se 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 -ctl a 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 token
    • bedctl status: consulta firmware, direcciones de red, modelo, temperatura configurada, estado operativo, nivel de agua y temperatura observada
    • bedctl 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 --token y --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 -fincremental se 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.Client para las solicitudes HTTP
  • La CLI no enlaza con libc, y el plan es que la futura biblioteca dinámica también se construya sin libc
  • 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 Device para la lista de dispositivos y DeviceStatus para la respuesta detallada
    • Device incluye id, name y attachments
    • DeviceStatus está compuesto por Device.About, Device.Control y Device.Status
  • Como las propiedades de Control pueden 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 .c y .f
    • El estado de control térmico es .active y .standby
  • 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
  • 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 /devices envía una solicitud GET con el header de autenticación mediante sendBodiless(), 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 bedctl que usa directamente el módulo Zig
    • libbedctl, que proporciona una interfaz en C al módulo Zig
    • bedctl-dl, que usa la biblioteca dinámica y valida por su cuenta la interfaz en C
  • 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 bedctl fue 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

    • Me pregunto si también serviría para despertarte si configuras bedctl para bajar mucho la temperatura a cierta hora
  • Tanto 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ó

    • Antes usaba una manta con peso y en general me gustaba, pero me deshice de ella cuando me mudé. Aun así, no ayudaba con la regulación de la temperatura corporal, así que no era la solución que buscaba aquí
      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

    • También vi ese video, pero creo que una cubeta de Home Depot no pasaría la inexistente prueba de aprobación de la pareja 😅
  • 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

    • La idea es justamente la contraria. Que yo sea físico no significa que mis intuiciones sobre medicina de pronto sean especiales, así que en vez de leer unos cuantos artículos y hacerme pasar por médico, lo mejor es seguir a los expertos que sí han estudiado ese campo. No se trata de obedecer ciegamente a la autoridad, sino de reconocer que uno puede estar equivocado, y de esperar que otros respeten mi experiencia en las pocas áreas que sí he investigado
      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+)',...)