1 puan yazan GN⁺ 16 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Sıcak bir yatak odası ve vücut ısısı hassasiyeti nedeniyle Sleep.me Chilipad 2.0'ı 1.700 dolara satın alıp üreticinin bulut API'sini kontrol eden bedctl geliştirildi
  • Chilipad, suyun dolaştığı ince bir topper ile pompa, su haznesi ve termostatı birleştiriyor; haftanın günlerine göre sıcaklık zamanlaması ve yatağın tek tarafından kurulumla başlayan modüler yapılandırmayı destekliyor
  • API, /devices ve /devices/{:id} üzerinden cihazları sorguluyor; PATCH ile sıcaklığı, çalışma durumunu, ekran parlaklığını, zaman dilimini vb. kontrol ediyor; su seviyesi ve mevcut su sıcaklığı da görülebiliyor
  • Zig ile yazılan bedctl, bağımlılığı olmayan bir kütüphane ve ince bir CLI'dan oluşuyor; ileride C arayüzlü libbedctl dinamik kütüphanesine genişletilmesi planlanıyor
  • İlk uyku takibinde toparlanma uykusu süresi artıp gece uyanmaları azaldı, ancak kullanım süresi yalnızca birkaç gün olduğu için bu balayı aşamasında uzun vadeli etkiyi değerlendirmek için erken

Yatak sıcaklığını ayarlamaya neden ihtiyaç vardı

  • Uyku, bağışıklık ve bilişsel işlevlere ve fiziksel aktivite sonrası toparlanmaya yardımcı olur; ancak sağlıkla ilgili manşetlerde bilimsel nüans kaybolabildiğinden, sağlık çalışanları veya uzman görüş birliğiyle desteklenip desteklenmediği önemseniyor
  • ADHD nedeniyle düşünceler sürekli aktığı için uykuya dalmak zor; yatakta kitap okuma alışkanlığıyla uyaranları azaltıp sinir sistemine yatma zamanı sinyali veriliyordu
  • Otistik özellikler nedeniyle belirli dokulara ve duyumlara hassasiyet var ve vücut ısısını düzenlemek de zor; uykuya dalmak için sıcaklık ve yorgan ağırlığının uygun olması gerekiyor
  • Portland'daki yeni dairede klima yalnızca oturma odasında ve tavan vantilatörü de yok; yüksek kattaki yatak odası geceleri en sıcak alan haline geliyor
    • Sıcaklık sensörü kurularak yatak odasının dairedeki en sıcak yer olduğu da doğrulandı
  • Düzensiz uyku, uyarıcı ilaç kullanımı, bunaltıcı yatak odası ve vücut ısısı hassasiyeti birleşince yatak sıcaklığı kontrol cihazına para harcamaya karar verildi

Chilipad 2.0'ın seçilme nedeni

  • Chilipad 2.0, su dolu ince bir yatak topper'ını pompa, su haznesi ve termostat içeren bir cihaza bağlayarak yatak sıcaklığını kontrol ediyor
  • Fanla hava üfleyen BedJet, yazın soğuk havanın doğrudan ayaklara gelmesi nedeniyle elendi
  • Eight Sleep'in en ucuz modeli bile 3.000 dolar, abonelik gerektiriyor ve yapay zeka özellikleri de içerdiği için satın alma listesinden çıkarıldı
  • Chilipad, yatağın tek tarafı için cihazdan başlayarak satın alınabilen modüler bir ürün olduğu için başlangıç fiyatı daha düşük
    • İki cihaz kurulursa iki taraf farklı sıcaklıklara ayarlanabilir; bu da hissedilen sıcaklığı farklı olan çiftler için faydalı
  • İnternete bağlı bir ürün olsa da uçak modu destekliyor ve Bluetooth uzaktan kumandası standart olarak geliyor
    • Uçak modunun yalnızca Wi‑Fi'yi mi kapattığı, yoksa tüm kablosuz bağlantıları mı engellediği doğrulanmadı
    • Başta yerel API sanılmıştı, ancak gerçekte bulut servisiyle iletişim kuruyor
  • Üretici, geliştirici API'si, Postman koleksiyonu, çevrimiçi Swagger UI ve OpenAPI şeması sağlıyor

