{"id":26591807,"url":"https://github.com/lorenz/fanbee","last_synced_at":"2025-07-20T02:36:50.132Z","repository":{"id":281506300,"uuid":"874891578","full_name":"lorenz/fanbee","owner":"lorenz","description":"A Zigbee-controlled 140mm fan with electronically-controlled valve","archived":false,"fork":false,"pushed_at":"2025-03-09T14:49:17.000Z","size":1144,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-22T07:02:50.048Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lorenz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-18T16:46:58.000Z","updated_at":"2025-06-03T13:00:43.000Z","dependencies_parsed_at":"2025-03-09T15:41:49.145Z","dependency_job_id":null,"html_url":"https://github.com/lorenz/fanbee","commit_stats":null,"previous_names":["lorenz/fanbee"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lorenz/fanbee","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lorenz%2Ffanbee","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lorenz%2Ffanbee/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lorenz%2Ffanbee/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lorenz%2Ffanbee/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lorenz","download_url":"https://codeload.github.com/lorenz/fanbee/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lorenz%2Ffanbee/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266058481,"owners_count":23870157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-23T14:20:10.743Z","updated_at":"2025-07-20T02:36:50.108Z","avatar_url":"https://github.com/lorenz.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FanBee :honeybee:\n*A Zigbee-controlled 140mm fan with electronically-controlled valve*\n\n![Product Picture](render.png)\n\nSkip to the Build Guide if you want to know how to build one.\n\n# Introduction\n\n## User Interface\nThe small LED (D3) near the reset button indicates if the lowest (MCU) power\nrail has power. If it is not illuminated nothing will happen, check power rails.\n\nThe firmware initially starts blinking its status LED (D4, near the JTAG\nheader) every 2 seconds, indicating that it is idle and is not connected to any\nnetwork. Press the Pair button after your ZigBee network is ready to join a new\ndevice. The status LED will start to blink rapidly (every 0.5s) until it has\njoined a network, then it will turn off.\n\nPressing the pair button while the device is already joined to a network will\nresult in two quick flashes of the status LED.\n\nLong-pressing the pair button (\u003e5s) will reset the device.\n\nThe last LED (D5) indicates if the fan is currently powered. It can be used\nto diagnose fan or connectivity issues.\n\n## Coordinator compatibility\nBecause the ZigBee HVAC fan device type is unfit for this device (it supports\nvarious modes but no speed control) I've opted to implement it as a generic\nlevel-controlled device (just like dimmable lights). This should give it fairly\nbroad coordinator compatibility.\n\nThere's a device model for the FanBee in Zigbee2MQTT which is what I'm\npersonally using to control them.\n\n## Notes\n* The power connector is designed for daisy-chaining, that's why there are\n  two positive and negative positions. Only one of each needs to be connected\n  for normal operation.\n* Second Servo output is not used currently, was used in an earlier revision\n  and left for any future use as there was space.\n* SPI flash can be left unpopulated if you don't ever want to use OTA updates\n  or maybe a later (larger) firmware. It's currently unused.\n* Newer TI SDKs have been tested but drop off the Zigbee network for unknown\n  reasons after hours or days. Use the pinned version.\n* Make sure that the surface your're installing the base plate on is flat.\n  Otherwise the bell shape gets distorted and the butterfly valve disk gets\n  stuck. The tolerances there need to be relatively tight to not allow too much\n  air to go through in closed state.\n\n# Build Guide\n## Requirements\n\n### Off-the-shelf hardware\n| Quantity | Part description |\n| -------- | ---------------- |\n| 8        | M3 brass heat-set inserts |\n| 1        | M3 15mm buttonhead fastener |\n| 1        | M3 10mm buttonhead fastener |\n| 4        | M3 5mm fastener (ideally with integrated washer) |\n| 4        | M4 countersunk fasteners for attaching the housing |\n| 2        | 10x15x4mm ball bearings |\n| 1        | SG90-compatible 180° servo |\n| 1        | 140mm 24V or 12V PC-compatible PWM fan (plus screws if not included) |\n| 30cm     | 2GT timing belt (open-loop) |\n\nThis was designed for the Noctua NF-A14 industrialPPC-24V-3000 SP IP67 PWM, but\nany other electrically-compatible 24V or 12V fans can be used. Note that the\npower supply voltage needs to match the fan voltage, there is no regulator for\nthe fan power supply.\n\n### PCB\nThe control PCB is custom-designed and can be ordered at your favorite PCB\nmanufacturer in various states of assembly. All SMT parts can be assembled\nfor relatively cheap by JLCPCB. One PCB is needed for each FanBee.\n\nA OpenOCD and JTAG compatible programmer with a 2.45mm ARM 10 Pin JTAG\nconnector is required. This has been tested with a generic FT2232 board, but\na TI XDS110 or compatible LaunchPad should also work.\n\n### Printed parts\nThe STLs for all printed parts are in the `parts` folder. One of each is\nneeded for a single fanbee.\n`servo_pulley.stl` should be printed in resin or with a 0.2mm nozzle, the\nrest of the parts do not need to be as precise.\n\n## Assembly steps\n1. Insert the 4 heat-set inserts into the studs for holding the PCB.\n2. Insert the two heat-set inserts into the base for holding an optional PCB enclosure.\n3. Insert a heat-set insert each into the bottom and top holes of the valve disk.\n4. Press both ball bearings into their housings on the main part.\n5. Place the fan at the back, route the wires through the slot and attach it with four fan screws.\n6. Route the servo cables through the hole and attach the servo with two screws.\n7. Attach the PCB with four 5mm screws.\n8. Connect the 4-pin fan connector and 3-pin servo connector.\n9. Place the fan disk between the bearings and push in the retaining pin from the bottom and the disk pulley from the top.\n10. Secure the retaining pin with the 10mm M3 screw.\n11. Secure the disk pulley with the 15mm M3 screw.\n12. Push the servo pulley onto the servo and secure it with the provided screw.\n13. Cut a sufficiently-long section of belt, loop it around the two servos and secure both ends with the belt retainer.\n15. Attach the JTAG programmer and temporary power and flash the firmware.\n\n## Future work\n* Public CI for firmware and manufacturing files\n* Render/photos of the finished product\n\n# License\nMIT for all the code I wrote as well as the CAD design files. Some code is also\nrelated to TI's SimpleLink SDK (especially the generated syscfg), I don't claim\nownership of that, but TI grants you relatively broad permissions for most use.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Florenz%2Ffanbee","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Florenz%2Ffanbee","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Florenz%2Ffanbee/lists"}