1 पॉइंट द्वारा GN⁺ 17 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • गर्म बेडरूम और शरीर के तापमान के प्रति संवेदनशीलता के कारण Sleep.me Chilipad 2.0 को 1,700 डॉलर में खरीदा और निर्माता के cloud API को नियंत्रित करने वाला bedctl विकसित किया
  • Chilipad पानी के सर्कुलेशन वाले पतले topper और pump·reservoir·temperature controller को जोड़ता है, और सप्ताह के दिनों के हिसाब से तापमान scheduling तथा बेड के एक तरफ से installation शुरू करने वाली modular configuration को support करता है
  • API /devices और /devices/{:id} पर devices की जानकारी देखता है और PATCH से तापमान·operating status·screen brightness·time zone आदि को नियंत्रित करता है; water level और current water temperature भी देखे जा सकते हैं
  • Zig में लिखा bedctl dependency-free library और पतले CLI से बना है, और आगे C interface वाले libbedctl dynamic library में विस्तार करने की योजना है
  • शुरुआती sleep tracking में recovery sleep time बढ़ा और रात में जागना कम हुआ, लेकिन use period सिर्फ कुछ दिनों का honeymoon phase है, इसलिए long-term असर का आकलन करने के लिए अभी जल्दी है

बेड तापमान नियंत्रण की जरूरत क्यों पड़ी

  • नींद immunity, cognitive function और physical activity के बाद recovery में मदद करती है, लेकिन health headlines में scientific nuance गायब हो सकता है, इसलिए यह देखना महत्वपूर्ण है कि क्या बात medical staff या expert consensus से समर्थित है
  • ADHD के कारण विचार लगातार चलते रहते हैं और सोना कठिन होता है; बेड पर पढ़ने की आदत से stimulation घटाकर nervous system को bedtime signal देता रहा हूँ
  • autistic traits के कारण खास textures और sensations के प्रति संवेदनशीलता है और body temperature control भी मुश्किल है; सोने के लिए temperature और blanket weight सही होना चाहिए
  • Portland के नए apartment में air conditioner सिर्फ living room में है और ceiling fan भी नहीं है, इसलिए ऊपरी मंजिल का bedroom रात में सबसे गर्म जगह बन जाता है
    • temperature sensors लगाकर यह भी पुष्टि की कि bedroom apartment में सबसे गर्म है
  • irregular sleep, stimulant medication, घुटन भरा bedroom और temperature sensitivity मिलकर bed temperature control device पर खर्च करने का फैसला किया

Chilipad 2.0 क्यों चुना

  • Chilipad 2.0 पानी भरे पतले mattress topper को pump·reservoir·temperature controller वाले device से जोड़कर bed temperature नियंत्रित करता है
  • हवा फूंकने वाला BedJet इसलिए हटाया क्योंकि गर्मियों में ठंडी हवा सीधे पैरों पर लगती
  • Eight Sleep का सबसे सस्ता model भी 3,000 डॉलर का है, subscription चाहिए, और AI features भी शामिल हैं, इसलिए उसे खरीदने की सूची से बाहर किया
  • Chilipad modular product है जिसमें bed के एक तरफ के लिए device पहले खरीदा जा सकता है, इसलिए initial price कम है
    • दो units लगाने पर दोनों तरफ अलग-अलग temperature set किए जा सकते हैं, जो अलग thermal comfort वाले couples के लिए उपयोगी है
  • यह internet-connected product है, लेकिन airplane mode support करता है और Bluetooth remote default में देता है
    • airplane mode सिर्फ Wi-Fi बंद करता है या सभी wireless connections block करता है, यह पुष्टि नहीं की
    • शुरुआत में इसे local API समझा था, लेकिन वास्तव में यह cloud service से communicate करता है
  • निर्माता developer API, Postman collection, online Swagger UI और OpenAPI schema देता है

Chilipad device configuration

  • Chilipad control device dock और पानी circulate करने वाले cover से बना है
    • dock में temperature controller, pump और reservoir होते हैं
    • इसे bed के foot और दरवाजे के पास रखा, ताकि heat exchanger से निकली गर्म हवा bedroom में फिर से फैलना कम हो
  • cover तीन layers से बना है: bottom layer, TPU membrane से बना hydrolayer, और top cover
    • top cover की zipper खोलकर user के सोने वाली तरफ hydrolayer लगाया जाता है
    • top में touch पर cool लगने वाला fabric और thin padding इस्तेमाल होती है, ताकि hydrolayer सीधे महसूस न हो