Chilipad cihaz yapısı

  • Chilipad, kontrol cihazı olan dock ve suyun dolaştığı cover'dan oluşuyor
    • dock içinde termostat, pompa ve su haznesi bulunuyor
    • Isı eşanjörünün dışarı verdiği sıcak havanın yatak odasına tekrar yayılmasını azaltmak için yatağın ayak ucuna ve kapıya yakın yerleştirildi
  • cover; alt katman, TPU membrandan yapılmış hydrolayer ve üst cover olmak üzere üç katmandan oluşuyor
    • Üst cover'ın fermuarı açılarak kullanıcının yattığı tarafa hydrolayer yerleştiriliyor
    • Üstte, dokunulduğunda serin hisseden kumaş ve ince dolgu kullanılıyor; böylece hydrolayer doğrudan hissedilmiyor

Sleep.me API

  • Kimlik doğrulama ve Postman örneği

    • API'yi kullanmak için önce kullanıcı token'ı oluşturmak gerekiyor; belgelere erişmek için hesap gerekiyor
    • Postman örnekleri, belgelerde ayrıntı eksik olduğunda yardımcı oluyor; ancak ayrı bir şirket hesabı gerektiriyor ve yapılandırması da karmaşık
    • Açık kaynak hurl betikleri gibi alternatifler tercih ediliyor
    • Örneklerin çoğunda değişken adı yazım hatası var
    • {{SleepMeAPI_URL}} değil, büyük/küçük harfe duyarlı {{SleepMeAPI_Url}} kullanılmalı
    • “Set Device Status” örneği set_temperature_f değerini 69'a, thermal_control_status değerini standby olarak ayarlıyor
  • Endpoint'ler ve yanıt yapısı

    • API, cihaz listesi ve tekil cihazlarla ilgilenen iki tür endpoint sunuyor
    • GET /devices: token'a bağlı cihaz listesini döndürüyor
    • GET /devices/{:id}: belirli bir cihazın tüm bilgilerini döndürüyor
    • PATCH /devices/{:id}: cihaz özelliklerini değiştiriyor
    • /devices içindeki her öğede cihaz ID'si, kullanıcının verdiği ad ve attachments bulunuyor
    • attachments'ın bağlı başka cihazları ifade edip etmediği kesin değil
    • Ayrıntılı yanıt about, control, status nesnelerine ayrılıyor
      • about: firmware sürümü, dış IP, LAN IP, MAC adresi, model ve seri numarasını içeren salt okunur bilgiler
      • control: ekran parlaklığı, gösterilen sıcaklık birimi, ayarlanan sıcaklık, sıcaklık kontrol durumu ve zaman dilimi gibi değiştirilebilir özellikler
      • status: API bağlantısı durumu, su azlığı durumu, 0–100 arası su seviyesi ve mevcut su sıcaklığı gibi salt okunur durum bilgileri
    • control özellikleri cihaza göre değişebilir; belgede olmayan brightness_level gibi anahtarlar da dönebiliyor
    • thermal_control_status, active veya standby değerini alıyor ve cihazın sıcaklığı aktif olarak düzenleyip düzenlemediğini gösteriyor
  • Sıcaklık değerleri ve cihaz kontrolü

    • Fahrenheit sıcaklıkları tamsayı, Celsius sıcaklıkları gerçek sayı olarak ele alınıyor
    • Normal aralık Fahrenheit için 55–115°F, Celsius için 13.0–48.0°C
    • MAX_COLD, -1 veya -1.0; MAX_HEAT, 999 veya 999.0 olarak ifade ediliyor
    • Bekleme durumunda status.water_temperature_* değerinin -1 olması bir sentinel değer gibi görünüyor, ancak belgelenmemiş
    • Cihaz özelliklerini değiştirirken yalnızca değiştirilmek istenen anahtarlar JSON gövdesine konularak PATCH isteği gönderiliyor
    • Yalnızca Fahrenheit sıcaklığını 73'e ayarlamak için { "set_temperature_f": 73 } gönderiliyor
    • Tüm kontrol anahtarlarını eklemek veya { "control": ... } ile sarmalamak gerekmiyor
    • Bu istek biçimi resmi belgelerden değil, Postman koleksiyonundan doğrulandı

