Most recent activity
-
I am so glad you got back to this! I looked into your bangle app as an example to work from and get started. I am trying to take my puck which I use as a simple on/off/volume up/volume down button in Home Assistant based on button presses. I use the SwButton module to do the button click heavy lifting.
1 short press is toggle on and off via generic boolean (0x0F)
1 long press is vol up count (0x09) goes from 0 to 1 vol goes up
2 short presses is vol down count (0x09)goes from 0 to 2 vol goes down
These numbers come in as count in bthome and get used in an automation.I have it working w EspruinoHub and MQTT fine - but want to "upgrade" BTHome so I can use the PiZero with the EspruinoHub on it for something else, and I have a lot to BluetoothProxies around the house anyway.
I wrote the following which seems to work fine except one issue -- the advertised count reverting to 0 after the button is pressed doesn't seem fast enough. Is that in my idletimeout?
Anyway - any comments or ways to make this cleaner/faster appreciated
//https://raw.githubusercontent.com/muet/EspruinoDocs/master/modules/SWButton.js var SWBtn = require("SWButton"); var buttonState = 0; var btnData = {}; var idleTimeout; if (!Puck.bleAdvert) Puck.bleAdvert = {}; // these get created with a puck button press var mySWBtn = new SWBtn(function(k){ if (k === "S" ) { // single button press buttonState = !buttonState; btnData.state = buttonState; btnData.press = + 0; } else if (k === "L" ) { // long button press btnData.press = 1; } else if (k === "SS") { // double short press btnData.press = 2; } updateBTHome(btnData); }); function initBTHome() { tempF = [(E.getTemperature()*9/5)+32]; Puck.bleAdvert[0xFCD2] = [ 0x40, /* BTHome Device Information bit 0: "Encryption flag" bit 1-4: "Reserved for future use" bit 5-7: "BTHome Version" */ 0x01, // Battery, 8 bit E.getBattery(), 0x02, // Temperature, 16 bit tempF&255,tempF>>8, ]; NRF.setAdvertising(Puck.bleAdvert); } setInterval(function() { initBTHome(); }, 1*60*1000); // 1 min function updateBTHome(btnData) { Puck.bleAdvert[0xFCD2] = [ 0x40, /* BTHome Device Information bit 0: "Encryption flag" bit 1-4: "Reserved for future use" bit 5-7: "BTHome Version" */ 0x09, // count button press, 1 bit btnData.press, 0x0F, // binary button state, uint8 (1 byte) btnData.state, ]; NRF.setAdvertising(Puck.bleAdvert); if (idleTimeout) clearTimeout(idleTimeout); idleTimeout = setTimeout(function() { idleTimeout = undefined; Puck.bleAdvert[0xFCD2][2] = 0; NRF.setAdvertising(Puck.bleAdvert); },2000); }
Thanks for getting to this despite it being "another standard"
-
-
-
Coming back to this out of interest due to the new bluetooth proxy that home assistant has. Has anyone looked into BTHome https://bthome.io/ for home Assistant. I think if this was used the whole hub and mqtt could be skipped?
-
ok. Cleared out all my files, went back to basics.
added an image and an info file to storage. then added a ibeacon.boot.js file to storage withvar myiBeacon = require("ble_ibeacon").get({ uuid : [0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx], [#myuuid](https://forum.espruino.com/search/?q=%23myuuid) rssi : -74 }); var _setAdvertising = NRF.setAdvertising; NRF.setAdvertising = function(a,b) { if (Array.isArray(typeof a)) a = [a,myiBeacon]; _setAdvertising(a,b); }; function advertiseBeacon() { NRF.setAdvertising(Bangle.bleAdvert); } if (!Bangle.bleAdvert) Bangle.bleAdvert = {}; setInterval(advertiseBeacon, 60 * 1000); advertiseBeacon();
did a load() and it disconnected from bangle2 with prompt not detected, upload failed, trying to recover. And it reconnected. At that point I checked the file was saved - it was and I did load() and then disconnected - and all seems to work. It is picked up by Home Assistant Espresense as an ibeacon.
I guess I should now try t add widget bootgattbat and see if they all work together. First... a backup
-
Nope. With code below I only get to the bangle logo with a line
-> bluetooththen it sticks
var myiBeacon = require("ble_ibeacon").get({ uuid : [0xbd, 0x84, 0xb1, 0xb2, 0x1c, 0x2c, 0x00, 0xbe, 0x0c, 0xe9, 0x26, 0x70, 0x0f, 0xfe, 0x0c, 0xa0], rssi : -74 }); NRF.setAdvertising = function(a,b) { if (Array.isArray(typeof a)) a = [a,myiBeacon]; _setAdvertising(a,b); }; var _setAdvertising = NRF.setAdvertising; function advertiseBeacon() { NRF.setAdvertising(Bangle.bleAdvert); } if (!Bangle.bleAdvert) Bangle.bleAdvert = {}; setInterval(advertiseBeacon, 60 * 1000); advertiseBeacon();
-
-
Thanks for info on error.
Also - thanks for overwrite of setAdvertising. Tried it and get an error on left side of ide at line 7: invalid typeof value "array"
I g-searched but could not come up with a fix. I assume you are checking to see if incoming a is an array? Sorry - just a hair above my javascript knowledge. -
How would I use this example as a way use my bangle2 to advertising it as a beacon?
I have tried(() => { function advertiseBeacon() { NRF.setAdvertising([ require("ble_ibeacon").get({ uuid : [0xb1, 0xae, 0x51, 0x2b, 0x97, 0x03, 0x4a, 0xe2, 0xb9, 0xc3, 0x9e, 0x26, 0x0c, 0xa7, 0xb3, 0x99], rssi : -60 }) ]); } setInterval(advertiseBeacon, 60 * 1000); advertiseBeacon(); })();
but get a "Uncaught Storage Updated" when I try to save it to a file in storage on the watch.
I want to figure out how to use it in this format
Bangle.bleAdvert[0x180F] = [E.getBattery()];
so they all play together
Thanks
Katherine
Thanks for the tips - as always very helpful - and again thanks for the bthome example.