Avatar for kab

kab

Member since Jan 2022 • Last active Mar 2023
  • 5 conversations
  • 27 comments

Most recent activity

  • in Bangle.js
    Avatar for kab

    Thanks for the tips - as always very helpful - and again thanks for the bthome example.

  • in Bangle.js
    Avatar for kab

    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"

  • in Bangle.js
    Avatar for kab

    I have to confess, all this hex stuff makes my eyes crossed (grin). If you ever get the above "trivial" bthome module done, that would be quite helpful. I'd love to do it myself but have run into alot of walls trying.

  • in Bangle.js
    Avatar for kab

    I agree. Yet another standard
    But if you could host a module - that would make future home assistant integrations easy I think.

    Is it just a matter of advertising the bthome code rather than the bluetooth std code.
    ie
    battery advertisement
    bluetooth std code = 0x180F
    bthome code = 0x01

  • in Bangle.js
    Avatar for kab

    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?

  • in Bangle.js
    Avatar for kab

    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 with

    var myiBeacon = require("ble_ibeacon").get({
      uuid : [0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx], [#myuuid](http://forum.espruino.com/sear­ch/?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

  • in Bangle.js
    Avatar for kab

    Nope. With code below I only get to the bangle logo with a line
    -> bluetooth

    then 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();
    
  • in Bangle.js
    Avatar for kab
    Uncaught error: Too much recursion stack is about to overflow
    in function "_setadvertising" called from line 9 col 21 in .boot0
    

    First "rotating" the advertising code seems to work. Stick to no more ble advertising and I should be fine?

  • in Bangle.js
    Avatar for kab

    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.

  • in Bangle.js
    Avatar for kab

    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

Actions