Experimental: ANT+ / BLE support for speed

Tries to address #75 by:
Changes:

Adds wheel simulation to generate speed data

Assumes tire with 2.096 meter circumference (Garmin default), which corresponds to 700x23C

Adds speed support to bot bike for testing
Bikes that already support speed (Flywheel, IC4) pass through speed
Added speed calculation for Peleton based on https://ihaque.org/posts/2020/12/25/pelomon-part-ib-computing-speed/
Updated existing BLE GATT CSC + BLE GATT CPS server for speed (via wheel rotation + timestamp)
Created ANT+ SPD server for speed (via wheel rotation + timestamp)

Conscious decisions:

ANT+ support a SPD+CAD profile, which is very similar to the SPD profile. But as the PWR profile already provides cadence, the SPD profile seemed sufficient.

Issues:

Unable to get ANT+ PWR and SPD working at the same time

It appears that the required different broadcast intervals for PWR and SPD lead to a collision of messages at some point

Unable to test speed on BLE GATT CSC due to lack of supported devices
Unable to test the Peleton and Flywheel bikes

To try this out:

Start with current Gymnasticon Pi image
Place the device into R/W mode:

overctl -rw

Setup build environmant:

sudo apt-get update --allow-releaseinfo-change
sudo apt-get install git
cd
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
sudo service gymnasticon stop
sudo setcap cap_net_raw+eip $(eval readlink -f $(which node))

Checkout experimental branch and build it

git fetch origin pull/89/head:antble-speed
git checkout antble-speed
npm install
npm run build
npm link
gymnasticon

Provide output if things are not working
@ptx2 Would be great if you could have a look at the BLE GATT CSC part.

@chriselsen - Hi Chris, I have the upgraded Keiser computer which shows speed - if it’s any use I’m happy to test speed at various watts this evening to build a power/speed graph - I’m assuming it likely works similar to the peloton calcs as the bike has no idea of users weight etc??…

@nealjane The speed formula for Peleton is based on this article. If you can come up with a similar formula for the Keiser bike, I can definitely implement that.
You probably want to get started by graphing displayed speed at various power levels to see if you spot a pattern/formula.

