[{"data":1,"prerenderedAt":296},["ShallowReactive",2],{"project-33855453":3},{"id":4,"name":5,"line":5,"line_source":6,"title":7,"url":8,"domain":9,"maker":10,"posted_at":11,"year":12,"points":13,"comments":14,"rank_in_year":15,"shown_in_year":16,"top":17,"tier":18,"category":19,"subcategory":20,"format":21,"keywords":22,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":45,"post_text":47,"what":48,"said":71,"maker_in_thread":155,"shape":164,"grid":167,"attempts":258,"same_week":259,"maker_shows":32,"maker_hidden":288,"reader_version":289,"card":290},"33855453","Hacking Bluetooth to brew coffee in GitHub actions","title","Show HN: Hacking Bluetooth to brew coffee in GitHub actions","https:\u002F\u002Fgrack.com\u002Fblog\u002F2022\u002F12\u002F01\u002Fhacking-bluetooth-to-brew-coffee-on-github-actions-part-1\u002F","grack.com","mmastrac",1670173879,2022,168,35,359,2570,14,"notable","hardware","coffee machine control","cli",[23,24,25,26,27],"bluetooth","coffee maker","github actions","rust","de'longhi","debated",0.016,{"positive":31,"neutral":32,"mixed":33,"critical":34},6,8,0,5,19,{"idea":37,"privacy":40,"execution":41,"pricing":43,"docs":44},{"positive":38,"critical":39},4,2,{"positive":33,"critical":39},{"positive":42,"critical":33},1,{"positive":33,"critical":42},{"positive":42,"critical":33},[46,33,33,33,33,42,33,42,33,33,46,33,42,46,46,42,34,42,33,33,33,34,46,34,33,33,33,46,33,46,33,34,46,34,33,34],3,null,{"problem":49,"audience":47,"pricing":47,"motivation":56,"time_to_build":47,"stack":60,"openness":69,"stage":70,"team_size":69},{"value":50,"source":51,"evidence":52},"Controlling a De'Longhi Bluetooth coffee maker remotely without the vendor app","maker",[53],{"id":54,"by":10,"text":55},"33855523","This is my adventure reverse engineering a De'Longhi coffeemaker's Bluetooth-Low-Energy-based protocol, writing a rust CLI for it, and hooking it up to GitHub actions to let us…",{"value":57,"source":51,"evidence":58},"Reverse engineering the coffee maker's BLE protocol as an adventure",[59],{"id":54,"by":10,"text":55},[61,65],{"value":62,"source":51,"evidence":63},"Rust",[64],{"id":54,"by":10,"text":55},{"value":66,"source":51,"evidence":67},"GitHub Actions",[68],{"id":54,"by":10,"text":55},"unknown","launched",{"praise":72,"objections":92,"requests":121,"questions":136,"alternatives":147},[73,85],{"value":74,"source":75,"evidence":76},"Well-written, interesting write-up of Bluetooth hacking","commenter",[77,81],{"id":78,"by":79,"text":80},"33876697","poidos","Great read, lovely to see this type of hacking done. Thanks for sharing your excellent writeup!",{"id":82,"by":83,"text":84},"33859062","jonas-w","Thank you very much, that was a good read. Not a long time ago i wanted to do something with ble and rust but it failed miserabily and barely found any documentation for ble on…",{"value":86,"source":75,"evidence":87},"btleplug Rust Bluetooth library works well",[88],{"id":89,"by":90,"text":91},"33876140","flaviut","I want to shout-out the btleplug library again. I've tried to work with several different BTLE libraries in the past, and I've always had a ton of problems. btleplug works…",[93,103,110],{"value":94,"source":75,"evidence":95},"BLE protocol lacks replay attack protection, enabling denial of service",[96,100],{"id":97,"by":98,"text":99},"33877547","frippertronics","I'm surprised the De'Longhi BLE protocol doesn't have _any_ replay attack protection. I get that making coffee isn't a safety-critical operation, but you could do some…",{"id":101,"by":10,"text":102},"33882283","I didn't want to go too deeply into it, but the protocol definitely has a lot of issues.",{"value":104,"source":75,"evidence":105},"Exposing a heating element to the internet is risky",[106],{"id":107,"by":108,"text":109},"33876739","duped","I'd be wary of exposing a heating element to the internet But I also love coffee so you should send this to James Hoffman and see if he'll do a video on it",{"value":111,"source":75,"evidence":112},"Still needs a person to place a mug and refill water and beans",[113,117],{"id":114,"by":115,"text":116},"33877061","muhehe","Well, you have to make sure there is coffee, water, cup and perhaps milk present. You have to clean it regularly. I don't think this is very useful in the end. That said, it's…",{"id":118,"by":119,"text":120},"33877209","epse","And mostly, you have to put a mug under it. But now he doesn't rely on Delonghi supporting their app anymore",[122,129],{"value":123,"source":75,"evidence":124},"Add to Home Assistant",[125],{"id":126,"by":127,"text":128},"33877062","hackcasual","Now to just add it to Home Assistant",{"value":130,"source":75,"evidence":131},"Build a GUI or TUI",[132],{"id":133,"by":134,"text":135},"33876793","jawmes8","Intriguing work! I hadn’t realized they made grinder\u002Fbrew combo machines… Building a GUI or TUI would be a fun addition too!",[137],{"value":138,"source":75,"evidence":139},"Can brew values like coffee and milk quantities be varied?",[140,144],{"id":141,"by":142,"text":143},"33878294","borbulon","Sorry for the double comment at the top level, but were you able to experiment with different values for taste, coffee, milk? Or does each recipe require constant values? It may…",{"id":145,"by":142,"text":146},"33882797","> (apparently not including the ingredient means... use a lot of it?) to be fair, 0 = unlimited isn't an unheard of setting yeah, that sounds like fun stuff to explore - playing…",[148],{"value":149,"source":75,"evidence":150},"bluez_async Rust Bluetooth library",[151],{"id":152,"by":153,"text":154},"33878124","witcher01","I'm currently writing Rust for my bachelor thesis using bluez_async[1]. btleplug[2] is great, but at least on Linux I prefer using bluez_async directly, which btleplug is just an…",{"comments":38,"answered":39,"key":156},[157,158,161],{"id":101,"text":102},{"id":159,"text":160},"33882335","I've managed to brew a few custom coffees, including a comically over-sized cappuccino when I forgot to specify milk (apparently not including the ingredient means... use a lot…",{"id":162,"text":163},"33883337","It's wildly precise - the coffee appears to be measured in \"impulses\", where a single impulse is somewhere \u003C 5mL (if I were to guess - between 1-2). 250 impulses is juuuust…",{"commenters":165,"max_depth":38,"maker_replies":38,"first_comment_mins":31,"lifespan_hours":166},29,64,[168,172,176,177,180,181,183,184,188,191,194,198,201,202,205,208,209,211,215,219,222,225,229,231,234,237,240,242,244,245,246,247,249,252,254,256],[169,33,46,170,171,33],"33875866","project\u002Fneutral\u002Fidea","jacob019",[173,33,33,174,175,33],"33881052","commenter\u002Fneutral\u002Fnone","lakomen",[89,42,33,174,90,33],[178,42,33,174,179,33],"33877107","dbrgn",[152,42,33,174,153,33],[97,39,42,182,98,33],"project\u002Fcritical\u002Fprivacy",[101,39,33,182,10,42],[185,46,42,186,187,33],"33877055","project\u002Fcritical\u002Fidea","gnull",[189,46,33,174,190,33],"33877204","lysecret",[192,46,33,174,193,33],"33877622","rkachowski",[195,46,46,196,197,33],"33880372","project\u002Fneutral\u002Fexecution","turtleyacht",[199,46,33,174,200,33],"33880849","JTbane",[107,38,42,182,108,33],[203,34,46,170,204,33],"33875236","a_t48",[206,34,46,170,207,33],"33877464","napolux",[114,31,42,186,115,33],[118,31,34,210,119,33],"project\u002Fpositive\u002Fidea",[212,213,42,214,142,33],"33878052",7,"project\u002Fcritical\u002Fpricing",[216,32,33,217,218,33],"33877627","other\u002Fneutral\u002Fnone","nonrandomstring",[220,32,33,217,221,33],"33877733","hnlmorg",[223,32,33,217,224,33],"33878228","tgv",[226,227,34,210,228,33],"33892288",9,"jstrebel",[126,230,46,170,127,33],10,[232,233,34,210,207,33],"33877399",11,[235,233,33,174,236,33],"33878105","wartijn_",[238,233,33,174,239,33],"33878457","DoctorOW",[241,233,33,174,207,33],"33882575",[141,243,46,170,142,33],12,[159,243,33,196,10,42],[145,243,46,196,142,33],[162,243,33,196,10,42],[133,248,34,210,134,33],13,[250,248,46,196,251,33],"33877862","GOATS-",[78,17,34,253,79,33],"maker\u002Fpositive\u002Fdocs",[54,255,33,170,10,42],15,[82,255,34,257,83,33],"maker\u002Fpositive\u002Fexecution",[],[260,265,270,275,279,283],{"id":261,"name":262,"points":263,"category":264},"33833836","SQL for Devs",865,"learning_science",{"id":266,"name":267,"points":268,"category":269},"33853773","chat-gpt-google-extension",431,"dev_tools",{"id":271,"name":272,"points":273,"category":274},"33877893","Whisper",399,"ai",{"id":276,"name":277,"points":278,"category":274},"33882497","SmartyNames",313,{"id":280,"name":281,"points":282,"category":264},"33815146","NLP Demystified",286,{"id":284,"name":285,"points":286,"category":287},"33842406","Wikiwho",261,"data",false,"v2",{"id":291,"name":5,"line":5,"ai":288,"cat":19,"year":12,"points":13,"comments":14,"rec":28,"s":292,"top":17,"kw":293,"maker":10,"domain":9,"tier":18,"attempts":33,"strip":294,"url":8,"mix":295,"praise":74,"objection":94,"sub":20},33855453,0.02,[23,24,25,26,27],"300001010030133151000535000303053505",[31,32,33,34],1794036628121]