{"id":42194539,"url":"https://github.com/klightspeed/brassmonkeyfridgemonitor","last_synced_at":"2026-01-27T00:01:30.621Z","repository":{"id":193726567,"uuid":"689346970","full_name":"klightspeed/BrassMonkeyFridgeMonitor","owner":"klightspeed","description":"Fridge monitor for Alpicool / Brass Monkey fridges","archived":false,"fork":false,"pushed_at":"2025-05-19T22:45:21.000Z","size":125,"stargazers_count":6,"open_issues_count":4,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-19T23:28:59.855Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","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/klightspeed.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,"zenodo":null}},"created_at":"2023-09-09T14:18:36.000Z","updated_at":"2025-05-19T22:45:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"67d8f116-a51d-4d0a-a3fe-448649ad1fca","html_url":"https://github.com/klightspeed/BrassMonkeyFridgeMonitor","commit_stats":null,"previous_names":["klightspeed/brassmonkeyfridgemonitor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/klightspeed/BrassMonkeyFridgeMonitor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klightspeed%2FBrassMonkeyFridgeMonitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klightspeed%2FBrassMonkeyFridgeMonitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klightspeed%2FBrassMonkeyFridgeMonitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klightspeed%2FBrassMonkeyFridgeMonitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klightspeed","download_url":"https://codeload.github.com/klightspeed/BrassMonkeyFridgeMonitor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klightspeed%2FBrassMonkeyFridgeMonitor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28792638,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T21:49:50.245Z","status":"ssl_error","status_checked_at":"2026-01-26T21:48:29.455Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":"2026-01-27T00:01:16.805Z","updated_at":"2026-01-27T00:01:30.598Z","avatar_url":"https://github.com/klightspeed.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Fridge monitor for Alpicool / Brass Monkey fridges\n\nI created this primarily to log the temperature of my fridge.\n\n## Usage\npositional arguments:\n\naddress\n    : Bluetooth address of fridge\n\noptions:\n\n-b, --bind\n    : Press settings button on fridge to confirm fridge selection\n\n-l, --loop\n    : Poll at regular intervals (default: query once)\n\n-t POLLINTERVAL, --pollinterval POLLINTERVAL\n    : Poll interval in seconds (default: 10)\n\n## Requirements\n\nThis script uses [bleak](https://github.com/hbldh/bleak) as its bluetooth library.\n\nAs this script uses bluetooth, you will need a working bluetooth adaptor.\n\n## Technical\n\nThis script was put together after extracting the javascript from version 2.0.0 of the Alpicool CAR FRIDGE FREEZER android app (the current 2.2.9 version has the javascript compiled into Hermes bytecode).\n\nThe app enables notifications on characteristic 0x1236 of GATT service 0x1234, and sends commands on characteristic 0x1235 of GATT service 0x1234\n\nNote that there is no authentication\n\n* Pairing to the device is not required\n* When pairing no pin is required\n* The \"bind\" command is a convenience function - i.e. the fridge still accepts commands even if the \"bind\" command has never been issued or acknowledged\n\nConnecting to the BLE device locks out all other clients and disables BLE advertisements until the client disconnects (though it does seem to show up after a while on the next bluetooth address as a bluetooth headset `JR-bluetooth`)\n\nMy fridge has a bluetooth device name of `WT-0001`, and the app also looks for bluetooth device names starting with `A1-`, `AK1-`, `AK2-`, or `AK3-`\n\n### Command and notification structure:\n\nOffset  | Length  | Description\n--------|---------|------------\n0x00    | 2       | Frame header (FE FE)\n0x02    | 1       | Data length\n0x03    | 1       | Command / Response code\n0x04    | len - 3 | Command / Response data\nlen - 2 | 2       | Checksum (big-endian sum of all other bytes)\n\n### Command / Response codes:\n\nCode | Name | Description\n-----|------|------------\n0x00 | bind | Bind (Fridge displays APP and sends a bind response after settings button is pressed)\n0x01 | query | Query\n0x02 | setOther | Set\n0x04 | reset | Reset\n0x05 | setLeft | Set Unit 1 (Left) Target\n0x06 | setRight | Set Unit 2 (Right) Target\n\n### Fridge Query Data structure:\n\nAll temperature values are signed 8-bit integers represented in the selected temperature unit\n\nOffset | Name | Description\n-------|------|------------\n0x00   | locked | Fridge controls locked (boolean)\n0x01   | poweredOn | Fridge switched on (boolean)\n0x02   | runMode | Fridge running mode (Max, Eco)\n0x03   | batSaver | Low voltage cutout level (Low, Mid, High)\n0x04   | leftTarget | Unit 1 (Left) target temperature\n0x05   | tempMax | Maximum selectable temperature\n0x06   | tempMin | Minimum selectable temperature\n0x07   | leftRetDiff | Unit 1 (Left) hysteresis\n0x08   | startDelay | Start Delay (minutes)\n0x09   | unit | Temperature unit (0=Celsius, 1=Fahrenheit)\n0x0A   | leftTCHot | Unit 1 (Left) temperature correction when at or above -6°C\n0x0B   | leftTCMid | Unit 1 (Left) temperature correction when between -12°C and -6°C\n0x0C   | leftTCCold | Unit 1 (Left) temperature correction when below -12°C\n0x0D   | leftTCHalt | Unit 1 (Left) temperature correction when shut down\n0x0E   | leftCurrent | Unit 1 (Left) current temperature\n0x0F   | batPercent | Battery charge level in percent (likely voltage-based) (can be 0x7f if unknown)\n0x10   | batVolInt | Integer portion of battery voltage\n0x11   | batVolDec | Decimal portion of battery voltage\n\nFor dual-zone fridges:\n\nOffset | Name | Description\n-------|------|------------\n0x12   | rightTarget | Unit 2 (Right) target temperature\n0x13   | | Not used\n0x14   | | Not used\n0x15   | rightRetDiff | Unit 2 (Right) hysteresis\n0x16   | rightTCHot | Unit 2 (Right) temperature correction when at or above -6°C\n0x17   | rightTCMid | Unit 2 (Right) temperature correction when between -12°C and -6°C\n0x18   | rightTCCold | Unit 2 (Right) temperature correction when below -12°C\n0x19   | rightTCHalt | Unit 2 (Right) temperature correction when shut down\n0x1A   | rightCurrent | Unit 2 (Right) current temperature\n0x1B   | runningStatus | Running Status (Unknown - I don't have a dual-zone fridge to test with)\n\n### Fridge Set Data structure\n\nAll temperature values are signed 8-bit integers represented in the selected temperature unit\n\nOffset | Name | Description\n-------|------|------------\n0x00   | locked | Fridge controls locked (boolean)\n0x01   | poweredOn | Fridge switched on (boolean)\n0x02   | runMode | Fridge running mode (Max, Eco)\n0x03   | batSaver | Low voltage cutout level (Low, Mid, High)\n0x04   | leftTarget | Unit 1 (Left) target temperature\n0x05   | tempMax | Maximum selectable temperature\n0x06   | tempMin | Minimum selectable temperature\n0x07   | leftRetDiff | Unit 1 (Left) hysteresis\n0x08   | startDelay | Start Delay (minutes)\n0x09   | unit | Temperature unit (0=Celsius, 1=Fahrenheit)\n0x0A   | leftTCHot | Unit 1 (Left) temperature correction when at or above -6°C\n0x0B   | leftTCMid | Unit 1 (Left) temperature correction when between -12°C and -6°C\n0x0C   | leftTCCold | Unit 1 (Left) temperature correction when below -12°C\n0x0D   | leftTCHalt | Unit 1 (Left) temperature correction when shut down\n\nFor dual-zone fridges:\n\nOffset | Name | Description\n-------|------|------------\n0x0E   | rightTarget | Unit 2 (Right) target temperature\n0x0F   | | Always zero\n0x10   | | Always zero\n0x11   | rightRetDiff | Unit 2 (Right) hysteresis\n0x12   | rightTCHot | Unit 2 (Right) temperature correction when at or above -6°C\n0x13   | rightTCMid | Unit 2 (Right) temperature correction when between -12°C and -6°C\n0x14   | rightTCCold | Unit 2 (Right) temperature correction when below -12°C\n0x15   | rightTCHalt | Unit 2 (Right) temperature correction when shut down\n0x16   | | Always zero\n0x17   | | Always zero\n0x18   | | Always zero\n\n### App Command flow\n\nWhen connecting to a fridge, the app sends a bind command and waits for a bind notify message to confirm that you are connecting to the right fridge.\n\n```\n2023-09-05 23:05:12.827173  0x1235  Write   fe fe 03 00 01 ff\n2023-09-05 23:05:14.276572  0x1236  Notify  fe fe 04 00 01 02 01\n```\n\nAfter the fridge selection has been confirmed, the app sends a query command every 2 seconds.\n\n```\n2023-09-05 23:05:16.358755  0x1235  Write   fe fe 03 01 02 00\n2023-09-05 23:05:16.455384  0x1236  Notify  fe fe 15 01 00 01 00 00 f1 14 ec 02 00 00 00 00 00 00 f3 64 0c 03 05 6c\n2023-09-05 23:05:18.383106  0x1235  Write   fe fe 03 01 02 00\n2023-09-05 23:05:18.466445  0x1236  Notify  fe fe 15 01 00 01 00 00 f1 14 ec 02 00 00 00 00 00 00 f3 64 0c 03 05 6c\n```\n\nSetting the target temperature in the app sends the Set Left/Right Target command with the temperature in the selected unit.\n\n```\n2023-09-05 19:49:20.487666  0x1235  Write   fe fe 03 05 ec 02 f1\n2023-09-05 19:49:20.570163  0x1236  Notify  fe fe 03 05 ec 02 f1\n```\n\nSetting anything else sends a Set command with all of the unchanged values filled in from the previous Query data.\n\n```\n2023-09-05 19:54:14.152600  0x1236  Notify  fe fe 15 01 00 01 00 00 ec 14 ec 02 00 00 00 00 00 00 f7 7f 0b 01 05 83\n2023-09-05 19:54:15.444012  0x1235  Write   fe fe 11 02 00 01 00 02 ec 14 ec 02 00 00 00 00 00 00 04 00\n2023-09-05 19:54:15.530186  0x1236  Notify  fe fe 15 02 00 01 00 02 ec 14 ec 02 00 00 00 00 00 00 f7 7f 0b 01 05 86\n2023-09-05 19:54:15.991368  0x1235  Write   fe fe 03 01 02 00\n2023-09-05 19:54:16.071697  0x1236  Notify  fe fe 15 01 00 01 00 02 ec 14 ec 02 00 00 00 00 00 00 f7 7f 0b 01 05 85\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklightspeed%2Fbrassmonkeyfridgemonitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklightspeed%2Fbrassmonkeyfridgemonitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklightspeed%2Fbrassmonkeyfridgemonitor/lists"}