Sleep.me API

  • authentication और Postman examples

    • API इस्तेमाल करने के लिए पहले user token बनाना होता है, और documentation access करने के लिए account चाहिए
    • Postman examples documentation में details कम होने पर मदद करते हैं, लेकिन अलग company account चाहिए और configuration भी complex है
    • open source hurl scripts जैसे alternatives पसंद हैं
    • ज्यादातर examples में variable name typo है
    • {{SleepMeAPI_URL}} नहीं, case-sensitive {{SleepMeAPI_Url}} इस्तेमाल करना होगा
    • “Set Device Status” example set_temperature_f को 69 और thermal_control_status को standby पर set करता है
  • endpoints और response structure

    • API device list और individual devices संभालने वाले दो तरह के endpoints देता है
    • GET /devices: token से जुड़े devices की list लौटाता है
    • GET /devices/{:id}: किसी specific device की पूरी जानकारी लौटाता है
    • PATCH /devices/{:id}: device properties बदलता है
    • /devices के हर item में device ID, user-defined name और attachments शामिल होते हैं
    • attachments का मतलब connected other devices है या नहीं, यह पक्का नहीं है
    • detailed response about, control, status objects में बंटा होता है
      • about: firmware version, external IP, LAN IP, MAC address, model और serial number जैसी read-only जानकारी
      • control: screen brightness, display temperature unit, set temperature, temperature control status और time zone जैसी बदलने योग्य properties
      • status: API connection status, low-water स्थिति, 0~100 water level और current water temperature जैसी read-only status
    • control properties device के हिसाब से अलग हो सकती हैं, और documentation में न होने वाली brightness_level जैसी keys भी लौट सकती हैं
    • thermal_control_status active या standby होता है और बताता है कि device temperature को actively regulate कर रहा है या नहीं
  • temperature values और device control

    • Fahrenheit temperature integers और Celsius temperature floating-point values के रूप में handle होते हैं
    • normal range Fahrenheit 55~115°F, Celsius 13.0~48.0°C है
    • MAX_COLD को -1 या -1.0, MAX_HEAT को 999 या 999.0 से represent किया जाता है
    • standby state में status.water_temperature_* का -1 होना sentinel value लगता है, लेकिन documented नहीं है
    • device properties बदलते समय JSON body में सिर्फ वही keys डालकर PATCH request भेजते हैं जिन्हें बदलना है
    • केवल Fahrenheit temperature 73 पर set करने के लिए { "set_temperature_f": 73 } भेजते हैं
    • सभी control keys शामिल करने या { "control": ... } में wrap करने की जरूरत नहीं है
    • यह request method official documentation से नहीं, बल्कि Postman collection से confirm हुआ

bedctl की संरचना और usage

  • bedctl Zig module के इर्द-गिर्द बनाया गया है, और CLI उस library को call करने वाला thin wrapper है
  • नाम control programs में -ctl suffix लगाने की convention का अनुसरण करता है, और “bed cuttle” के “bed cuddle” जैसा सुनाई देने वाली बात भी reflected है
  • मुख्य commands ये हैं
    • bedctl devices: token में registered device names और IDs देखें
    • bedctl status: firmware, network addresses, model, set temperature, operating status, water level और observed temperature देखें
    • bedctl set temp 74: target temperature set करें
  • token और device ID environment variables से specify किए जा सकते हैं या --token, --device flags से pass किए जा सकते हैं

Zig चुनने की वजह और dependencies

  • Rust को काम में करीब 5 साल और hobby में 2018 से इस्तेमाल किया है, लेकिन immediate feedback और कम mental overhead चाहिए था, इसलिए हाल में पसंदीदा Zig में implement किया
  • M1 Max MacBook Pro पर zig build check --watch -fincremental लगभग 75ms में update होता है
  • CLI की अकेली external dependency TigerBeetle code से निकाला और modify किया गया, Zig 0.16.0 के लिए adapted argument parser है
  • library की Zig standard library के अलावा कोई dependency नहीं है, और HTTP requests के लिए std.http.Client का उपयोग होता है
  • CLI libc से link नहीं करता, और future dynamic library भी libc के बिना बनाने की योजना है
  • Zig की built-in cross-compilation capability से target system तक direct access के बिना supported platforms के लिए builds बनाए जा सकते हैं

data model और type system

  • core structs device list के लिए Device और detailed response के लिए DeviceStatus हैं
    • Device में id, name, attachments शामिल हैं
    • DeviceStatus, Device.About, Device.Control, Device.Status से बना है
  • Control properties model के हिसाब से गायब हो सकती हैं, इसलिए brightness, display unit, set temperature, operating status और time zone को optional values के रूप में express किया गया है
  • JSON strings को सीधे लिखने के बजाय Zig के anonymous enum का उपयोग किया गया है
    • temperature units .c और .f
    • temperature control status .active और .standby
  • Fahrenheit set temperature में specific integer values को meaningful enum names दिए गए हैं
    • -1 याद रखने के बजाय .max_cold इस्तेमाल किया जा सकता है
    • normal temperature 78 जैसे integer literal से pass किया जा सकता है
  • केवल type से normal range 55~115°F को restrict करने का तरीका नहीं मिला, और request से पहले अलग validation भी नहीं किया
  • Celsius values floating-point हैं, इसलिए allowed range को type से express नहीं किया जा सका