bedctl'in yapısı ve kullanımı

  • bedctl, Zig modülü merkezli olarak oluşturuldu; CLI, bu kütüphaneyi çağıran ince bir sarmalayıcı
  • Ad, kontrol programlarına -ctl soneki ekleme geleneğini izliyor; “bed cuttle” ifadesinin “bed cuddle” gibi duyulması da dikkate alınmış
  • Başlıca komutlar şöyle
    • bedctl devices: token'a kayıtlı cihaz adlarını ve ID'lerini sorgular
    • bedctl status: firmware, ağ adresleri, model, ayarlanan sıcaklık, çalışma durumu, su seviyesi ve gözlenen sıcaklığı sorgular
    • bedctl set temp 74: hedef sıcaklığı ayarlar
  • Token ve cihaz ID'si ortam değişkenleriyle belirtilebilir veya --token, --device bayraklarıyla geçirilebilir

Zig'in seçilme nedeni ve bağımlılıklar

  • Rust yaklaşık 5 yıldır işte, 2018'den beri de hobi olarak kullanılsa da anında geri bildirim ve daha düşük zihinsel yük istendiği için son dönemde tercih edilen Zig ile uygulandı
  • M1 Max MacBook Pro'da zig build check --watch -fincremental yaklaşık 75 ms içinde güncelleniyor
  • CLI'ın tek dış bağımlılığı, TigerBeetle kodundan çıkarılıp değiştirilmiş ve Zig 0.16.0'a uyarlanmış argument parser
  • Kütüphanenin Zig standart kütüphanesi dışında bağımlılığı yok; HTTP istekleri için std.http.Client kullanılıyor
  • CLI, libc ile linklenmiyor; gelecekteki dinamik kütüphanenin de libc olmadan yapılandırılması planlanıyor
  • Zig'in yerleşik çapraz derleme özellikleriyle hedef sisteme doğrudan erişmeden desteklenen platformlar için build üretilebiliyor

Veri modeli ve tip sistemi

  • Temel struct'lar, cihaz listesi için Device ve ayrıntılı yanıt için DeviceStatus
    • Device, id, name, attachments içeriyor
    • DeviceStatus, Device.About, Device.Control, Device.Status bileşenlerinden oluşuyor
  • Control özellikleri modele göre bulunmayabileceği için parlaklık, gösterim birimi, ayarlanan sıcaklık, çalışma durumu ve zaman dilimi opsiyonel değerlerle ifade ediliyor
  • JSON string'lerini olduğu gibi kullanmak yerine Zig'in anonim enum'larından yararlanılıyor
    • Sıcaklık birimleri .c ve .f
    • Sıcaklık kontrol durumları .active ve .standby
  • Fahrenheit ayar sıcaklığı için belirli tamsayı değerlere anlamlı enum adları veriliyor
    • -1 değerini hatırlamak yerine .max_cold kullanılabiliyor
    • Normal sıcaklık 78 gibi tamsayı literal'i olarak geçirilebiliyor
  • Yalnızca tiplerle normal aralık olan 55–115°F'yi sınırlamanın yolu bulunamadı; istek öncesi ayrı doğrulama da yapılmıyor
  • Celsius değerleri gerçek sayı olduğu için izin verilen aralık tiplerle ifade edilemiyor

Zig HTTP istemcisi uygulama deneyimi

  • Zig standart HTTP istemcisi, basit bir URI–gövde–send soyutlamasından daha düşük seviyeli adımlar gerektiriyor
    • URI nesnesi oluşturma
    • Yolu belirtecek şekilde URI'yi değiştirme
    • Temel URI, header'lar ve bağlantı ayarlarıyla istek nesnesi oluşturma
    • İstek başlıklarını gönderme
    • Yanıt başlıklarını alma
    • Gövde reader'ı oluşturma
    • Reader'dan yanıt gövdesini tüketme
  • Hassas kontrol mümkün; ancak gerektiğinde düşük seviyeye inilebilen Rust'ın aksine Zig'de sürekli düşük seviyeli iş yapılıyor hissi var
  • /devices uygulaması, kimlik doğrulama header'ı eklenmiş GET isteğini sendBodiless() ile gönderdikten sonra yanıtı en fazla 64.000 bayta kadar okuyup JSON'u []const Device olarak parse ediyor
  • parseFromSliceLeaky kullanılıyor; ancak dışarı açılmayan arena allocator yapısı sayesinde bellek serbest bırakma sorunu yok