@chriselsen , ok, got it working with fresh eyes this morning.!
the new Keiser computer (with Bluetooth converter now built in) clearly has more power and I thinks it’s interfering with Gymnasticon (had to move Gymnasticon closer to bike since I fitted it and still get intermittent drops in power over ant), so I may just replace it with my older computer this am - just for avoidance of doubt.
CaS appears under ant sensors on watch, adding shows all power, speed and cadence in indoor bike on my fenix. It tends to loose connection (but I’m putting this down to the new Keiser computer and will see what happens when I swap computers this am)
connecting to the Bluetooth on Gymnasticon - zwift/RGT- power drops to zero intermittently on my iphone (both apps have power buffer set to zero).
these issues could be connected to the new Bluetooth Keiser computer (although I’ve never had the Bluetooth power dropping to zero previously.

NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser
[2021-10-21T10:53:52.176Z] connecting to bike...
Keiser M3 bike version:  6.38  (Stats timeout:  2  sec.)
[2021-10-21T10:54:14.526Z] bike connected d8:b0:b5:6a:ce:3b
[2021-10-21T10:54:14.614Z] ANT+ stick opened
[2021-10-21T10:54:14.805Z] received stats from bike [power=20W cadence=65rpm speed=0km/h]
[2021-10-21T10:54:14.829Z] pedal stroke [timestamp=1634813654810 revolutions=1 cadence=65rpm power=20W]
[2021-10-21T10:54:15.129Z] received stats from bike [power=20W cadence=65rpm speed=0km/h]
[2021-10-21T10:54:15.450Z] received stats from bike [power=20W cadence=66rpm speed=0km/h]
[2021-10-21T10:54:15.720Z] pedal stroke [timestamp=1634813655719.0908 revolutions=2 cadence=66rpm power=20W]
[2021-10-21T10:54:15.772Z] received stats from bike [power=20W cadence=66rpm speed=0km/h]
[2021-10-21T10:54:16.099Z] received stats from bike [power=20W cadence=66rpm speed=0km/h]
[2021-10-21T10:54:16.427Z] received stats from bike [power=20W cadence=67rpm speed=0km/h]
[2021-10-21T10:54:16.615Z] pedal stroke [timestamp=1634813656614.6133 revolutions=3 cadence=67rpm power=20W]
[2021-10-21T10:54:16.753Z] received stats from bike [power=20W cadence=67rpm speed=0km/h]
[2021-10-21T10:54:17.079Z] received stats from bike [power=20W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:17.497Z] pedal stroke [timestamp=1634813657496.9663 revolutions=4 cadence=68rpm power=20W]
[2021-10-21T10:54:17.725Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:18.043Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:18.370Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:18.380Z] pedal stroke [timestamp=1634813658379.3193 revolutions=5 cadence=68rpm power=21W]
[2021-10-21T10:54:19.014Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:19.262Z] pedal stroke [timestamp=1634813659261.6724 revolutions=6 cadence=68rpm power=21W]
[2021-10-21T10:54:19.339Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:19.664Z] received stats from bike [power=21W cadence=68rpm speed=0km/h]
[2021-10-21T10:54:20.145Z] pedal stroke [timestamp=1634813660144.0254 revolutions=7 cadence=68rpm power=21W]
[2021-10-21T10:54:20.314Z] received stats from bike [power=21W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:20.636Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:20.965Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:21.014Z] pedal stroke [timestamp=1634813661013.5906 revolutions=8 cadence=69rpm power=22W]
[2021-10-21T10:54:21.299Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:21.615Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:21.884Z] pedal stroke [timestamp=1634813661883.1558 revolutions=9 cadence=69rpm power=22W]
[2021-10-21T10:54:21.942Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:22.595Z] received stats from bike [power=22W cadence=69rpm speed=0km/h]
[2021-10-21T10:54:22.753Z] pedal stroke [timestamp=1634813662752.721 revolutions=10 cadence=69rpm power=22W]
[2021-10-21T10:54:23.566Z] received stats from bike [power=22W cadence=70rpm speed=0km/h]
[2021-10-21T10:54:23.612Z] pedal stroke [timestamp=1634813663609.8638 revolutions=11 cadence=70rpm power=22W]
[2021-10-21T10:54:23.893Z] received stats from bike [power=22W cadence=70rpm speed=0km/h]
[2021-10-21T10:54:24.216Z] received stats from bike [power=22W cadence=70rpm speed=0km/h]
[2021-10-21T10:54:24.468Z] pedal stroke [timestamp=1634813664467.0066 revolutions=12 cadence=70rpm power=22W]
[2021-10-21T10:54:24.859Z] received stats from bike [power=25W cadence=76rpm speed=0km/h]
[2021-10-21T10:54:25.257Z] pedal stroke [timestamp=1634813665256.4802 revolutions=13 cadence=76rpm power=25W]
[2021-10-21T10:54:25.504Z] received stats from bike [power=25W cadence=76rpm speed=0km/h]
[2021-10-21T10:54:25.826Z] received stats from bike [power=25W cadence=81rpm speed=0km/h]
[2021-10-21T10:54:26.000Z] pedal stroke [timestamp=1634813665997.221 revolutions=14 cadence=81rpm power=25W]
[2021-10-21T10:54:26.150Z] received stats from bike [power=25W cadence=81rpm speed=0km/h]
[2021-10-21T10:54:26.738Z] pedal stroke [timestamp=1634813666737.9617 revolutions=15 cadence=81rpm power=25W]
[2021-10-21T10:54:26.793Z] received stats from bike [power=25W cadence=82rpm speed=0km/h]
[2021-10-21T10:54:27.447Z] received stats from bike [power=25W cadence=84rpm speed=0km/h]
[2021-10-21T10:54:27.454Z] pedal stroke [timestamp=1634813667452.2473 revolutions=16 cadence=84rpm power=25W]
[2021-10-21T10:54:27.774Z] received stats from bike [power=53W cadence=84rpm speed=15km/h]
[2021-10-21T10:54:27.786Z] wheel rotation [timestamp=1634813667778 revolutions=1 speed=15km/h power=53W]
[2021-10-21T10:54:28.101Z] received stats from bike [power=53W cadence=84rpm speed=15km/h]
[2021-10-21T10:54:28.168Z] pedal stroke [timestamp=1634813668166.533 revolutions=17 cadence=84rpm power=53W]
[2021-10-21T10:54:28.282Z] wheel rotation [timestamp=1634813668281.04 revolutions=2 speed=15km/h power=53W]
[2021-10-21T10:54:28.426Z] received stats from bike [power=60W cadence=83rpm speed=14km/h]
[2021-10-21T10:54:28.821Z] wheel rotation [timestamp=1634813668820.0115 revolutions=3 speed=14km/h power=60W]
[2021-10-21T10:54:28.890Z] pedal stroke [timestamp=1634813668889.4246 revolutions=18 cadence=83rpm power=60W]
[2021-10-21T10:54:29.072Z] received stats from bike [power=63W cadence=83rpm speed=17km/h]
[2021-10-21T10:54:29.264Z] wheel rotation [timestamp=1634813669263.8704 revolutions=4 speed=17km/h power=63W]
[2021-10-21T10:54:29.396Z] received stats from bike [power=63W cadence=83rpm speed=17km/h]
[2021-10-21T10:54:29.613Z] pedal stroke [timestamp=1634813669612.3162 revolutions=19 cadence=83rpm power=63W]
[2021-10-21T10:54:29.708Z] wheel rotation [timestamp=1634813669707.7292 revolutions=5 speed=17km/h power=63W]
[2021-10-21T10:54:30.044Z] received stats from bike [power=64W cadence=84rpm speed=17km/h]
[2021-10-21T10:54:30.155Z] wheel rotation [timestamp=1634813670151.5881 revolutions=6 speed=17km/h power=64W]
[2021-10-21T10:54:30.327Z] pedal stroke [timestamp=1634813670326.6018 revolutions=20 cadence=84rpm power=64W]
[2021-10-21T10:54:30.361Z] received stats from bike [power=64W cadence=84rpm speed=17km/h]
[2021-10-21T10:54:30.596Z] wheel rotation [timestamp=1634813670595.447 revolutions=7 speed=17km/h power=64W]
[2021-10-21T10:54:31.011Z] received stats from bike [power=64W cadence=84rpm speed=17km/h]
[2021-10-21T10:54:31.041Z] wheel rotation [timestamp=1634813671039.306 revolutions=8 speed=17km/h power=64W]
[2021-10-21T10:54:31.047Z] pedal stroke [timestamp=1634813671040.8875 revolutions=21 cadence=84rpm power=64W]
[2021-10-21T10:54:31.335Z] received stats from bike [power=64W cadence=85rpm speed=17km/h]
[2021-10-21T10:54:31.484Z] wheel rotation [timestamp=1634813671483.1648 revolutions=9 speed=17km/h power=64W]
[2021-10-21T10:54:31.660Z] received stats from bike [power=65W cadence=85rpm speed=17km/h]
[2021-10-21T10:54:31.750Z] pedal stroke [timestamp=1634813671746.7698 revolutions=22 cadence=85rpm power=65W]
[2021-10-21T10:54:31.929Z] wheel rotation [timestamp=1634813671927.0237 revolutions=10 speed=17km/h power=65W]
[2021-10-21T10:54:31.988Z] received stats from bike [power=65W cadence=85rpm speed=17km/h]
[2021-10-21T10:54:32.311Z] received stats from bike [power=65W cadence=85rpm speed=17km/h]
[2021-10-21T10:54:32.371Z] wheel rotation [timestamp=1634813672370.8826 revolutions=11 speed=17km/h power=65W]
[2021-10-21T10:54:32.453Z] pedal stroke [timestamp=1634813672452.652 revolutions=23 cadence=85rpm power=65W]
[2021-10-21T10:54:32.815Z] wheel rotation [timestamp=1634813672814.7415 revolutions=12 speed=17km/h power=65W]
[2021-10-21T10:54:32.962Z] received stats from bike [power=71W cadence=84rpm speed=16km/h]
[2021-10-21T10:54:33.168Z] pedal stroke [timestamp=1634813673166.9377 revolutions=24 cadence=84rpm power=71W]
[2021-10-21T10:54:33.285Z] received stats from bike [power=104W cadence=84rpm speed=20km/h]
[2021-10-21T10:54:33.292Z] wheel rotation [timestamp=1634813673288 revolutions=13 speed=20km/h power=104W]
[2021-10-21T10:54:33.614Z] received stats from bike [power=113W cadence=85rpm speed=23km/h]
[2021-10-21T10:54:33.625Z] wheel rotation [timestamp=1634813673620 revolutions=14 speed=23km/h power=113W]
[2021-10-21T10:54:33.872Z] pedal stroke [timestamp=1634813673872.82 revolutions=25 cadence=85rpm power=113W]
[2021-10-21T10:54:33.935Z] received stats from bike [power=113W cadence=85rpm speed=23km/h]
[2021-10-21T10:54:33.949Z] wheel rotation [timestamp=1634813673948.0696 revolutions=15 speed=23km/h power=113W]
[2021-10-21T10:54:34.277Z] wheel rotation [timestamp=1634813674276.1392 revolutions=16 speed=23km/h power=113W]
[2021-10-21T10:54:34.580Z] pedal stroke [timestamp=1634813674578.7024 revolutions=26 cadence=85rpm power=113W]
[2021-10-21T10:54:34.591Z] received stats from bike [power=113W cadence=88rpm speed=23km/h]
[2021-10-21T10:54:34.605Z] wheel rotation [timestamp=1634813674604.2087 revolutions=17 speed=23km/h power=113W]
[2021-10-21T10:54:34.911Z] received stats from bike [power=113W cadence=88rpm speed=23km/h]
[2021-10-21T10:54:34.933Z] wheel rotation [timestamp=1634813674932.2783 revolutions=18 speed=23km/h power=113W]
[2021-10-21T10:54:35.235Z] received stats from bike [power=113W cadence=88rpm speed=23km/h]
[2021-10-21T10:54:35.261Z] pedal stroke [timestamp=1634813675260.5205 revolutions=27 cadence=88rpm power=113W]
[2021-10-21T10:54:35.266Z] wheel rotation [timestamp=1634813675260.348 revolutions=19 speed=23km/h power=113W]
[2021-10-21T10:54:35.590Z] wheel rotation [timestamp=1634813675588.4175 revolutions=20 speed=23km/h power=113W]
[2021-10-21T10:54:35.881Z] received stats from bike [power=121W cadence=89rpm speed=22km/h]
[2021-10-21T10:54:35.932Z] wheel rotation [timestamp=1634813675931.3994 revolutions=21 speed=22km/h power=121W]
[2021-10-21T10:54:35.940Z] pedal stroke [timestamp=1634813675934.6777 revolutions=28 cadence=89rpm power=121W]
[2021-10-21T10:54:36.205Z] received stats from bike [power=121W cadence=88rpm speed=22km/h]
[2021-10-21T10:54:36.275Z] wheel rotation [timestamp=1634813676274.3813 revolutions=22 speed=22km/h power=121W]
[2021-10-21T10:54:36.531Z] received stats from bike [power=121W cadence=88rpm speed=22km/h]
[2021-10-21T10:54:36.617Z] pedal stroke [timestamp=1634813676616.4958 revolutions=29 cadence=88rpm power=121W]
[2021-10-21T10:54:36.626Z] wheel rotation [timestamp=1634813676617.3633 revolutions=23 speed=22km/h power=121W]
[2021-10-21T10:54:36.962Z] wheel rotation [timestamp=1634813676960.3452 revolutions=24 speed=22km/h power=121W]
[2021-10-21T10:54:37.178Z] received stats from bike [power=121W cadence=89rpm speed=22km/h]
[2021-10-21T10:54:37.291Z] pedal stroke [timestamp=1634813677290.653 revolutions=30 cadence=89rpm power=121W]
[2021-10-21T10:54:37.305Z] wheel rotation [timestamp=1634813677303.3271 revolutions=25 speed=22km/h power=121W]
[2021-10-21T10:54:37.498Z] received stats from bike [power=121W cadence=88rpm speed=22km/h]
[2021-10-21T10:54:37.647Z] wheel rotation [timestamp=1634813677646.309 revolutions=26 speed=22km/h power=121W]
[2021-10-21T10:54:37.824Z] received stats from bike [power=121W cadence=88rpm speed=22km/h]
[2021-10-21T10:54:37.973Z] pedal stroke [timestamp=1634813677972.4712 revolutions=31 cadence=88rpm power=121W]
[2021-10-21T10:54:37.996Z] wheel rotation [timestamp=1634813677989.291 revolutions=27 speed=22km/h power=121W]
[2021-10-21T10:54:38.150Z] received stats from bike [power=121W cadence=89rpm speed=22km/h]
[2021-10-21T10:54:38.333Z] wheel rotation [timestamp=1634813678332.273 revolutions=28 speed=22km/h power=121W]
[2021-10-21T10:54:38.470Z] received stats from bike [power=123W cadence=89rpm speed=22km/h]
[2021-10-21T10:54:38.648Z] pedal stroke [timestamp=1634813678646.6284 revolutions=32 cadence=89rpm power=123W]
[2021-10-21T10:54:38.676Z] wheel rotation [timestamp=1634813678675.255 revolutions=29 speed=22km/h power=123W]
[2021-10-21T10:54:38.791Z] received stats from bike [power=167W cadence=89rpm speed=26km/h]
[2021-10-21T10:54:38.966Z] wheel rotation [timestamp=1634813678965.4702 revolutions=30 speed=26km/h power=167W]
[2021-10-21T10:54:39.256Z] wheel rotation [timestamp=1634813679255.6855 revolutions=31 speed=26km/h power=167W]
[2021-10-21T10:54:39.321Z] pedal stroke [timestamp=1634813679320.7856 revolutions=33 cadence=89rpm power=167W]
[2021-10-21T10:54:39.439Z] received stats from bike [power=206W cadence=90rpm speed=31km/h]
[2021-10-21T10:54:39.500Z] wheel rotation [timestamp=1634813679499.092 revolutions=32 speed=31km/h power=206W]
[2021-10-21T10:54:39.743Z] wheel rotation [timestamp=1634813679742.4985 revolutions=33 speed=31km/h power=206W]
[2021-10-21T10:54:39.765Z] received stats from bike [power=203W cadence=89rpm speed=31km/h]
[2021-10-21T10:54:39.987Z] wheel rotation [timestamp=1634813679985.905 revolutions=34 speed=31km/h power=203W]
[2021-10-21T10:54:39.995Z] pedal stroke [timestamp=1634813679994.9429 revolutions=34 cadence=89rpm power=203W]
[2021-10-21T10:54:40.085Z] received stats from bike [power=203W cadence=89rpm speed=31km/h]
[2021-10-21T10:54:40.230Z] wheel rotation [timestamp=1634813680229.3115 revolutions=35 speed=31km/h power=203W]
[2021-10-21T10:54:40.475Z] wheel rotation [timestamp=1634813680472.718 revolutions=36 speed=31km/h power=203W]
[2021-10-21T10:54:40.699Z] pedal stroke [timestamp=1634813680669.1 revolutions=35 cadence=89rpm power=203W]
[2021-10-21T10:54:40.721Z] wheel rotation [timestamp=1634813680716.1245 revolutions=37 speed=31km/h power=203W]
[2021-10-21T10:54:40.754Z] received stats from bike [power=213W cadence=93rpm speed=30km/h]
[2021-10-21T10:54:40.968Z] wheel rotation [timestamp=1634813680967.6445 revolutions=38 speed=30km/h power=213W]
[2021-10-21T10:54:41.049Z] received stats from bike [power=210W cadence=91rpm speed=30km/h]
[2021-10-21T10:54:41.220Z] wheel rotation [timestamp=1634813681219.1646 revolutions=39 speed=30km/h power=210W]
[2021-10-21T10:54:41.329Z] pedal stroke [timestamp=1634813681328.4407 revolutions=36 cadence=91rpm power=210W]
[2021-10-21T10:54:41.371Z] received stats from bike [power=210W cadence=91rpm speed=30km/h]
[2021-10-21T10:54:41.470Z] wheel rotation [timestamp=1634813681470.6846 revolutions=40 speed=30km/h power=210W]
[2021-10-21T10:54:41.700Z] received stats from bike [power=206W cadence=90rpm speed=31km/h]
[2021-10-21T10:54:41.716Z] wheel rotation [timestamp=1634813681714.091 revolutions=41 speed=31km/h power=206W]
[2021-10-21T10:54:41.958Z] wheel rotation [timestamp=1634813681957.4976 revolutions=42 speed=31km/h power=206W]
[2021-10-21T10:54:41.998Z] pedal stroke [timestamp=1634813681995.1074 revolutions=37 cadence=90rpm power=206W]
[2021-10-21T10:54:42.029Z] received stats from bike [power=206W cadence=90rpm speed=31km/h]
[2021-10-21T10:54:42.201Z] wheel rotation [timestamp=1634813682200.904 revolutions=43 speed=31km/h power=206W]
[2021-10-21T10:54:42.350Z] received stats from bike [power=206W cadence=90rpm speed=31km/h]
[2021-10-21T10:54:42.445Z] wheel rotation [timestamp=1634813682444.3105 revolutions=44 speed=31km/h power=206W]
[2021-10-21T10:54:42.662Z] pedal stroke [timestamp=1634813682661.7742 revolutions=38 cadence=90rpm power=206W]
[2021-10-21T10:54:42.688Z] wheel rotation [timestamp=1634813682687.717 revolutions=45 speed=31km/h power=206W]
[2021-10-21T10:54:42.932Z] wheel rotation [timestamp=1634813682931.1235 revolutions=46 speed=31km/h power=206W]
[2021-10-21T10:54:42.996Z] received stats from bike [power=206W cadence=92rpm speed=31km/h]
[2021-10-21T10:54:43.175Z] wheel rotation [timestamp=1634813683174.53 revolutions=47 speed=31km/h power=206W]
[2021-10-21T10:54:43.314Z] pedal stroke [timestamp=1634813683313.948 revolutions=39 cadence=92rpm power=206W]
[2021-10-21T10:54:43.418Z] wheel rotation [timestamp=1634813683417.9365 revolutions=48 speed=31km/h power=206W]
[2021-10-21T10:54:43.641Z] received stats from bike [power=215W cadence=93rpm speed=30km/h]
[2021-10-21T10:54:43.670Z] wheel rotation [timestamp=1634813683669.4565 revolutions=49 speed=30km/h power=215W]
[2021-10-21T10:54:43.921Z] wheel rotation [timestamp=1634813683920.9766 revolutions=50 speed=30km/h power=215W]
[2021-10-21T10:54:43.959Z] received stats from bike [power=215W cadence=93rpm speed=30km/h]
[2021-10-21T10:54:43.966Z] pedal stroke [timestamp=1634813683963 revolutions=40 cadence=93rpm power=215W]
[2021-10-21T10:54:44.173Z] wheel rotation [timestamp=1634813684172.4966 revolutions=51 speed=30km/h power=215W]
[2021-10-21T10:54:44.288Z] received stats from bike [power=247W cadence=92rpm speed=32km/h]
[2021-10-21T10:54:44.409Z] wheel rotation [timestamp=1634813684408.2966 revolutions=52 speed=32km/h power=247W]
[2021-10-21T10:54:44.613Z] received stats from bike [power=285W cadence=92rpm speed=37km/h]
[2021-10-21T10:54:44.620Z] pedal stroke [timestamp=1634813684616 revolutions=41 cadence=92rpm power=285W]
[2021-10-21T10:54:44.626Z] wheel rotation [timestamp=1634813684617 revolutions=53 speed=37km/h power=285W]
[2021-10-21T10:54:44.821Z] wheel rotation [timestamp=1634813684820.935 revolutions=54 speed=37km/h power=285W]
[2021-10-21T10:54:44.941Z] received stats from bike [power=316W cadence=90rpm speed=39km/h]
[2021-10-21T10:54:45.015Z] wheel rotation [timestamp=1634813685014.4119 revolutions=55 speed=39km/h power=316W]
[2021-10-21T10:54:45.209Z] wheel rotation [timestamp=1634813685207.8887 revolutions=56 speed=39km/h power=316W]
[2021-10-21T10:54:45.283Z] pedal stroke [timestamp=1634813685282.6667 revolutions=42 cadence=90rpm power=316W]
[2021-10-21T10:54:45.403Z] wheel rotation [timestamp=1634813685401.3655 revolutions=57 speed=39km/h power=316W]
[2021-10-21T10:54:45.594Z] received stats from bike [power=321W cadence=88rpm speed=39km/h]
[2021-10-21T10:54:45.602Z] wheel rotation [timestamp=1634813685598 revolutions=58 speed=39km/h power=321W]
[2021-10-21T10:54:45.792Z] wheel rotation [timestamp=1634813685791.4768 revolutions=59 speed=39km/h power=321W]
[2021-10-21T10:54:45.921Z] received stats from bike [power=321W cadence=88rpm speed=39km/h]
[2021-10-21T10:54:45.968Z] pedal stroke [timestamp=1634813685964.4849 revolutions=43 cadence=88rpm power=321W]
[2021-10-21T10:54:45.987Z] wheel rotation [timestamp=1634813685984.9536 revolutions=60 speed=39km/h power=321W]
[2021-10-21T10:54:46.180Z] wheel rotation [timestamp=1634813686178.4304 revolutions=61 speed=39km/h power=321W]
[2021-10-21T10:54:46.239Z] received stats from bike [power=332W cadence=90rpm speed=38km/h]
[2021-10-21T10:54:46.377Z] wheel rotation [timestamp=1634813686376.9988 revolutions=62 speed=38km/h power=332W]
[2021-10-21T10:54:46.558Z] received stats from bike [power=332W cadence=90rpm speed=38km/h]
[2021-10-21T10:54:46.576Z] wheel rotation [timestamp=1634813686575.5671 revolutions=63 speed=38km/h power=332W]
[2021-10-21T10:54:46.631Z] pedal stroke [timestamp=1634813686631.1516 revolutions=44 cadence=90rpm power=332W]
[2021-10-21T10:54:46.775Z] wheel rotation [timestamp=1634813686774.1355 revolutions=64 speed=38km/h power=332W]
[2021-10-21T10:54:46.898Z] received stats from bike [power=345W cadence=93rpm speed=41km/h]
[2021-10-21T10:54:46.959Z] wheel rotation [timestamp=1634813686958.1746 revolutions=65 speed=41km/h power=345W]
[2021-10-21T10:54:47.143Z] wheel rotation [timestamp=1634813687142.2136 revolutions=66 speed=41km/h power=345W]
[2021-10-21T10:54:47.202Z] received stats from bike [power=345W cadence=93rpm speed=41km/h]
[2021-10-21T10:54:47.277Z] pedal stroke [timestamp=1634813687276.313 revolutions=45 cadence=93rpm power=345W]
[2021-10-21T10:54:47.326Z] wheel rotation [timestamp=1634813687326.2527 revolutions=67 speed=41km/h power=345W]
[2021-10-21T10:54:47.523Z] wheel rotation [timestamp=1634813687510.2917 revolutions=68 speed=41km/h power=345W]
[2021-10-21T10:54:47.707Z] wheel rotation [timestamp=1634813687694.3308 revolutions=69 speed=41km/h power=345W]
[2021-10-21T10:54:47.880Z] wheel rotation [timestamp=1634813687878.3699 revolutions=70 speed=41km/h power=345W]
[2021-10-21T10:54:47.922Z] pedal stroke [timestamp=1634813687921.4744 revolutions=46 cadence=93rpm power=345W]
[2021-10-21T10:54:48.062Z] wheel rotation [timestamp=1634813688062.409 revolutions=71 speed=41km/h power=345W]
[2021-10-21T10:54:48.169Z] received stats from bike [power=335W cadence=91rpm speed=38km/h]
[2021-10-21T10:54:48.261Z] wheel rotation [timestamp=1634813688260.9773 revolutions=72 speed=38km/h power=335W]
[2021-10-21T10:54:48.460Z] wheel rotation [timestamp=1634813688459.5457 revolutions=73 speed=38km/h power=335W]
[2021-10-21T10:54:48.492Z] received stats from bike [power=335W cadence=91rpm speed=38km/h]
[2021-10-21T10:54:48.581Z] pedal stroke [timestamp=1634813688580.815 revolutions=47 cadence=91rpm power=335W]
[2021-10-21T10:54:48.659Z] wheel rotation [timestamp=1634813688658.114 revolutions=74 speed=38km/h power=335W]
[2021-10-21T10:54:48.811Z] received stats from bike [power=499W cadence=91rpm speed=49km/h]
[2021-10-21T10:54:48.819Z] wheel rotation [timestamp=1634813688815 revolutions=75 speed=49km/h power=499W]
[2021-10-21T10:54:48.968Z] wheel rotation [timestamp=1634813688968.992 revolutions=76 speed=49km/h power=499W]
[2021-10-21T10:54:49.123Z] wheel rotation [timestamp=1634813689122.984 revolutions=77 speed=49km/h power=499W]
[2021-10-21T10:54:49.138Z] received stats from bike [power=540W cadence=91rpm speed=51km/h]
[2021-10-21T10:54:49.241Z] pedal stroke [timestamp=1634813689240.1555 revolutions=48 cadence=91rpm power=540W]
[2021-10-21T10:54:49.271Z] wheel rotation [timestamp=1634813689270.9368 revolutions=78 speed=51km/h power=540W]
[2021-10-21T10:54:49.419Z] wheel rotation [timestamp=1634813689418.8896 revolutions=79 speed=51km/h power=540W]
[2021-10-21T10:54:49.567Z] wheel rotation [timestamp=1634813689566.8425 revolutions=80 speed=51km/h power=540W]
[2021-10-21T10:54:49.715Z] wheel rotation [timestamp=1634813689714.7954 revolutions=81 speed=51km/h power=540W]
[2021-10-21T10:54:49.783Z] received stats from bike [power=462W cadence=78rpm speed=47km/h]
[2021-10-21T10:54:49.876Z] wheel rotation [timestamp=1634813689875.34 revolutions=82 speed=47km/h power=462W]
[2021-10-21T10:54:50.010Z] pedal stroke [timestamp=1634813690009.3862 revolutions=49 cadence=78rpm power=462W]
[2021-10-21T10:54:50.036Z] wheel rotation [timestamp=1634813690035.8848 revolutions=83 speed=47km/h power=462W]
[2021-10-21T10:54:50.196Z] wheel rotation [timestamp=1634813690196.4294 revolutions=84 speed=47km/h power=462W]
[2021-10-21T10:54:50.357Z] wheel rotation [timestamp=1634813690356.974 revolutions=85 speed=47km/h power=462W]
[2021-10-21T10:54:50.430Z] received stats from bike [power=462W cadence=78rpm speed=47km/h]
[2021-10-21T10:54:50.518Z] wheel rotation [timestamp=1634813690517.5188 revolutions=86 speed=47km/h power=462W]
[2021-10-21T10:54:50.679Z] wheel rotation [timestamp=1634813690678.0635 revolutions=87 speed=47km/h power=462W]
[2021-10-21T10:54:50.779Z] pedal stroke [timestamp=1634813690778.617 revolutions=50 cadence=78rpm power=462W]
[2021-10-21T10:54:50.839Z] wheel rotation [timestamp=1634813690838.6082 revolutions=88 speed=47km/h power=462W]
[2021-10-21T10:54:51.000Z] wheel rotation [timestamp=1634813690999.1528 revolutions=89 speed=47km/h power=462W]
[2021-10-21T10:54:51.079Z] received stats from bike [power=462W cadence=80rpm speed=47km/h]
[2021-10-21T10:54:51.160Z] wheel rotation [timestamp=1634813691159.6975 revolutions=90 speed=47km/h power=462W]
[2021-10-21T10:54:51.321Z] wheel rotation [timestamp=1634813691320.2422 revolutions=91 speed=47km/h power=462W]
[2021-10-21T10:54:51.400Z] received stats from bike [power=462W cadence=80rpm speed=47km/h]
[2021-10-21T10:54:51.481Z] wheel rotation [timestamp=1634813691480.7869 revolutions=92 speed=47km/h power=462W]
[2021-10-21T10:54:51.529Z] pedal stroke [timestamp=1634813691528.617 revolutions=51 cadence=80rpm power=462W]
[2021-10-21T10:54:51.642Z] wheel rotation [timestamp=1634813691641.3315 revolutions=93 speed=47km/h power=462W]
[2021-10-21T10:54:51.720Z] received stats from bike [power=476W cadence=80rpm speed=46km/h]
[2021-10-21T10:54:51.807Z] wheel rotation [timestamp=1634813691805.3662 revolutions=94 speed=46km/h power=476W]
[2021-10-21T10:54:51.971Z] wheel rotation [timestamp=1634813691969.401 revolutions=95 speed=46km/h power=476W]
[2021-10-21T10:54:52.041Z] received stats from bike [power=482W cadence=80rpm speed=49km/h]
[2021-10-21T10:54:52.124Z] wheel rotation [timestamp=1634813692123.3928 revolutions=96 speed=49km/h power=482W]
[2021-10-21T10:54:52.278Z] wheel rotation [timestamp=1634813692277.3848 revolutions=97 speed=49km/h power=482W]
[2021-10-21T10:54:52.284Z] pedal stroke [timestamp=1634813692278.617 revolutions=52 cadence=80rpm power=482W]
[2021-10-21T10:54:52.364Z] received stats from bike [power=482W cadence=80rpm speed=49km/h]
[2021-10-21T10:54:52.432Z] wheel rotation [timestamp=1634813692431.3767 revolutions=98 speed=49km/h power=482W]
[2021-10-21T10:54:52.586Z] wheel rotation [timestamp=1634813692585.3687 revolutions=99 speed=49km/h power=482W]
[2021-10-21T10:54:52.683Z] received stats from bike [power=472W cadence=79rpm speed=46km/h]
[2021-10-21T10:54:52.750Z] wheel rotation [timestamp=1634813692749.4033 revolutions=100 speed=46km/h power=472W]
[2021-10-21T10:54:52.914Z] wheel rotation [timestamp=1634813692913.438 revolutions=101 speed=46km/h power=472W]
[2021-10-21T10:54:53.039Z] pedal stroke [timestamp=1634813693038.1106 revolutions=53 cadence=79rpm power=472W]
[2021-10-21T10:54:53.078Z] wheel rotation [timestamp=1634813693077.4727 revolutions=102 speed=46km/h power=472W]
[2021-10-21T10:54:53.243Z] wheel rotation [timestamp=1634813693241.5073 revolutions=103 speed=46km/h power=472W]
[2021-10-21T10:54:53.406Z] wheel rotation [timestamp=1634813693405.542 revolutions=104 speed=46km/h power=472W]
[2021-10-21T10:54:53.570Z] wheel rotation [timestamp=1634813693569.5767 revolutions=105 speed=46km/h power=472W]
[2021-10-21T10:54:53.665Z] received stats from bike [power=437W cadence=74rpm speed=44km/h]
[2021-10-21T10:54:53.742Z] wheel rotation [timestamp=1634813693741.0676 revolutions=106 speed=44km/h power=437W]
[2021-10-21T10:54:53.850Z] pedal stroke [timestamp=1634813693848.9214 revolutions=54 cadence=74rpm power=437W]
[2021-10-21T10:54:53.913Z] wheel rotation [timestamp=1634813693912.5586 revolutions=107 speed=44km/h power=437W]
[2021-10-21T10:54:53.993Z] received stats from bike [power=437W cadence=74rpm speed=44km/h]
[2021-10-21T10:54:54.085Z] wheel rotation [timestamp=1634813694084.0496 revolutions=108 speed=44km/h power=437W]
[2021-10-21T10:54:54.256Z] wheel rotation [timestamp=1634813694255.5405 revolutions=109 speed=44km/h power=437W]
[2021-10-21T10:54:54.429Z] wheel rotation [timestamp=1634813694427.0315 revolutions=110 speed=44km/h power=437W]
[2021-10-21T10:54:54.599Z] wheel rotation [timestamp=1634813694598.5225 revolutions=111 speed=44km/h power=437W]
[2021-10-21T10:54:54.635Z] received stats from bike [power=391W cadence=68rpm speed=42km/h]
[2021-10-21T10:54:54.732Z] pedal stroke [timestamp=1634813694731.2744 revolutions=55 cadence=68rpm power=391W]
[2021-10-21T10:54:54.779Z] wheel rotation [timestamp=1634813694778.1797 revolutions=112 speed=42km/h power=391W]
[2021-10-21T10:54:54.962Z] wheel rotation [timestamp=1634813694957.837 revolutions=113 speed=42km/h power=391W]
[2021-10-21T10:54:54.969Z] received stats from bike [power=391W cadence=68rpm speed=42km/h]
[2021-10-21T10:54:55.138Z] wheel rotation [timestamp=1634813695137.4941 revolutions=114 speed=42km/h power=391W]
[2021-10-21T10:54:55.291Z] received stats from bike [power=346W cadence=62rpm speed=41km/h]
[2021-10-21T10:54:55.322Z] wheel rotation [timestamp=1634813695321.5332 revolutions=115 speed=41km/h power=346W]
[2021-10-21T10:54:55.506Z] wheel rotation [timestamp=1634813695505.5723 revolutions=116 speed=41km/h power=346W]
[2021-10-21T10:54:55.691Z] wheel rotation [timestamp=1634813695689.6113 revolutions=117 speed=41km/h power=346W]
[2021-10-21T10:54:55.701Z] pedal stroke [timestamp=1634813695699.0164 revolutions=56 cadence=62rpm power=346W]
[2021-10-21T10:54:55.874Z] wheel rotation [timestamp=1634813695873.6504 revolutions=118 speed=41km/h power=346W]
[2021-10-21T10:54:56.058Z] wheel rotation [timestamp=1634813696057.6895 revolutions=119 speed=41km/h power=346W]
[2021-10-21T10:54:56.243Z] wheel rotation [timestamp=1634813696241.7285 revolutions=120 speed=41km/h power=346W]
[2021-10-21T10:54:56.262Z] received stats from bike [power=346W cadence=62rpm speed=41km/h]
[2021-10-21T10:54:56.426Z] wheel rotation [timestamp=1634813696425.7676 revolutions=121 speed=41km/h power=346W]
[2021-10-21T10:54:56.591Z] received stats from bike [power=31W cadence=62rpm speed=11km/h]
[2021-10-21T10:54:56.668Z] pedal stroke [timestamp=1634813696666.7583 revolutions=57 cadence=62rpm power=31W]
[2021-10-21T10:54:56.911Z] received stats from bike [power=13W cadence=62rpm speed=0km/h]
[2021-10-21T10:54:57.232Z] received stats from bike [power=13W cadence=62rpm speed=0km/h]
[2021-10-21T10:54:57.561Z] received stats from bike [power=13W cadence=62rpm speed=0km/h]
[2021-10-21T10:54:57.636Z] pedal stroke [timestamp=1634813697634.5002 revolutions=58 cadence=62rpm power=13W]
[2021-10-21T10:54:58.214Z] received stats from bike [power=13W cadence=62rpm speed=0km/h]
[2021-10-21T10:54:58.536Z] received stats from bike [power=13W cadence=0rpm speed=0km/h]
[2021-10-21T10:54:58.863Z] received stats from bike [power=13W cadence=0rpm speed=0km/h]
[2021-10-21T10:54:59.191Z] received stats from bike [power=13W cadence=0rpm speed=0km/h]
[2021-10-21T10:54:59.512Z] received stats from bike [power=0W cadence=0rpm speed=1km/h]
[2021-10-21T10:55:00.162Z] received stats from bike [power=0W cadence=0rpm speed=1km/h]
[2021-10-21T10:55:00.814Z] received stats from bike [power=0W cadence=0rpm speed=1km/h]
^C[2021-10-21T10:55:01.542Z] stopping ANT+ server

At 100 watts (which should be ~16m/h) speed comes through at 10m/h on my Garmin watch (is it thinking it’s km/h and then converting to m/h perhaps?)

At 100 watts (which should be ~16m/h) speed comes through at 10m/h on my Garmin watch (is it thinking it’s km/h and then converting to m/h perhaps?)

Yes, the speed values that you were seeing were basically in mph, but displayed as km/h. Now with the fix internally the Power->Speed function will output the speed into km/h and create the ANT+ and BLE timestamps and rotation counts accordingly. Your watch should then show the results correctly in whether you use km/h or mph.

Is there an easyer way to update? - I keep redoing it from the start with fresh sd as otherwise it won’t write over the existing ‘ant BLE-….’ When I try to pull the updated ant BLE-….

You only need to repeat these steps while in the "gymnasticon" folder:
git pull
npm run build
gymnasticon

‘Git pull’ didn’t work on its own…

Updated the full remote and branch information for git pull in the answer just above. Try that one.

What's also odd is that my Garmin watch recognizes the BLE CSC service, but then ends up only displaying cadence and no speed.

This is what I'm seeing too. I can see speed fine when paired over BLE with the Kinetic Fit app, just not on my watch (FR745). I don't have an ANT stick so was hoping to get BLE to work.

Works perfectly fine with Garmin. I can now see the IC4/IC7 bike speed, power, cadence and record it to Garmin without needed additional sensors.
Thanks so much.

Works perfectly fine with Garmin. I can now see the IC4/IC7 bike speed, power, cadence and record it to Garmin without needed additional sensors.
Thanks so much.

I just found this update a few days ago and implemented everything. I have a Keiser M3i with the older computer that required the M Series Connector and a new Garmin Fenix 6 Pro. When I first set this up, I still had my Connector on for my first few rides. I saw the same dropouts that @nealjane was reporting with the new Keiser computer. I disconnected the M Series Connector and then everything has been running fine for me with very few dropouts during my rides. I'm very new to Garmin (long time Polar user) and don't know too much about ANT+. Is there anything that can be done to have it play nicely with Bluetooth? I tried two different lower cost ANT+ USB Sticks (CHILEAF and LIVLOV) because I wasn't willing to spend $50 on the Garmin version. Is it just the ANT+ signal that is a problem in a Bluetooth environment?

Hi Cris, chileaf and livlov are basically the same ant+ dongle , it’s the brand I’ve mentioned to a couple of people on here /M3i fb group(basically they look different to the poor performance anself and clones which people have had issues with over last few years.)
. Performance wise I’ve had no issues with those vs Garmin one. Ant+ is low power so ideally you need it with line of sight  and within a couple of metres of bike or more importantly your watch.
As for The new computer (not sure which one you have??) - as Bluetooth converter is now built in(eg zwift compatible) - there’s definite interference from the new computers Bluetooth as when I tested it I saw fairly consistent dropouts in the power signal - I’ve reverted back to the older computer as ant+ is more important to me than anything else for connecting to my fenix 6.
Newer computers = is clearly not always better!!

Hi Neal, thanks for the clarification. I'm glad to hear the chileaf/livlov are good to use; I really didn't want to spend more on the Garmin one. I have the Bluetooth converter; I have since pulled it out of usage (I wasn't getting the Gymnasticon cadence on the Peloton app, so was still using it; realized I had mistakenly used Gymnasticon as a sensor on my Garmin watch, which I fixed and now can see cadence on the Peloton app from Gymnasticon). I am still getting some interference when my wife is in the gym at the same time, which I attribute to other Bluetooth signals present at the same time. I'll try getting the ANT+ stick closer to my watch and see if that helps. I had it tucked away in our workout area. Thanks for the suggestions!

Typical power over ant+ Gymnasticon connected to the newer mid 2021/2022 Keiser ‘M connect’ computer from last autumn (prior to speed implementation),

this was using power from Gymnasticon and speed from the new Keiser computer.
As Gymnasticon now provides speed - it’s whether it’s the speed connection over Bluetooth from new Keiser computer that causes interference?? (I don’t think I tested it without Keiser speed connected). Def Looks like I need to swap over to my newer computers again to see if problem persists for newer Keiser M3i computer users. (I’m off work as it’s half term so will try this week)

I've had a lot of success with the Ant+ stick closer to my watch. I do still have occasional disconnects, where the Garmin watch loses the sensor and then reconnects, so only missing a very small amount of data. Not a huge deal to me.
If I wanted to put gymnasticon in debug mode where it creates a log file, how would I do that? I've tried reading everywhere here but can't find it.

@crissag -Change this in keiser.js file which will reduce the drops to 0 over ant+ (try 2 seconds instead) - const KEISER_STATS_TIMEOUT_NEW = 1.0; // New Bike: If no stats received within 1 sec, reset power and cadence to 0

@nealjane My kesier.js file had this set to 2; It must have been updated in this branch.
I also remembered how much I hated the vi editor.

Hello, long suffering metric-less Garmin and Peloton user here who just wanted to thank you for all the work and report that this branch is working great for me. I'm using a FR745 and am using this ANT+ adapter on a Raspberry Pi 4.
Here's a nice example of the metrics reported to the watch aligning with what the bike recorded itself:

I'm using all the cabling as described in #12 but do not have the Bike TX connected to the tablet -- when I did that the metrics were correct on my watch but continually dropped out / maxed out on the bike like this:

@nealjane Thanks for the pointer to this branch. @chriselsen I followed the instructions and got my Pi pushing cadence stats to my Garmin Edge 25 from my IC4 bike. I didn't check which profile gymnasticon selected but for some reason speed was not published (heart rate came from a separate sensor paired directly to the Edge). I'll re-run with debug mode on and see if speed shows up, but otherwise this worked great. Thank you!

I’m not sure that it works over Bluetooth - ant+ speed should be working though. 👍🏻

I've had a lot of success with the Ant+ stick closer to my watch. I do still have occasional disconnects, where the Garmin watch loses the sensor and then reconnects, so only missing a very small amount of data. Not a huge deal to me.
If I wanted to put gymnasticon in debug mode where it creates a log file, how would I do that? I've tried reading everywhere here but can't find it.

@crissag -Change this in keiser.js file which will reduce the drops to 0 over ant+ (try 2 seconds instead) - const KEISER_STATS_TIMEOUT_NEW = 1.0; // New Bike: If no stats received within 1 sec, reset power and cadence to 0

@nealjane Did setting this to 3s solve your issues with the new Keiser computer as well? I had thought about setting this higher, but the dropouts were less of an issue for me when I moved the pi closer to my watch.

@nealjane Thanks for the pointer to this branch. @chriselsen I followed the instructions and got my Pi pushing cadence stats to my Garmin Edge 25 from my IC4 bike. I didn't check which profile gymnasticon selected but for some reason speed was not published (heart rate came from a separate sensor paired directly to the Edge). I'll re-run with debug mode on and see if speed shows up, but otherwise this worked great. Thank you!

Turns out I forgot to select "Indoor Mode" on the Edge once the sensors were connected. Speed shows up now along with the other stats. Thanks all!

With most recent RPi image I am getting command not found for overctl. Any idea why?
I skipped that part and tested the rest with Garmin + IC4. Works like charm! GJ

Answering my own question with another question. Is it possible that the changes from #58 are not present in the latest img as linked from the README.md ? At least that's where I got my image and it does not have overctl.

With most recent RPi image I am getting command not found for overctl. Any idea why?
I skipped that part and tested the rest with Garmin + IC4. Works like charm! GJ

That command didn’t work for me either, but current version is write protected etc - I just use raspiconfig to write/lock the image when needed/which works.
ptx2 hasn’t been around in almost a year now - so don’t think there will be any furthet updates to the current Gymnasticon without him - Chris Elsens speed additions for ant+ are here though.

I just use raspiconfig to write/lock the image when needed/which works.

I see, thanks for clarifying. Do you have any info on how to do that? Are you using the raspiconfig command and do it through the graphical interface? I do not seem to find anything related in that tree of available options...

I just use raspiconfig to write/lock the image when needed/which works.

Okay, thanks for clarifying!  It seems disabled in my case by default right now... Not sure if I restart the RPi now if all my changes will be gone! XD

Just wanted to say THANK YOU and also want to update @chriselsen and all others contributers that I've tried this on Flywheel bike and it is reporting speed to my Garmin 520 over ANT+ (can't check BLE as I don't have a head unit that can read BLE signal) so you can cross one of the issues in your list.
Not sure how accurate the speed value is, but seems high for the power I am generating.  Below are some data points.
60 watts = 21.2 km/h
69 watts = 22.7 km/h
73 watts = 23.3 km/h
91 watts = 25 km/h
119 watts = 29.7 km/h
129 watts = 30.9 km/h
I am using "power-scale":0.9 parameter in the config file to reduce the power reported to my head unit as I found out my spin bike seems to report about 10% more watts than my friend's high end TACX smart trainer when I did a quick test ride side by side.  Even if I don't use the "power-scale" parameter the speed seems high.  I know this isn't your doing as you are just reporting whatever the bike is spitting out, but one suggestion would be to add "speed-scale" and "speed-offset" parameter for us to play with to fine tune the values to fi these type of issues.
Thank you once again!

The Flywheel bike should be providing the speed via Bluetooth to Gymnasticon. Therefore Gymnasticon only passes through to ANT+ whatever it receives.
At least from experience with the IC4 bike, the speed shown by these bikes doesn't factor in resistance. It's purely some formula based on generated power. Therefore the speed displayed is what you would be riding on a flat surface - where resistance is close to 0.
The speed that you see within e.g. Zwift factors in the slope of the hill that you are climbing or going down. Therefore that speed will not match what your trainer shows you, unless you rid on a long flat stretch in Zwift.

Thanks for the response.  I noticed gymnasticon sends the data as Spd/Cad sensor rather than just Speed sensor.  If I search under Speed Sensor for Garmin 520, it can't find it, but it will find it under Spd/Cad sensor.  Not sure if this has any overlap with Power sensor as this also provides Cadence.
Also I did notice few power drops to zero and speed going to ~4 mph intermittently, but I am not sure what is causing this.  I don't recall having this issue before installing this branch (at least for power as I didn't have speed data before).  The ANT+ is right below the Garmin head unit so I don't think it is a distance issue from the ANT+ dongle.  I'll keep monitoring as I ride and report back any issues with Flywheel bike.  Any idea what maybe causing this would be appreciate it and if you need anything from me let me know.
Below graph shows overlay of speed vs. power (speed is the area graph and power is the dark line graph).  As you can see, power drops to zero 3x times, but speed drops to ~4 mph at many instances.


Server Crash

Currently getting this crash report when entering luna for the first time, seems to be a chunk gen error with craters:
https://pastebin.com/MEV3uTKe

And it's only the first time?
Also does this issue occur without sponge?

Hard for us to test without sponge on the network unfortunately, we are so integrated with bungeecord and plugins now.
I could run this past the sponge team if Invasion modpack updates to your recent fix and it's still occurring. That being said, from what I understand I don't think sponge really change anything from Forge, it's just a mod, so the world gen/creation routines should be based off forge itself? Of course I could also be completely wrong :)

Given lines 8 and 9 it's definately doing something.  My theory is that it's trying to call the crater generator on a chunk before anything is in it.  Just a potshot of a guess though.  If there's a lot of plugins, it may actually be best to test it with sponge but without the plugins (on a copy) then if the issue still occurs, without sponge too.

I'll try get some time tomorrow to see if i can copy the server over to a test slot and check without sponge in a forge only environment, I will report back when I've done that.
I definitely would like to see where the problem is as your mod is pretty much the endgame of the Invasion modpack.
Thanks for the quick replies btw :)