Zig HTTP client implementation experience

  • Zig standard HTTP client simple URI·body·send abstraction से low-level procedure मांगता है
    • URI object बनाना
    • path specify करने के लिए URI बदलना
    • base URI, headers और connection settings से request object बनाना
    • request head भेजना
    • response head receive करना
    • body reader बनाना
    • reader से response body consume करना
  • precise control संभव है, लेकिन Rust की तरह जरूरत पड़ने पर ही low-level में उतरने के बजाय Zig में लगातार low-level काम करते रहने जैसा लगता है
  • /devices implementation authentication header के साथ GET request को sendBodiless() से भेजता है, फिर response को maximum 64,000 bytes तक पढ़कर JSON को []const Device में parse करता है
  • parseFromSliceLeaky का उपयोग करता है, लेकिन बाहर expose न किए गए arena allocator setup की वजह से memory free करने की समस्या नहीं है

dynamic library विस्तार की योजना

  • अंतिम लक्ष्य high-level languages में इस्तेमाल की जा सकने वाली dependency-free dynamic library बनाना है
  • planned structure इस प्रकार है
    • Zig module bedctl
    • Zig module को सीधे इस्तेमाल करने वाला CLI bedctl
    • Zig module को C interface देने वाला libbedctl
    • dynamic library का उपयोग करने और C interface को self-validate करने वाला bedctl-dl
  • Python wrapper बने तो Home Assistant में इस्तेमाल करना चाहूंगा, लेकिन खुद लिखने की योजना नहीं है
  • dynamic library build और interface अभी तैयार नहीं हैं, और निकट भविष्य में जोड़ने की योजना है

कुछ दिनों तक इस्तेमाल का sleep experience

  • इस्तेमाल किए गए कुछ दिनों में subjective तौर पर अच्छी नींद आई, और fitness tracker में भी recovery sleep stages लंबे हुए और रात में जागने की संख्या कम हुई
  • whisky पीने वाले दिन भी सामान्य से बेहतर नींद आई, लेकिन इसे इस तरह नहीं समझना चाहिए कि शराब नींद के लिए अच्छी है
    • alcohol अभी भी health और sleep के लिए हानिकारक है, बस device ने sleep deterioration को कुछ कम किया हो सकता है
  • device इस्तेमाल किए हुए सिर्फ कुछ दिन हुए हैं और bedctl भी लगभग 3 रातों में लिखा गया, इसलिए results अभी honeymoon phase में हैं
  • शुरुआत में temperature बहुत low set करने पर गीली जगह पर लेटने जैसा ठंडा अहसास था, लेकिन temperature adjust करने के बाद गायब हो गया
  • transition time को सीधे measure नहीं किया, लेकिन यह 10 मिनट से ज्यादा 1 मिनट के करीब तेज महसूस हुआ
    • भरने के लिए 1 gallon से कम पानी चाहिए, इसलिए heat या cool करने की thermal capacity ज्यादा नहीं है

remote, fan और heating use

  • default remote touchscreen वाले बड़े dial के रूप में है, इसलिए scheduled temperature fine-tune करते समय तुरंत temperature बदलना आसान है
  • dial का tactile feel बहुत संतोषजनक नहीं है, लेकिन हर temperature unit पर vibration होता है, इसलिए screen देखे बिना adjust किया जा सकता है
    • sleep mask पहने होने पर भी haptic feedback से change amount पता चल जाता है
  • हल्की airflow भी चाहिए, इसलिए पहले room को ठंडा करने की airflow और body पर सीधे न लगने या airway को dry न करने वाली intensity, दोनों साथ में set करनी पड़ती थी
  • Chilipad इस्तेमाल करने के बाद fan को सबसे low setting पर ही चलाना काफी है
  • सुबह temperature थोड़ा बढ़ाने पर cozy लगता है, और winter में bed pre-heat करने की feature की उम्मीद है
  • topper बिछाने पर नीचे की breathability कुछ कम हो जाती है
    • plastic पर लेटने जैसा महसूस नहीं होता, लेकिन higher temperature पर bed से छूती skin में बहुत हल्का sweatiness जैसा लगा
    • यह personal temperature regulation traits के कारण experience है, इसलिए अन्य users के लिए ऐसा होना जरूरी नहीं
  • शुरुआती experience कुल मिलाकर positive है, और dynamic library setup करने के बाद follow-up post करने की संभावना है