Dinamik kütüphane genişletme planı

  • Nihai hedef, üst seviye dillerden kullanılabilecek bağımlılığı olmayan bir dinamik kütüphane yapmak
  • Planlanan yapı şöyle
    • Zig modülü bedctl
    • Zig modülünü doğrudan kullanan CLI bedctl
    • Zig modülüne C arayüzü sağlayan libbedctl
    • Dinamik kütüphaneyi kullanan ve C arayüzünü kendi içinde doğrulayan bedctl-dl
  • Python sarmalayıcı yapılırsa Home Assistant'ta kullanmak isteniyor, ancak bunu bizzat yazma planı yok
  • Dinamik kütüphane build'i ve arayüzü henüz hazır değil; yakın zamanda eklenmesi planlanıyor

Birkaç günlük kullanım sonrası uyku deneyimi

  • Kullanılan birkaç gün boyunca öznel olarak iyi uyundu; fitness takipçisinde de toparlanma uykusu evresi uzadı ve gece uyanma sayısı azaldı
  • Viski içilen günde bile normalden iyi uyundu; ancak bu, alkolün uykuya iyi geldiği anlamına yorumlanmamalı
    • Alkol hâlâ sağlık ve uyku için zararlı; cihazın uyku bozulmasını bir miktar azaltmış olması mümkün
  • Cihaz yalnızca birkaç gündür kullanılıyor ve bedctl de yaklaşık 3 gece içinde yazıldı; bu nedenle sonuçlar hâlâ balayı aşamasında
  • Sıcaklık başta fazla düşük ayarlandığında ıslak bir yere yatıyormuş gibi bir soğukluk vardı; sıcaklık ayarlandıktan sonra kayboldu
  • Geçiş süresi doğrudan ölçülmedi, ancak 10 dakikadan çok 1 dakikaya yakın olacak kadar hızlı hissediliyor
    • Doldurmak için 1 galondan az su gerektiğinden, ısıtılacak veya soğutulacak ısıl kapasite büyük değil

Uzaktan kumanda, vantilatör ve ısıtma kullanımı

  • Standart uzaktan kumanda, dokunmatik ekranlı büyük bir kadran biçiminde; planlı sıcaklıkları ayarlarken anında sıcaklık değiştirmeyi kolaylaştırıyor
  • Kadranın dokunsal hissi tatmin edici değil, ancak her sıcaklık biriminde titreştiği için ekrana bakmadan ayar yapılabiliyor
    • Uyku maskesi takılıyken bile haptik geri bildirim ile değişim miktarı anlaşılabiliyor
  • Hafif hava akışına da ihtiyaç duyulduğundan, daha önce odayı soğutacak hava debisiyle doğrudan vücuda çarpmayacak veya solunum yollarını kurutmayacak şiddeti aynı anda tutturmak gerekiyordu
  • Chilipad kullanıldıktan sonra vantilatörü yalnızca en düşük seviyede açmak yeterli oluyor
  • Sabah sıcaklığı biraz yükseltmek konforlu; kışın yatağı önceden ısıtma işlevi bekleniyor
  • Topper serilince alttaki nefes alabilirlik bir miktar azalıyor
    • Plastik üzerinde yatıyormuş hissi yok; ancak yüksek sıcaklıklarda yatağa temas eden ciltte çok hafif terlemiş gibi bir his oldu
    • Bu, kişisel vücut ısısı düzenleme özelliklerine bağlı bir deneyim; diğer kullanıcılar için aynı olmayabilir
  • İlk deneyim genel olarak olumlu; dinamik kütüphane yapılandırıldıktan sonra devam içeriği yayımlanabilir

