Bluetooth and its LE variant are new areas for me and, but the learning curve is not too steep thanks to Puck.js. Making it do what I want is not easy though since I don’t know what it can do.
The most important documents are:
- https://www.bluetooth.com/specifications/gatt/services for the GATT services which are known
 - https://www.bluetooth.com/specifications/gatt/characteristics for the Characteristics of those
 - The Espruino Puck.js forum in case you have questions
 - The Espruino source code and
 - The reference information for Espruino hardware and software (see the Bluetooth and NRF functions and their examples)
 
Here an example:
// Have a service to show temperature and battery level
// This is only visible when you are connecting to the Puck
var currentTemperature=E.getTemperature().toFixed(2)*100;
console.log("Temp: "+currentTemperature);
NRF.setServices({
 0x1809 : { // Health Thermometer
  0x2A6E: { // Temperature
   readable: true,
   notify: true,
   value : [ currentTemperature % 256, currentTemperature / 256 ]
  }
 },
 0x180f : { // Battery Level
  0x2a19 : { // Percentage
   readable : true,
   notify: true,
   value: [ Puck.getBatteryPercentage() ],
  }
 }
});
// Updating the temperature
setInterval(function() {
 currentTemperature += 1; // For debugging: increase temp by 0.01 degree per update
 NRF.updateServices({
  0x1809 : {
   0x2A6E : {
    value : [ currentTemperature % 256, currentTemperature / 256 ],
    notify: true
   }
  }
 });
}, 2000);