If you could verify whether or not http://<IP_ADDRESS>:8080/job/Advanced Rocketry/job/AdvancedRocketry/job/RoundPlanets1_10/4/ fixes the issue, I'd appriciate it

I will do, I was hoping to get this tested at the weekend but alas family and work, but I will set aside some time to check this on the test server in the next few days.

Is this still a valid issue?


No module issue

One issue I found was that there seemed to be no module named Decorator.
I downloaded all the content from OpenSNA. I installed NetworkX, and it sensed properly. But then it said that there was no module named decorator. So I downloaded decorator, and it sensed the file, but still said "No module named decorator". I looked for a pip install, but that was the one I already installed and didn't work, and there was no other link.
I think that GCI should put where to get these modules from.

It was also missing important files like the configuration files.

And in the main.py, there is also no module named pandas

GCI rules


Remove gardener for subscriptioncleanup job

Description
followup to https://github.com/kyma-project/control-plane/pull/1527, where KEB is stripping its dependency on gardener. Gardener is a rich source of CVEs There is only a very small subset of gardener API that KEB needs and it doesn't depend on the implementation at all.
Related issue(s)

https://github.com/kyma-project/control-plane/issues/1471

/retest

/retest

/etest

/retest

/retest


jsonrpc: deadlock on the server

I just fall inside a jsonrpc deadlock server, I think the jsonrpc server needs some more love