1 टिप्पणियां

 
Lobste.rs की टिप्पणियां
  • विषय के मुताबिक, यह पोस्ट सोने से ठीक पहले डाली गई

    • सोच रहा हूं कि अगर bedctl को किसी खास समय पर तापमान बहुत कम करने के लिए सेट किया जाए, तो क्या इसे जगाने के काम में भी इस्तेमाल किया जा सकता है
  • शीर्षक भी बढ़िया है और लेख भी। क्या आपने weighted blanket भी इस्तेमाल करके देखा है, और क्या वह सच में असरदार रहा?

    • पहले weighted blanket इस्तेमाल किया था और कुल मिलाकर पसंद भी था, लेकिन घर बदलते समय उसे हटा दिया। हालांकि वह body temperature regulation में मदद नहीं करता था, इसलिए यहां जिस समाधान की तलाश थी वह नहीं था।
      बनाने के तरीके पर निर्भर करते हुए उसकी breathability खराब हो सकती है और कीमत भी ज्यादा हो सकती है। Chilipad खरीदने के बाद महंगा कहना थोड़ा अजीब लगता है, लेकिन बाद में देखने के लिए जो प्रोडक्ट याद रखा था वह open-weave structure वाला https://bearaby.com/products/tree-napper है, जो breathable लगता है
  • मैं ऐसे products देख रहा हूं और कभी न कभी खुद इस्तेमाल करने का सोच रहा हूं। इस वीडियो के मुताबिक सबसे किफायती समाधान एक बाल्टी है, लेकिन उस स्थिति में शायद API नहीं होगा

    • मैंने वह वीडियो भी देखा है, लेकिन Home Depot की बाल्टी शायद उस काल्पनिक spouse approval test को पास नहीं कर पाएगी 😅
  • कुछ हद तक संबंधित लेख: https://trufflesecurity.com/blog/removing-jeff-bezos-from-my-bed (चर्चा)

  • Fahrenheit और Celsius की तुलना वाले हिस्से में शायद उनका मतलब Celsius is the better temperature लिखने का नहीं था

  • लेख मजेदार है और fan वाले हिस्से समेत सोचने के तरीके से काफी सहमति है, लेकिन यह साफ नहीं है कि इस काम से आखिर क्या control किया जा सकता है
    physics PhD के अनुभव की वजह से विज्ञान/स्वास्थ्य से जुड़ी reporting को प्रमाणित होने तक संदेह से देखने वाला पैराग्राफ थोड़ा vaccine distrust जैसी खतरनाक दिशा में पढ़ा जा सकता है। हालांकि मैं इसे इस तरह समझता हूं कि PhD ने उन्हें media के ‘facts’ को black-and-white तरीके से स्वीकार न करना सिखाया, और यह जानने की उत्सुकता है कि खास तौर पर किस चीज ने चोट पहुंचाई

    • मुद्दा बिल्कुल उलटा है। physicist होने से medicine पर मेरी intuition खास नहीं हो जाती, इसलिए कुछ articles पढ़कर doctor बनने का नाटक करने के बजाय उस field पर research करने वाले experts का अनुसरण करना सबसे अच्छा है। यह authority की अंधभक्ति नहीं है, बल्कि अपनी गलती की संभावना स्वीकार करना और जिन कुछ fields में मैंने research की है उनमें दूसरे लोग मेरी expertise का सम्मान करें—ऐसा रवैया है।
      जब Andrew Wakefield का vaccine paper आया, तो abstract पढ़ने वाले journalist के छोटे article भर से लोगों ने पक्के तौर पर कह दिया कि vaccines बेहद खतरनाक हैं, और zoology में master's किए हुए high-school biology teacher तथा तीन physics PhD तक anti-vaccine हो गए। लेकिन medical community की consensus लगातार यही रही कि vaccines सुरक्षित और प्रभावी हैं और जान बचाने के सबसे ताकतवर साधनों में से एक हैं; जिन medical researchers से मुलाकात हुई, वे भी सभी इससे सहमत थे।
      PhD के दौरान चोट इसलिए लगी क्योंकि मैंने देखा कि मेरे field की वास्तविक discoveries और news reporting के बीच कितना बड़ा gap होता है। हर field को पूरी तरह समझना संभव नहीं है, इसलिए medicine में doctors, environment में ecologists और climate में climatologists पर भरोसा करना चाहिए। मैंने physics PhD लोगों को middle-school level math और elementary-school level science से experts को ‘refute’ करते देखा है, लेकिन असली experts school-level knowledge और reality की knowledge के बीच के विशाल फर्क को जानते थे। जिस field को मैंने पढ़ा है उसमें वह gap देखने की वजह से, जिन fields को मैंने नहीं पढ़ा उनमें मैं उल्टा experts पर ज्यादा भरोसा करने लगा हूं
  • अगर desired structure में fields जैसे-तैसे फेंक देना भी चले, तो handler में लगभग पक्का re.search('set_temperature_f\": (\\d+)',...) जैसी regex search हो रही होगी