FreeBOMBS is a Free Bill of Materials Build System
The goal of FreeBOMBS is to provide a precise system for configuring product BOM's as well as an online user interface for end users to configure their product and get a full BOM as the result.
Further development will include an editor for the YAML databases (and support other structure formats).
FreeBOMBS uses a database consisting of the following YAML files in a folder. There is an example database included in the dbs directory "dbs/freeems-puma-spin1"
- Mandatory keys are in bold
- Markdown is allowed (but not supported yet) in at least
title
anddescription
fields.
This is a definition list of component types (not implemented yet). It will include further, dynamic validation rules for component data and UI layout.
A list of known/supported component suppliers. Each key on the top level is the supplier ID. Any unique string is allowed. Each value MUST be a Hash containing the following items:
- title: Human (user) -readable string; the full name of the supplier.
- homepage: The home-page URL of the supplier.
- currency: The default currency used by the supplier, only
USD
andEUR
supported currently.
A database of all components used in the project. Each key on the top level is the manufacturer ID code of the component. These MUST be unique. If the ID is shared amongst several vendors or is otherwise generic, suffix the ID with a unique identifier. The part number in the supplier section of the component defines which exact component to use. There MUST be a Hash for each key. What's defined below is the contents of each key.
Mark a component as absolete, when it becomes hard to source or is replaced by something better. You should define a replacement component instead and make a link to it using the replacement component reference ID.
- title: A single-line description of the component
- obsolete: MUST be true
- replacement: A reference ID to an equivalent part, which MUST be defined in the components database
Any items of a normal component are allowed, but not required.
- title: A single-line description of the component
- description: A multi-line description of the component. Optional, if a datasheet URL is defined.
- datasheet: An URL to the datasheet of the component. Optional, if the description is defined.
- suppliers: A Hash containing supplier ID's as keys and the following items as the value (Hash):
- part: The part number of the supplier as a String.
- price: The price as a number, eg.
0.053
or18.84
or37
. Use the default currency of the supplier, it will be normalized.
Currently, any extra key-value pairs are allowed, but not supported. Support will be added, when component_types.yaml is defined.
Examples:
'MCR10EZPF1001': title: Compact Thick Film Chip Resistor datasheet: http://www.rohm.com/products/databook/r/pdf/mcr10.pdf suppliers: digikey: part: 'RHM1.00KCRDKR-ND' price: 0.042 'AU-Y1002-A-R': title: USB A-B Male cable category: cables description: | This is a regular USB A to B cable, you might already have one for your printer or a miscellaneous similar device. Choose something that works with your USB receptacle. suppliers: digikey: part: 'AE9931-ND' price: 5.75 'CD74HCT86M96': title: 74HC series logic gate vender: Texas Instruments category: IC mounting: SMD voltage: [ 4.5, 5.5 ] # V; range current: 0.0052 # 5.2mA temperature: [ -55, 125 ] datasheet: http://focus.ti.com/lit/ds/symlink/cd74hc86.pdf suppliers: digikey: part: '296-8201-1-ND' price: 0.7 '52000001009': title: Fuse Clip (not included) obsolete: true '74HC86DR2G': title: 74HC series logic gate **OBSOLETE** obsolete: true replacement: 'CD74HCT86M96'
A structure defining, which components are used in which configuration.
Component references are defined as an Array containing the amount and component ID of the component used.
- Amount of the component (number)
- Component ID of the component (string)
Example: [ 4, 'RMCF0805JT1K60' ]
When only one compnent is needed, the Array pair containing the amount may be omitted, just supply the component ID as a string instead.
Example: 'RMCF0805JT1K60'
- title: A single-line string defining the name of the project.
- description: A multi-line string defining the purpose and general info about the project.
- components: A list of baseline components as an Array, see "Component references". These are always included in the BOM.
- sections: A list of section definitions (see below; "Section structure".
- section_order: A list of section ID's defining in which order to present the sections to the user.
- title: A single-line string defining the name of the project.
- description: A multi-line string defining the purpose and general info about the project.
- value: The default amount of component sets of in this section to include in the BOM.
- min: The minimum value.
- max: The maximum value.
- checked: Whether to enable the section by default or not. Allowed values: true or false
- presets: A list of pre-set values with titles. An array containing Hash structures defined as:
- title: The title of the preset, should be descriptive.
- value: The value preset to apply, if selected. Can't be greater than max or less than min.
- excludes: A section ID defining a single other section to uncheck, if checked. Can also be defined as a list of section ID's to uncheck, when checked.
- components: A list of baseline components as an Array, see "Component references".
- The amounts are multiplied by the value entered.
- Obsolete component references with a replacement defined show a warning.
- Obsolete compnonet references without a replacement are treated as errors.
Example:
title: FreeEMS Puma Spin 1 description: | # Introduction This BOM is highly experimental, proceed at your own risk! The baseline configuration includes only a set of bare minimum parts. components: - 'MCR10EZPF1001' - 'RSF200JB-1R0' - '52000001009' - [ 11, 'RMCF0805FT10K0' ] - [ 2, 'RMCF0805JT10M0' ] - 'RMCF0805JT22K0' - 'MCR10EZPF3902' - [ 12, 'GRM21BR71H104KA01L' ] - [ 9, 'RMCF0805JT1K60' ] - [ 2, 'UVZ1C100MDD' ] - [ 2, '500R15N220JV4T' ] - 'MC9S12XDP512MAL' section_order: - RECOMMENDED - INJ-H - INJ-L - IGN sections: RECOMMENDED: title: Recommended baseline parts description: | Don't uncheck this, unless you know what you are doing! checked: true value: 1 min: 0 max: 1 components: - 'UDQ2916LBTR-T' - [ 4, 'MCR10EZPF1001' ] - [ 2, 'RSF200JB-1R0' ] - [ 4, 'GRM21BR71H104KA01L' ] - [ 4, 'RMCF0805JT1K60' ] - 74HC86DR2G INJ-H: title: High-Z injector circuit configuration description: | Enter the number of injector drivers you want to use. presets: - title: "1-cylinder engine" value: 1 - title: "4-cylinder engine, semi-sequential injection" value: 2 - title: "4-cylinder engine, sequential injection" value: 4 checked: true excludes: INJ-L value: 0 min: 0 max: 8 components: - 'VNP20N07' INJ-L: title: Low-Z injector circuit configuration description: | Enter the number of injector drivers you want to use. presets: - title: "High-Z injector system or ignition only" value: 0 - title: "1-cylinder engine" value: 1 - title: "4-cylinder engine, semi-sequential injection" value: 2 - title: "4-cylinder engine, sequential injection" value: 4 checked: false excludes: INJ-H value: 0 min: 0 max: 8 components: - 'RMCF0805JT1K60' - 'MCR10EZPF3901' - 'GRM216R71H103KA01D' - 'WHCR10FET' - '2N6045G' - '1N5364BRLG' - 'LM1949N/NOPB' IGN: title: Ignition circuit configuration description: | Enter the number of ignition drivers you want to use. presets: - title: "Fuel-only" value: 0 - title: "Distributor or single-cylinder engine" value: 1 - title: "Sequential for 2-cylinder engines" value: 2 - title: "Wasted spark for 4-cylinder engines" value: 2 checked: false value: 0 min: 0 max: 4 components: - 'MCR10EZPF1001' - 'RMCF0805FT10K0' - 'RMCF0805JT1K60' - 'LH R974-LP-1-0-20-R18' - 'VNP20N07'
- Ruby
- RubyGems (if Ruby version is below 1.9)
gem install yaml
(if Ruby version is below 1.9)gem install bluecloth
(used for the Markdown to html conversion)gem install highline
(used for the CLI)
ruby test/check_db_sanity.rb
The script outputs a verbose state of what it's checking, warnings are indented with two dots and errors halt execution after displaying the error message.
- FreeBOMBS: Juha-Jarmo Heinonen
- The various FreeEMS contributors for all the input as well as a baseline configuration.