to prove that this works we should move lnprotest over the UNIX socket too

This issue should be reproduced, so we are planning to fix our lnprototest integration testing.
@tareknaser will work on writing a lampo python library, and then I will integrate it inside lnprototest

Moving this to the next release in June

Moving this to the next release because we have a new version that it is landing to next https://github.com/vincenzopalazzo/lampo.rs/pull/246


Updated README

Includes list of a few available languages, donation link and a few minor text corrections

:tada: This PR is included in version 2.116.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Reflection / Caching / Performance

Thoughts
If you go down the route of using reflection, instead of running a class lookup and reflection loop for every checker such as class name checker, method checker, properties checker, annotation checker etc, there may be a more performant way to achieve this goal.
We could introduce the concept of a 'scanner'.

Classes are loaded and 'reflected into' just once
We have a cache folder such as .peck
Each of the things we want to spell check can be then stored in a cache file

Store a filename, line number, type (class / method / property / annotation) and word

We would now have a set of cached scanned words collected after one scanner run, which we can then trigger one or more spell checkers on. We would be simply iteration through json/csv cached words, using their name, line and type for the notifications.
Benefits

Reduce repeated code by looping through classes and reflection for each spell checker type
Single set of 'class scanning' code for future proofing
Improve performance
Spell checking becomes a stand alone process using cached words list from scanner output, meaning it is not bound to 'where' words come from