1 yorum

 
Lobste.rs yorumları
  • Konuya uygun şekilde bu yazıyı uykuya dalmadan hemen önce paylaştı

    • bedctl belirli bir saatte sıcaklığı iyice düşürecek şekilde ayarlanırsa uyandırma amacıyla da kullanılıp kullanılamayacağını merak ediyorum
  • Başlık da yazı da harika. Ağırlıklı battaniye de deneyip denemediğini, gerçekten işe yarayıp yaramadığını merak ediyorum

    • Eskiden ağırlıklı battaniye kullanmıştım ve genel olarak seviyordum, ama taşınırken elden çıkardım. Ancak vücut sıcaklığını düzenlemeye yardımcı olmadı; bu yüzden burada aradığım çözüm değildi
      Üretim şekline bağlı olarak hava geçirgenliği düşük olabilir ve pahalı da olabilir. Chilipad aldıktan sonra pahalı demek biraz tuhaf kaçıyor ama daha sonra incelemek üzere aklımda tuttuğum ürün, hava geçirgenliği iyi görünen açık örgü yapısıyla https://bearaby.com/products/tree-napper
  • Böyle ürünlere bakıyordum ve bir gün bizzat denemeyi düşünüyorum. Bu videoya göre fiyat/performans açısından en iyi çözüm bir kova, ama o durumda API olmayacak gibi

    • O videoyu ben de izledim, ama Home Depot kovası var olmayan eş onay testinden geçemez gibi geliyor 😅
  • Biraz ilgili bir yazı: https://trufflesecurity.com/blog/removing-jeff-bezos-from-my-bed (tartışma)

  • Fahrenheit ile Celsius’u karşılaştırdığı kısımda sanırım Celsius is the better temperature yazmak istememiş

  • Yazı eğlenceli ve fanlarla ilgili bölüm gibi düşünme biçimine de epey katılıyorum, ama bu çalışmayla neyi kontrol edebilir hâle geldiği net değil
    Fizik doktorası deneyimi yüzünden bilim ve sağlıkla ilgili haberlerden, kanıtlanana kadar şüphe duyduğunu söyleyen paragraf, yanlış anlaşılırsa aşı güvensizliği gibi tehlikeli bir yöne çekilebilir. Yine de doktoranın, medyanın “gerçeklerini” siyah-beyaz mantıkla kabul etmemesini sağladığı anlamında anlıyorum; tam olarak neyin iz bıraktığını merak ediyorum

    • Söylemek istediğim tam tersi. Fizikçi olmam, tıp konusundaki sezgilerimi özel kılmaz; bu yüzden birkaç makale okuyup doktorculuk oynamaktansa o alanı araştırmış uzmanları takip etmek en iyisi. Bu, otoriteye körü körüne boyun eğmek değil; yanılabilir olduğunu kabul etmek ve benim çalıştığım az sayıdaki alanda da başkalarının uzmanlığıma saygı duymasını istemek demek
      Andrew Wakefield’ın aşı makalesi çıktığında, yalnızca özeti okumuş bir gazetecinin kısa yazısını gören insanlar aşıların kesinlikle tehlikeli olduğunu ilan etti; zooloji yüksek lisanslı bir lise biyoloji öğretmeni ve üç fizik doktoru bile aşı karşıtı oldu. Ama tıp camiasının uzlaşısı aşıların güvenli ve etkili olduğu, hayat kurtaran en güçlü araçlardan biri olduğu yönünde kalmaya devam etti; tanıştığım tıp araştırmacılarının hepsi de bu konuda hemfikirdi
      Doktora sürecinde yara almamın nedeni, alanımdaki gerçek keşiflerle haberlerdeki aktarımlar arasında ne kadar büyük bir uçurum olduğunu görmemdi. Her alanı tamamen anlayamayacağımız için tıpta doktorlara, çevrede ekolojistlere, iklimde klimatologlara güvenmek gerekir. Ortaokul düzeyinde matematik ve ilkokul düzeyinde fen bilgisiyle uzmanları “çürüten” fizik doktorları gördüm; oysa gerçek uzmanlar, okul düzeyindeki bilgi ile gerçek dünyaya dair bilgi arasındaki devasa farkı biliyordu. Çalıştığım alanda bu uçuruma tanık olduğum için, çalışmadığım alanlarda uzmanlara daha da çok güveniyorum
  • İstediğiniz yapıda alanları gelişigüzel gönderebiliyorsanız, işleyicide neredeyse kesin re.search('set_temperature_f\": (\\d+)',...) gibi bir regex araması yapılıyordur