Turned out to be fairly simple, for using the builtin signal-speed I just added the signal filter:
---@type SignalFilter
local signal_speed = {type = "virtual",name = "signal-speed", quality='normal'}
And then added this snippet to the assembly machine and silo:
local speed = connectedEntity.crafting_speed
if speed then
add_filter({value = signal_speed, min = floor(speed*100)})
end
Unfortunately labs are much harder as their entity doesn't provide researching_speed in the same way. And the values I could get from speed_bonus didn't make sense to me, and you'd have to get the researching_speed from the underlying prototype as well. So I couldn't get that working.