Interesting proposal! Changes the architecture, but raises good points!
I'll just quickly tag the PRs regarding the Reflection vs. Tokens vs. Regex discussion: #17 #18 #19

It would definitely be necessary.
I tested Peck in a small Laravel project because I think the idea is great.
First, I had to ignore around 60 words and 12 folders to get Peck to run, and it still took 1:54 minutes.
Unfortunately, that’s too long.


Release Google.Cloud.Compute.V1 version 2.14.0

Changes in this release:
New features

Update Compute Engine API to revision 20240220 (issue 886) (commit eca3b4f)

Created release for Google.Cloud.Compute.V1-2.14.0


feat(app): Add private routes

One of the point of road map is Private routes. This PR add guards that implement routes for auth and not authorized users. It's pretty straightforward right now, could be a good start point or ready made feature for now.
@noveogroup-amorgunov could you take a time and review this, please?
Thank you.

@noveogroup-amorgunov should looks well for now 👍


Advertisement data fix

Android and iOS now properly send back service UUID's, service data, tx power level, connectable flag, and manufacturer specific data.
Example app was updated to show these values for each scan result tile.

This also fixes the crash that happens if more than one complete local name (0xFF) is specified.

Fixes #85 #54


nb additions

sweet lgtm.
I'd probably use np.random.RandomState(seed=1234) for reproducibility.

This is not really the recommended way, right? Would you do it like this? That can be tricky, I think.

You mean in contrast to sth like this?
>>> import numpy as np
>>> rndst = np.random.RandomState(1234)

Not sure, but this only works for e.g., randint and some others, right?
>>> rndst.randint(3)
2
>>> rndst.random((3, 5))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'mtrand.RandomState' object has no attribute 'random'

Hm, isn't np.random.RandomState(seed=1234) and np.random.seed(1234) essentially the same?
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html

well random.seed changes a global (private?) random state, while random.RandomState is an explicit object that you can pass around. Both depend on execution order, but I feel with the object it is more explicit.
It works with all distributions, but not all aliases. random is an alias for random_state. random is also just a special case of uniform, right? I tend to use uniform because that's more explicit to me.

Both depend on execution order, but I feel with the object it is more explicit.

I agree, will swap it out later when I get home!

thanks :)

Just updated the RandomState! General question (related to the third notebook), the dataset that is available via load_digits, where's it coming from? (Is it a lower-resolution subset of MNIST?) -- I think someone at the tutorials will likely ask ;)

It's unrelated to MNIST, I think, but also collected by NIST. The DESCR attribute should say:
Notes
-----
Data Set Characteristics:
    :Number of Instances: 5620
    :Number of Attributes: 64
    :Attribute Information: 8x8 image of integer pixels in the range 0..16.
    :Missing Attribute Values: None
    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)
    :Date: July; 1998

This is a copy of the test set of the UCI ML hand-written digits datasets
http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits

The data set contains images of hand-written digits: 10 classes where
each class refers to a digit.

Preprocessing programs made available by NIST were used to extract
normalized bitmaps of handwritten digits from a preprinted form. From a
total of 43 people, 30 contributed to the training set and different 13
to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of
4x4 and the number of on pixels are counted in each block. This generates
an input matrix of 8x8 where each element is an integer in the range
0..16. This reduces dimensionality and gives invariance to small
distortions.

For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.
T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.
L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,
1994.

Thanks, I dunno why I didn't just check the DESCR :/. (On a side note: it would maybe be useful to add the desc .rst files somehow to the function docstrings so that they also appear in the API doc online?)
Btw I can merge the changing once in a while so that you don't lose the overview here ;). Hehe, going through notebook 01.4, I must say that using the random_state=1999 (to get the 0.33 proportion in the iris test/train split) was a tad sneaky :); I changed it using the new stratify=y option.

The DESCR should be in the user guide, but it looks like it is not. We should probably fix that.
And yeah, feel free to merge. I'm a bit caught up still in my book stuff.

Okay, maybe we should open an issue then. No worries, take you time; I also want to get through all the notebook this weekend hopefully so that I can tackle the other things we discusses (presentation figures, the linear regression implementation, etc.) I will merge the changes then for now!


Add definitions for space between elements

General objective:
Following the structure proposed for spacing: Selectables, Containers and Pages, we need to define spacing for the Containers and which kind of proprieties this will cover.
Specific objectives:

To build an harmonic visual rhythm
To align everything following a proportion
To define how density will affect selectable items

Outcome:
A Figma file with all the Containers items tested with the spacing structure proposed. The proposal cover different needs collected in the meetings with the local design systems and teams.

[x] spacing between elements inside a Selectable
[ ] spacing between Selectables
[x] spacing between Containers

owner: @marinalinn

Spacing between elements inside a Selectable:
In our previous proposal we had 8px as spacing between elements inside a Selectable, 16px between Selectables and 24 between Containers. Now after a review following different feedback collected from the teams, the spacing between Selectables is a value that depends on the font-size and the icon size.

Icon size: font-size x 1.5
Gap: font-size x 0.618
Icon container width: font size
Icon container height: cap height rounded up to the nearest four.

Spacing between elements inside a Selectable: it was implemented today on Figma.
Spacing between selectables: Some proposals were made but we dont have the final definition yet.
Spacing between containers: 24px


Added conversion for ? to be compatible with AsyncDropError

The implementation is a bit loose. But, works so far on my end and compiles with no issues.

Thanks for this @CR7273868 ! This is a great improvement for usability of the crate.


Changed variable name (addr) in struct spi_transaction_t

The variable name changed from address to addr in esp-idf, see this
commit:
https://github.com/espressif/esp-idf/commit/ed1d084aeaef1c7216004354bd5b1a08f4a584cf#diff-c3da310493525a7302b298b32f3ac781

Thank you sir.  Ive merged the change.


Support #[builder(getter(...))] attribute

Resolves #221
Implements an experimental (and limited) version of a getter attribute to return references to already set values.
Currently supported (for structs, methods, and functions):

#[builder(getter)]
#[builder(getter(name = "new_getter_name"))]
#[builder(getter(vis = "pub(crate)"))]
#[builder(getter(doc {}))]
...or any combination of the above 3

In its current form it's not very "smart", so getters for a String return &String and not &str, for example, nor is copy / clone inferred and implemented for types which support them.
See #221 for some more discussion on the future features.

Thanks for the feedback. I'm about done aside from that one comment above, just going to sleep now and finish up the tests in the morning.

LGTM, although I did just a quick review this time. Once new comments are fixed I'll merge this. I'll re-review the changes tomorrow, improve any other minor stuff, maybe update some of the guides, and do the minor release.

Cool, I do also have a need for the copy and clone attributes so some time this weekend or next week I can probably take a stab at those if you don't get to it already

Pipeline should be good now too, I added a tiny bit to the init script and contributing docs

I'm pushing my corrections and merging

Openned a followup PR https://github.com/elastio/bon/pull/226

This  feature has been released in bon 3.2.0

@lazkindness I opened an (unfinished yet) draft PR for clone, copy, deref params support: https://github.com/elastio/bon/pull/229.

Heads up, did a 3.3.0 release with copy, clone, deref support: https://github.com/elastio/bon/releases/tag/v3.3.0.
cc @lazkindness


Kconfig:fix typo

Summary
libs/libc/string/Kconfig:44: syntax error
libs/libc/string/Kconfig:43: unknown option "--help--"
libs/libc/string/Kconfig:44: unknown option "Use"
make: *** [olddefconfig] Error 1
Impact
nothing
Testing
macos make config

Fixed here https://github.com/apache/nuttx/pull/14388

Wonder why our CI continues to run the job after the PR has been closed? So wasteful sigh.

https://github.com/apache/nuttx/actions/runs/11396295663


add the Chinese translation

Hi Phusion.
I add  the Chinese translation for readme.

Thanks zhaopeng, I've merged your pull request. Sorry for the delay.
But the readme is now a bit outdated. I've since made changes to the readme. Could you update your translation too?


Plugin error on Email creation without template

Hi Florian,
thank you for your work, like the Xrm Templating Language, also this tool is amazing.
I found an issue on one of your default plugins registered within the solution: Xrm.Oss.XTL.Templating.XTLProcessor: Create of email (Apply XTL placeholders).
If i create an email without the template lookup valorized i get this error:

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=<IP_ADDRESS>, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Unexpected exception from plug-in (Execute): Xrm.Oss.XTL.Templating.XTLProcessor: System.ArgumentNullException: Value cannot be null.
Parameter name: inputDetail:
OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
ActivityId>bcb931bb-5830-4ff4-a9bf-cecd7d9d7dc8
ErrorCode>-2147220956
ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
Message>Unexpected exception from plug-in (Execute): Xrm.Oss.XTL.Templating.XTLProcessor: System.ArgumentNullException: Value cannot be null.
Parameter name: input
Timestamp>2018-11-30T14:31:40.4130753Z
ExceptionRetriable>false
ExceptionSource i:nil="true" />
InnerFault i:nil="true" />
OriginalException i:nil="true" />
TraceText>
[Xrm.Oss.XTL.Templating: Xrm.Oss.XTL.Templating.XTLProcessor]
[fb642c1d-a9da-e811-80ee-0050568e4745: Xrm.Oss.XTL.Templating.XTLProcessor: Create of email (Apply XTL placeholders)]
Initiating interpreter
Processing handler IsEqual
Processing handler Value
Successfully processed handler Value
Successfully processed handler IsEqual

I solved the issue adding another condition for the plugin execution criteria:

And(IsEqual ( Value ( "directioncode" ), true ), Not(IsNull(Value("oss_htmltemplate"))))

I hope this is helpful for you.
Keep up the good work!
Best regards,
Andrea

Hi Andrea,
thanks for getting in touch, I'm glad that you like this project.
I'll take a look at this issue, I think it might be related to an XTL issue which i lately filed.
Kind Regards,
Florian


nixos/generic-extlinux-compatible: don't copy to same fs

Description of changes
I'm running nixos on a small arm sbc with u-boot, using the extlinux-conf builder. My root fs is ext4, filling the entire emmc. In this configuration, I noticed that my kernel and initrd would get copied to /boot, even though they're on the same fs and could be read directly by u-boot. This isn't a huge deal, but is somewhat undesirable, especially when using a small soldered-on emmc, as it creates some extra wear.
I've been running with this change for a while and thought I should contribute it upstream. Several other bootloader configurators (e.g. grub) already offer this option (controlled by a copyKernels setting). If it's not appropriate to detect automatically and I should add an equivalent setting, let me know.
Things done

Built on platform(s)

[ ] x86_64-linux
[x] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
22.11 Release Notes (or backporting 22.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[ ] Fits CONTRIBUTING.md.

Whoops, was cleaning up branches and deleted this one by accident. Didn't mean to close.
Adding a copyKernels option (and also storePath for completeness) seems fine. I've done that.

@klemensn did you have a chance to look at this again?

@klemensn did you have a chance to look at this again?

I will (away from real computers at the moment).

Any chance this could be reviewed and merged in time for 22.11?


How do I register a non static custom type to leverage dependency injection

I have a complex logic to be checked hence I am trying to introduce a Utils which is a non static class so that I can inject few dependencies, However I am not able to do it.
I also tried this option
https://github.com/microsoft/RulesEngine/issues/378
where you pass a non static utils class as a rule parameter but I get an exception
Exception while parsing expression Utils.CheckContains("1","1") - Unknown identifier 'Utils'
As document do not provide indepth detail on what capabilities are available, if anyone of you were able to calls a custom type which non static it would be of great help

@vprabhu81 can you share the code of initialization and calling ExecuteRule method when you are getting this error

Hi @abbasc52, It looks like an issue from my end. I was able to figure this out. Thank you anyways


Passing a device certificate to provisioning client on linux

Hi there!
I am trying to provision devices with the python provisioning sdk on a linux machine. However I am not able to pass the device certificate to the provisioning client. In C# the provisioning client provides a parameter to pass the certificate via a security provider. But I am struggling to build an equivalent example in python.
How can I pass the device certificate to the provisioning device client in python?
Best
Mathias

OS and version used: Ubuntu 15.04

Python runtime used: 3.6

Hi,
we are struggeling with a similar problem.
Any advice would be apprreciated.
Kind Regards
M. Peter

@mathias-nickl @1-Peter unfortunately i have no satisfying answer for now:
Because the current SDK is built on the C SDK, the way to do this is to implement a custom HSM module. See:
https://github.com/Azure/azure-iot-sdk-c/blob/master/provisioning_client/devdoc/using_custom_hsm.md
This entails developing a custom HSM module in C, then rebuilding the C+Python SDK while linking to the HSM module.
we're absolutely conscious of the fact that this is not a good python experience which is why we're working on a new implementation of the SDK that doesn't rely on the C SDK (here) rather than investing in trying to patch this version of the SDK, given this design obviously doesn't work for 99% of users.

I believe we've responded to this question in #272 : the new v2 client deals with certificate a lot better than v1.

@mathias-nickl, @1-Peter, thank you for your contribution to our open-sourced project! Please help us improve by filling out this 2-minute customer satisfaction survey


Turn off AQUA AIRS channel 305 after 20220111_12z

Channel is becoming noisy starting 2022/01/11 18z
(will be non-zero diff after 2022/01/11 12z)

Thanks @jing-guo for the reminder about changing the number of channels.  I corrected this in the files I passed to Rob for the operational systems but forgot to fix in in the file I checked in.
I have fixed this now.


Travis CI

Travis CI won't do Xcode 7, Ship.io has Xcode 7 support for example https://ship.io/xcode-7-beta-is-here/, their support is good, but a bit more limited to what Travis CI offer (for example require a workspace, can't install gem like xcpretty but xctool is installed) Work around is to use our own makefile etc...)

:+1:

Circle supports Xcode 7 now, as well. I've been really happy with it.


GitHub Workflows security hardening

This PR adds explicit permissions section to workflows. This is a security best practice because by default workflows run with extended set of permissions (except from on: pull_request from external forks). By specifying any permission explicitly all others are set to none. By using the principle of least privilege the damage a compromised workflow can do (because of an injection or compromised third party tool or action) is restricted.
It is recommended to have most strict permissions on the top level and grant write permissions on job level case by case.

Codecov Report

Merging #4587 (084bdbb) into main (bb47419) will increase coverage by 0.04%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##               main    #4587      +/-   ##
============================================
+ Coverage     70.55%   70.59%   +0.04%
- Complexity    57432    57473      +41
============================================
  Files          4635     4635
  Lines        276645   276645
  Branches      40489    40489
============================================
+ Hits         195180   195304     +124
+ Misses        65094    64984     -110
+ Partials      16371    16357      -14

Impacted Files
Coverage Δ

.../opensearch/client/indices/CloseIndexResponse.java
48.75% <0.00%> (-42.50%)
:arrow_down:

...pensearch/indices/breaker/CircuitBreakerStats.java
27.77% <0.00%> (-41.67%)
:arrow_down:

.../admin/cluster/reroute/ClusterRerouteResponse.java
60.00% <0.00%> (-40.00%)
:arrow_down:

...h/action/ingest/SimulateDocumentVerboseResult.java
60.71% <0.00%> (-39.29%)
:arrow_down:

...luster/routing/allocation/RoutingExplanations.java
62.06% <0.00%> (-37.94%)
:arrow_down:

...cluster/coordination/PublishClusterStateStats.java
33.33% <0.00%> (-37.51%)
:arrow_down:

.../opensearch/client/indices/GetMappingsRequest.java
47.05% <0.00%> (-35.30%)
:arrow_down:

...ensearch/client/indices/DetailAnalyzeResponse.java
20.54% <0.00%> (-34.25%)
:arrow_down:

...search/search/aggregations/pipeline/EwmaModel.java
24.44% <0.00%> (-33.34%)
:arrow_down:

...min/cluster/snapshots/get/GetSnapshotsRequest.java
52.63% <0.00%> (-31.58%)
:arrow_down:

... and 469 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

Please amend commits to fix DCO with -s

Manual backport https://github.com/opensearch-project/OpenSearch/pull/6097


[Enhancement] Support struct cast function

Fixes #issue

check and update struct cast function
support index expression for struct
add struct test

MySQL tpcds_1g> select row(1, 2, 3, 4)[1]
+--------------------+
| row(1, 2, 3, 4)[1] |
+--------------------+
|         1          |
+--------------------+

MySQL tpcds_1g> select cast(row(1, 2) as STRUCT<a string, b string>);
+-----------------------------------------------------------------+
| CAST((row(1, 2)) AS struct<a varchar(65533), b varchar(65533)>) |
+-----------------------------------------------------------------+
| {"a":"1","b":"2"}                                               |
+-----------------------------------------------------------------+
1 row in set

What type of PR is this:

[ ] BugFix
[ ] Feature
[x] Enhancement
[ ] Refactor
[ ] UT
[ ] Doc
[ ] Tool

Checklist:

[x] I have added test cases for my bug fix or my new feature
[ ] This pr will affect users' behaviors
[ ] This pr needs user documentation (for new or modified features or behaviors)

[ ] I have added documentation for my new feature or new function

Bugfix cherry-pick branch check:

[x] I have checked the version labels which the pr will be auto-backported to the target branch

[ ] 3.0
[ ] 2.5
[ ] 2.4
[ ] 2.3

[FE PR Coverage Check]
:heart_eyes: pass : 63 / 69 (91.30%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
com/starrocks/sql/optimizer/rewrite/scalar/NormalizePredicateRule.java
15
18
83.33%
[209, 210, 218]

:large_blue_circle:
com/starrocks/sql/analyzer/QueryAnalyzer.java
20
22
90.91%
[637, 645]

:large_blue_circle:
com/starrocks/sql/analyzer/ExpressionAnalyzer.java
17
18
94.44%
[465]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/scalar/SubfieldOperator.java
6
6
100.00%
[]

:large_blue_circle:
com/starrocks/sql/common/TypeManager.java
3
3
100.00%
[]

:large_blue_circle:
com/starrocks/catalog/StructType.java
2
2
100.00%
[]

[FE PR Coverage Check]
:heart_eyes: pass : 63 / 69 (91.30%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
com/starrocks/sql/optimizer/rewrite/scalar/NormalizePredicateRule.java
15
18
83.33%
[209, 210, 218]

:large_blue_circle:
com/starrocks/sql/analyzer/QueryAnalyzer.java
20
22
90.91%
[637, 645]

:large_blue_circle:
com/starrocks/sql/analyzer/ExpressionAnalyzer.java
17
18
94.44%
[465]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/scalar/SubfieldOperator.java
6
6
100.00%
[]

:large_blue_circle:
com/starrocks/sql/common/TypeManager.java
3
3
100.00%
[]

:large_blue_circle:
com/starrocks/catalog/StructType.java
2
2
100.00%
[]


Allow for opening 10 (or x) unread issues/PR's/etc at a time

Description
Working at HF I deal with hundreds of unread notifications to get through every day. What'd be great is if we can (in a configuration) open up only the first n notifications, to make it easier to digest and get through without needing to navigate a few hundred tabs suddenly opening
Example URLs
https://github-production-user-asset-6210df.s3.amazonaws.com/140871606/257085496-17e5c6fa-6bad-443d-96d2-d97e73cd1a5e.png
Same spot as here (maybe even same button)

a few hundred tabs suddenly opening

That button only opens 25 tabs at most, so that number is much inflated. I'm not convinced that 25 new tabs is a substantial amount (it's a lot, but it's already limited)

Fair! Yes that was overblown :)
However if we could do less than that too it'd be nice. (It's alright if you deem that a non-issue ofc)

in a configuration

The issue is that we don't offer options and this is a little niche to deserve its own button. An alternative would be to extend our confirmation dialog:
https://github.com/refined-github/refined-github/blob/54267e2478b1731dd8209402165cd8bcce613a82/source/helpers/open-tabs.ts#L6
For example it could be prompt('enter how many tabs you want to open'). However this would be awkward, would introduce further complexity (i.e. bring this number back to the caller so that only X notifications are marked as unread), and I'd be unsure which ones to open (first X or last X?)
That button is supposed to be a quick way to just open all in 1-2 clicks. If you want to customize how many and which ones to open, you can do so also in 3 clicks:

By the way I'm pressing shift in that gif.
Anyway thanks for the issue, this will actually be something I need to be aware of if/when this other feature is added:

https://github.com/refined-github/refined-github/issues/7442


[BUG] Error 150 on some videos

This is the video: https://www.youtube.com/watch?v=GUqcY8WNTZs
Error: The owner of the requested video may not allow it to be played.
Video embedding is turned on for the video and other videos.

Error 150 is not well documented. Couldn't figure out why its not playing the video.
Also, the thumbnail for the video is not available https://i3.ytimg.com/vi_webp/GUqcY8WNTZs/sddefault.webp

I think it's because it has copyrighted music in it.

Oh yes @EliasDeuss , tested 5 videos from the same channel and videos with no copyrighted music played without 150 , whereas videos with copyrighted music returned with 150.

@sarbagyastha There should be option to open the video on Youtube if not available in the player.

@EliasDeuss You can implement it on your own by listening to the errors.

This error doesn't for 4.1.0 or lower version

I can confirm. I tried to upgrade from 4.1.0 to latest version and just now I get this error. Never had it using version 4.1.0. What changed?

@sarbagyastha How are we supposed to catch playback errors?
I am trying to embed YouTube videos but some of them are restricted to only play on a specific domain. I want to try to catch this error before even showing the play button and instead show that it can't be played. Is there a way to do this?
The best would be if we could play with the referrer headers. This StackOverflow post makes it seem like it's possible. Is there any way to do this with this plugin?

@sarbagyastha I think what @TheBestMoshe suggested might fix most of the Error 150 issues

@TheBestMoshe Thank you for pointing out. I will definitely look into it.

Here's what I found so far:
Error Overview
youtube_player_flutter uses Youtube IFrame API for embedding Youtube player using flutter_webview, and the IFRAME API is producing the error. Here's the link to view all the errors that the player may receive: https://developers.google.com/youtube/iframe_api_reference#Events
The ones associated with Error 150 are:
101 – The owner of the requested video does not allow it to be played in embedded players.
150 – This error is the same as 101. It's just a 101 error in disguise!
Which means the video owners have disabled the videos to be played embedded.
Video Metadata
I tried checking the embeddable, restricted and other properties of videos which were not working using the YouTube Data API to get the key:
https://www.googleapis.com/youtube/v3/videos?id=[VIDEO_ID]&key=[API_KEY]&part=snippet,contentDetails,status
I couldn't find any difference in the metadata of the videos which were blocked and unblocked.
Error Reporting
In the RawYoutubePlayer widget internally used by the plugin, on error occurrence, error code (e.g. 150) is set as the value for controller.value here:
https://github.com/sarbagyastha/youtube_player_flutter/blob/6f21d8b25019394257c71b7399c9199ee5198a17/lib/src/player/raw_youtube_player.dart#L175-L181
I think controller.value could be monitored for error reporting and handling, though better handling using onError method exposed, and some info in the documentation would be very helpful too.

I have the same issue, even using my own videos

I tried using 4.1.0 but was not able to get the example to work in that repo. One difference is the origin field in playerVars is no longer set. Unfortunately, after setting this the videos which had a 150 error before just hang and no events are fired from the api.

Additionally I was able to embed the video using https://github.com/hoanglm4/flutter_youtube_view

same error  with all kind video
not special one  include example video

Any update on this issue?

Fixed with Version 6.1.0

The issue is solved. Thank you!

hi,
i still have this error on 6.1.0+4.

The issue still persist-> This video

I still have this error on android emulator but work on real device.
Could you please tell me why?

hi, from s.korea
i still have this error, too.
the video i wanna play is copyrighted video(MV).
i can play on emulator, but cannot play on real device (Pixel 3) via google play released. No error message, loading circle runs infinitely.
anyone like me?

it still persist.
even if the video contain sound cloud's music, not copyright by youtube.

Still persisting to this day.

With me, the problem was that I lowered all case on the video id, and it's case sensitive. Instead of YE7VzlLtp-4, I was sending ye7vzlltp-4.


Add CI 1.41 RN.

Thanks for contributing to the Harness Developer Hub! Our code owners will review your submission.
Description

Please describe your changes: Adds CI 1.41 RN
Preview links/images (Internal contributors only): __________________

PR lifecycle
PRs must meet these requirements to be merged:

[ ] Successful preview build.
[ ] Code owner review.
[ ] No merge conflicts.
[ ] Release notes/new features docs: Feature/version released to at least one prod environment.

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba2c7679ffcbbad5ae6fae--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba47fb6652180a5fb2eed1--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba59132f3b1a12f0e3fffb--harness-developer.netlify.app

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.1 out of 2 committers have signed the CLA.:white_check_mark: dewan-ahmed:x: nofarbYou have signed the CLA already but the status is still pending? Let us recheck it.

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba888e5624614b83af0428--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba8afa4adcc44ddb7be049--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba93bba9b1db5f03f8c86b--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66ba94ae367f1356a62078d7--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66baa46c66193e6717f3ef79--harness-developer.netlify.app

Please check the Execution Link of the Pipeline for the Website Draft URL. This is located in the Preview Step behind the Harness VPN and also is available in #hdh_alerts. E.g Website Draft URL: https://unique-id--harness-developer.netlify.app. Current Draft URL is: https://66bb642b7cf6ac3d8176e903--harness-developer.netlify.app


Support for Microsub servers

The emerging Microsub standard is gaining some traction, with Aperture, a publicly available Microsub service available to use for free, and several other "reader" apps supporting Microsub.
Microsub support would enable NetNewsWire to connect to Microsub servers/services, which would handle fetching/syncing of feeds and subscriptions.
I definitely don't think this is a 5.0 feature, but I wanted to put it on your radar as I think having an amazing open source macOS reader app supporting an amazing open standard for feeds and subscriptions would be lovely.

I think this would be a great addition to NetNewsWire! I have added Microsub support to my iOS project Indigenous, so if you would be open to it, you can use any of the Microsub code I have in Indigenous or I have also been meaning to spin it out into it's own library, so if you would be interested in using the Library I can provide that.

It appears to me that Microsub doesn’t support syncing read/unread status and starred status. Am I wrong about that? It’s one of the must-haves in a syncing system.


chore(ImageWithCaption): make caption required

Related Ticket(s)
[Image with caption] Make caption required #6871
Description
Make the caption within the ImageWithCaption component required.
Changelog
Changed

add .isRequired to the heading prop in the React version
add default value to the heading attribute in Web Components version to ensure there is always a caption.

@annawen1 can you update the snapshot file?


fix broken provisioning

The following changes are implemented
TODO: Summary
Changes in the user interface:
TODO: Add screenshots, recordings or remove this section
Checklist when submitting a final (!draft) PR

[ ] Commits are tidied up, squashed if needed and follow guidelines in CONTRIBUTING.md
[ ] Code builds
[ ] All existing tests pass
[ ] All new critical code is covered by tests
[ ] PR is linked to the relevant issue(s)
[ ] Rebased with the target branch

Could you please explain when exactly this failed and why this fixes it? I'd imagine we'd find it long ago if it was a boot level issue 😅

@skamensky Am cleaning up PR's. Is this still relevant?

I'm not sure. I'm using a frozen version of corteza at this point.
Feel free to close from my POV.
There was an actual bug and this is an actual fix. Maybe note that somewhere in case you get a provisioning error in the future to save you the bug hunt.

Okay thanks, will leave it open for now.


[Feature] About an idea to add a UDF management module for StreamPark

Search before asking

[X] I had searched in the feature and found no similar feature requirement.

Description
I have been in contact with StreamPark for a while now and have had a pretty good experience in terms of ease of use and stability. Currently, StreamPark itself supports UDF functions, but there doesn't seem to be a unified UDF management menu, so it is recommended to add a new UDF management menu for UDF management. The main purpose is to.

implement a unified management of new UDFs created by users (providing the main API for manipulating UDF objects).

Currently, SP uses UDF to upload UDF jar when creating jobs, but in the process of actual use, users may encounter some problems, such as: it is not clear what UDFs were created before, what the identififier is, etc. Therefore, the UDF management module can be used to solve these problems.

Usage Scenario
Note:

This feature is currently only implemented based on SQL jobs in Yarn Application mode;
the JAR is saved on top of HDFS.

Related issues
No response
Are you willing to submit a PR?

[X] Yes I am willing to submit a PR!

Code of Conduct

[X] I agree to follow this project's Code of Conduct

The current plan is mainly based on the yarn application model, so the following is mainly idea of implement.

When creating a job, select the required UDF (e.g., a drop-down box showing the UDF available to the current user, associated with udfId);

When starting a job, it will query the paths of these udf stores according to the selected udfId (there can be more than one), and at the same time stitch these storage paths into strings, and finally pass them into yarn.provided.lib.dirs when submitting the job to achieve dynamic loading.

Actually,  your plan is pretty much like zepplin's way of managing udf. I would like to contribute. Firstly, overall design for udf management.Secondly, stages to implement.

hi datayangl,

So nice,warmly welcome.
After the next version , we may make a discussion in weekly-meeting including the proposal、solutions etc.


chore: Update from _rust template

Pull Request Test Coverage Report for Build<PHONE_NUMBER>2
Details

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 2.655%

Totals

Change from base Build<PHONE_NUMBER>8:
0.0%

Covered Lines:
6

Relevant Lines:
226

💛  - Coveralls


Map is not responsive

import React, { Component } from 'react';
import { Map } from 'react-arcgis';
class App extends Component {
  render() {
    return (

      <Map />

 )   } } default export App;`
The Map does not render if I remove the div around <Map /> component. It does not even render if I make the height and width relative:

<Map />

So, basically I am unable to make the map responsive. I want it to take the height and width of its parent div.

Taking up the full width and height of the parent container is exactly what Map does.
Percentage dimensions are relative, and do nothing unless there is some parent element with a defined size. Use width: 100vw and height: 100vh if you want to take up the full screen, or ensure html and body also have width & height of 100%.
This is not a problem with react-arcgis.


Possibility of Increasing update domains in Availability Set

This document section https://docs.microsoft.com/en-us/azure/virtual-machines/availability-set-overview#how-do-availability-sets-work says "For a given availability set, five non-user-configurable update domains are assigned by default (Resource Manager deployments can then be increased to provide up to 20 update domains". It does not look like it is possible to increase update domains once Availability set is created. As per another Github issue here https://github.com/MicrosoftDocs/azure-docs/issues/13194, it is not possible to increase update domains for VMSS, but it does not clarify if it is applicable for VMs. However, update domains cannot be increased for both VMs and VMSS. Please validate the latest information on this and update this document accordingly with steps if it is possible to increase update domains.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 7342d51a-4565-df38-ec28-03c140464e73
Version Independent ID: 78938f56-dc65-055c-a238-015f1de5b900
Content: Availability sets overview - Azure Virtual Machines
Content Source: articles/virtual-machines/availability-set-overview.md
Service: virtual-machines
GitHub Login: @mimckitt
Microsoft Alias: mimckitt

@samadara-msft Thanks for the feedback! I have assigned the issue to content author to check and update the document as appropriate. We will update you accordingly.

@mimckitt Can you please check and add your comments on this doc update request as applicable

This doc only applies to VMs. Scale sets use a different form of an availability set that is not user configurable.
You cannot adjust the fault domains and update domains after an AV set is created. However during creation, you can select up to 3 fault domains and 20 update domains. This is possible across Portal, PowerShell, CLI, Template, etc.

The reference to resource manager in this doc is because in the classic deployment model you could only have up to 5 and it was not configurable.
I will push out an update for this doc this afternoon.
#please-close


Add HTML docs for NSX Policy and VMC App APIs

I was asked to include the HTML documentation for our NSX APIs in the github repo, so added 2 new HTML files, and updated the README.md (which was also missing entries for the existing NSX python API  docs).

Got my personal and VMware git accounts mixed up, will re-create pull request.


Add HCL support for config files

Pull Request Test Coverage Report for Build 678

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 16.76%

Totals

Change from base Build 675:
0.0%

Covered Lines:
149

Relevant Lines:
889

💛  - Coveralls


all i did was fire a arrow and game go boom lol

this is on 1.11.2 latest version i made a blast arrow fired it at a cropper and just as it landed the game went bang not the arrow, if this is the point of the said arrow this is a bit of a harsh item lol
http://pastebin.com/Kpv4w1Cu

Thanks for reporting it. It should be fixed as soon as the next version releases.

Thanks for reporting it. It should be fixed as soon as the next version releases.


install specific cuda version (11.8)

while installing Devika. it installed cuda12 and I have compatibility issue with this version and my GPU
how to install Devika using cuda 11.8.

You don't need CUDA to run this, the models used do not require compute, you can install the dependencies into your venv and run this entirely on the CPU.


[RUNTIME] keep opencl runtime deps free from node

The runtime cannot depend on the node system which will introduce additional symbols https://github.com/dmlc/tvm/issues/1344

cc @kazum


add build number to add in similar to ArcMap

It would be useful for the add in to have the build number associated with it similar to ArcMap.  This will help ensure we know what build number we are testing or what build we found the issues in.
This is the about ArcGIS Desktop dialog.  It contains the build number 6491.

Adding the build number to the add-ins would make it easier to identify which build we are testing/finding issues in.   I think the build number should go in the red highlighted box below.

I am working on this, but I have started this, but my last build failed.

[ ] Adding Build Number to the project file
[ ] Adding the delete staging to the pipeline
[ ] Add the solution files to the Solutions Defense Repo

This is completed


Documentation for FTS_PATH changed as copy paste won't work

Signed-off-by: Rajat Sharma<EMAIL_ADDRESS>

@mbrandenburger could you please review this.

Seems we have the same "issue" also at the Fabric Smart Client (https://github.com/hyperledger-labs/fabric-smart-client#getting-started).

Seems we have the same "issue" also at the Fabric Smart Client (https://github.com/hyperledger-labs/fabric-smart-client#getting-started).

Should I raise a PR for that as well ?

Should I raise a PR for that as well ?

That would be fantastic!

Should I raise a PR for that as well ?

That would be fantastic!

Done. Thanks !!


Add a power numerical operator

Is your feature request related to a problem? Please describe.
According to the documentation on numerical operators (https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/operators-numeric), the following operators are available:
* (multiply)
/ (divide)
% (modulo)
+ (add)
- (subtract)
- (minus)
It is however missing a power operator, which I need for some CIDR math.
Describe the solution you'd like
Add a power or exponent operator like ^ or ** so that var num = 2 ^ 5 gives num = 32

Great enhancement! Maybe we can also think about some native CIDR calculation functions like the IP functions in Terraform:

cidrhost
cidrnetmask
cidrsubnet
cidrsubnets

I can only support that calculating and maintaining IP configurations is one of the most needed and used features, but still one of the most annoying to actually implement, so we can make the life a little bit easier for all the DevOps engineers out there.

A pow(x, y) function returning x to the y power would be trivial to add. I am wondering if we should also introduce an exponentiation operator (^ is still unused).

@alfhj as a (slightly painful) workaround, you can always flatten an exponentiation expression into a series of multiplication operations (e.g., 2 * 2 * 2 * 2 * 2). Built-in exponentiation would definitely make that easier to author and read, though it will require a new numeric ARM template function, as this what Bicep numerical operators are transpiled into.

The problem with flattening it is that you might not know beforehand what the exponent is. You can do a little trick with a for loop and a reduce, but it's not very neat:
var SubnetSize = 32 - subnetCidr
var subnetBoundaryArray = [for i in range(0, SubnetSize): 2]
var subnetBoundary = reduce(subnetBoundaryArray, 1, (cur, next) => cur * next)