Tag Archives: HVAC

Wacnet – Making the jump to hardware

PCs are everywhere. Except when you need one.

I’ve recently released an open source BACnet webserver and toolkit onto this world. As with my traditional naivety, I was saying:

“It’s really simple! You just have to take any PC that you have available and make sure it’s never turned off.”

The response I got from many of my customers was underwhelming to say the least.

Well, turns out PCs are kind of a hard thing to get for some building managers. They can’t just take an old PC laying in a storage bin… many need to contact their IT department, ask the permission to get a PC and get someone to install and configure it. This often also means a new windows licence, new login/password for the machine… in short, it’s a pain.

In search of cheap computers

I decided to take matters into my own hands and to install Wacnet on the smallest machine I could get my hands on. This way, I might be able to sell small computers to my customers for a fraction of the cost of using one already owned by them. (This statement alone is mind boggling… it might be cheaper to buy new than to re-use something you already own if you must go thought all administrative hoops.)

First I was thinking about small netbooks. About 2 years ago, I was able to get a brand new one for around $300. Surely now they would be cheaper!

Wrong. Instead, the market shifted towards tablet with a nice little mean price of $500. Not really what I wanted.

The sad thing about tablets is also how hard it can be to tinker with them. Especially those without USB ports.

Almost dedicated hardware

A little saddened by this market shift, I decided to take a look to the Raspberry Pi and alike. In short, all the ARM based miniature PCs.

Not only was I able to install Wacnet with minimum hassle, I was also able to configure a linux distro to boot quickly and start Wacnet immediately.

For the user, this means no more installation necessary and no more shell script or batch file to start the application automatically.

You plug the power on the mini PC, and Wacnet starts! Magic!

I’ve effectively turned this mini PC into a (almost) dedicated hardware.

Behold, the mini PC I’m currently using:


MK802 picture shamelessly taken from http://pakitong.blogspot.ca/

While this is known as the MK802 Allwinner A10 Mini PC, Wacnet should be able to run on all the devices based on the same architecture.

A complete plug and play BACnet webserver for a fraction of the price of some thermostats? Count me in!

Why Every HVAC System Is Oversized (And How To Rectify This)

The revelation

At university, I learned something so groundbreaking, so vitally important, that in retrospect I should have known it all along…

From first grade, we learn incrementally complexer math. From addition and multiplication, to calculus and imaginary numbers (such as square-root of -1).


Wait, you mean by hand?

The assumption that one develops in such an environment is that everything must require complex math… which isn’t the case. The revelation I had was the following: What is hard isn’t the math, not at all. What is hard is to get the data!

This is especially true in the HVAC world. My god are those equations easy! You can easily fit them in a spreadsheet and you are good to go. But how do you know exactly what heating power will be needed? Unless you have the data, you won’t be able to do more than an educated guess.

The Car Analogy

Let’s imagine a map with a Start location, and a Destination location. You know where you are, you know where you are going, but you have some important data missing: you don’t know how you will get there. Will the road be a straight line, or will there many detours?


You must guess how much gas you need. There’s no way to know which road is available.

Furthermore, you have to fill your gas tank before you start your journey and you won’t be able to fill it en route.

What’s the value of the dashboard’s fuel consumption under these circumstances? What is this ‘equation’ worth? Without the distance, it’s worthless.

You have to guess how much gas you’ll need. You can’t underestimate, because you will then be stranded in the middle of nowhere. So you have to make an educated guess, based on your past experience on the road. You will also add a little incertitude bias, just to be sure you will make it.

Thus, under normal circumstances, you will always have some gas remaining in your tank when you reach your destination. In addition, this gas will cost you more money upfront, and will add to the total vehicle weight, consequently making it burn more fuel. Physics’s a bitch.

Back to HVAC

It’s the same thing with any HVAC component. Suppose you need a boiler for a new school. What size should it be? Engineering firms can guesstimate, but they will also add a little extra, just to be sure. To a certain extend, you can control an oversized boiler to keep the temperature comfortable, but if the boiler is too small, no amount of control will allow you to reach your temperature setpoint.


When is ‘big’ too big?

As with the car, you need to overestimate. Unfortunately, a bigger boiler means an additional upfront cost. Bigger components also means higher operational costs.

You have BACnet? Use it!

All of this, of course, is the consequence of not having enough data! Without data, math equations are worthless.

It’s ALL about data. Let me make this clear: data data data data data.

Hopefully, building owners and engineering firms will tap into the torrent of data the BACnet protocol can offer them.

Building a new installation similar to another one? (Engineering firms love to copy-paste) Check the original installation! Boiler is cycling? Too big!

Same thing for renovation: You want to install a shiny new heat pump in an existing building? Well now you have data on a silver plate! Instead of guessing what is required, you can actually know it.

There you have it. Until the industry starts to seriously use the available data, HVAC systems will be oversized. Not because someone is lazy, but because without data, oversizing is a necessity!

Geothermal and heat pump controls

How heat pump works

Heat pumps are quite different from other heating devices: contrary to them, the heat they produce is a by-product, rather than the main heat source.

Take an electric heater for example. It consumes electricity to produce heat directly. A heat pump will use this electricity to move the heat from a place to another. What’s the difference? Well it turns out that it’s cheaper to move heat than to create it. For the same amount of electricity required to produce 1kW of heat, you could move 7kW. (Of course this can vary greatly depending on a variety of factors.)


A heat pump takes heat from a place and move it to another (thus there’s always a hot side and a cold side)

If I were to put in sentimental terms, I would say that using electricity to produce heat is one of the stupidest and wasteful way to use electricity. Moving heat is far more intelligent.

Heat pump controls

Transferring heat from one place to another requires some work. The bigger the temperature difference between the two places, the more work it requires.

You could see it as moving dirt using a wheelbarrow. The temperature difference in this case would be the height difference. To take heat (wheelbarrow) from a cold place (low ground), you would have to push it to the hot place (high hill). The hotter the destination, the higher the hill.

Knowing this, to expand the least amount of energy possible, you would want to find the lowest possible hill to dump your dirt. In other words, you want your heat pump to work at a minimum temperature differential.


To accelerate heat transfer however, you must increase the temperature difference. The heat transfer is proportional to the temperature differential squared. This means that in order to keep a room warm in the cold months of winter, you might have to increase your heater set point to a higher temperature.

Let’s sum this up in those 2 following points:

  1. For optimal efficiency, always seek the lowest temperature differential;
  2. To increase heat transfer, you have to increase the temperature differential.

Thus, we can see that the optimal way to control a heat pump is to always try to use the lowest temperature differential, and only increase it when necessary to enable a bigger heat transfer.

If we were to follow this rule and to plot it compared to the exterior temperature, this is what we would get:


The optimal heat pump set point should look like a mirror image of the exterior temperature

As you can see, the lower the exterior temperature, the higher the heat pump set point (to increase the heat exchange between the heat coils and the room air). But as soon as the exterior temperature rises, we lower the heat pump temperature set point.

The cold, hard, real world

Unfortunately, an optimal control is often supposed when salesman and engineers push for heat pumps, but is rarely applied once the machine is installed.

In the snowy french world of Québec, Canada, electricity is a province matter and is heavily subsidized. Even if ‘burning’ electricity directly to create heat is the dumbest way to use electricity, it’s often cheaper than to invest heavily in other solutions.

To patch this problem, the government created some ‘energy efficiency programs’. Geothermal energy and heat pumps can become a wise investment with these, but all estimates always assume an optimum heat pump control. And why shouldn’t they? If you buy a manual transmission car, everyone assumes you are going to shift gears when the time comes.

Alas, this is not the real world. Once installed, these systems are often tuned to ‘work’ and that’s it.

I’ve recently monitored a geothermal installation that reminded me of this cold hard fact. Here is what the heat pump set point looks like:


An actual heat pump set point compared to the exterior temperature

Does this looks like a mirror image? No, it looks like a single set point for every exterior temperature. If this set point is enough for the worse case exterior temperature (-30°C perhaps?), then it’s overkill for everything else. -20°C and still the same set point? You have a needlessly big temperature differential and are thus using the heat pump in a less efficient manner.

What does it mean? Plainly, money is wasted. Remember the manual car analogy? Here the car is always in the first gear, regardless of its speed. Will the car go forward? Sure! Will you burn more fuel? Yup!

The sad part of this is that everything is in place to use it efficiently. No need to buy or replace components. Only how this system is used should be changed. This could be rectified with some lines of code… Meanwhile, electricity is wasted and money lost.

Yet another reason why everyone with a BACnet network should do everything in their power to have historical data: to spot any easy-to-change costly behaviours.

What is BACnet? A video experience

A quick and dirty explanation of what is BACnet

You now have the chance to enjoy my beautiful voice, along with my strong (and hopefully sexy) french accent.

In my opinion, the most important part of BACnet is how it opens up a whole lot of possibilities by giving access to all these sweet sensors. It’s not for nothing that I’m actively archiving gigabytes of data from various HVAC systems…

I say in this video that BACnet offers a way to free the building owners. It does, but mostly for updrades. As I’ve already mentioned, vendors can still inflict a non-negligible switch cost with their proprietary programming language. Vendors might do this totally unwillingly, but the burden is still there and must be paid.

I had a discussion recently with fellow BACneteers about this very subject. Many possible solutions are currently studied. I might summarize it on my mailing list… Meanwhile let’s just say that the statu quo might not persist.

My Video experience

I spent way too much time doing this video… at least for what I consider to be a so-so result. The next time I’ll try to jack up the audio a little, so that my voice is loud and clear.

I could also slack on the drawing board. The effect is nice, but boy is it time consuming! Each drawings must be accelerated ~8 times to have an interesting look. This means that if I want 2 minutes of doodling, I must do it for 16 minutes! That’s if I have everything right the first time (which I didn’t). Another downside of the drawings is to make sure the audio is in sync. Here again, that was quite long.

Next time I might give a try to screen capture. I have a tutorial to do… and as everyone who has written a tutorial before knows, nobody RTFM. A video might be what it takes to capture the attention.

The Importance of Data Visualization

As I’ve mentioned in previous post, I’m working on bacnethelp.com, a website dedicated to help those with a BACnet network.

The current main service is about recording the state of the network for future consultation. If you don’t really know what is a BACnet network, let’s just say that this service is comparable to recording the life signs of an individual, but for buildings. You can then see how it reacted to various stimuli, or even if it’s still alive.

However obtaining the data is only a small part of the work. The biggest part is giving it meaning. “Does the temperature changed because someone opened the window? Is this because my boiler is out of fuel?” One should seek to maximize the speed at which he can troubleshoot.

Here is a minuscule example of what a raw trend log can look like:

{:value "1159.0", :time "2009-03-02T15:45:00.000-05:00"} 
{:value "1160.0", :time "2009-03-02T16:00:00.000-05:00"} 
{:value "1161.0", :time "2009-03-02T16:15:00.000-05:00"} 
{:value "1162.0", :time "2009-03-02T16:30:00.000-05:00"} 

Quite dry isn’t it? Obviously this is not to be used directly.

Now look at how everything is instantly easier when you can see it in a graphical form.


Overview of multiple analog objects – bacnethelp.com

Oh my! If I had a something not working in there, I can almost guarantee it’s the first one. Did I look at the numbers? Nope, the simple shape of the graph was enough.

Of course, any children could tell you that. But why is it easier to use a graph than numeric data?

Let’s say you are looking at the number “3”. In reality your are seeing a particular shape on your screen. Your brain must then analyze it step by step to realize it is indeed the number “3”. In order, the steps taken:

  • Shape
  • Analyze
  • Realize

We shall call it the mental process.

What if you had to make a relation between many numbers? Say for example that you want to determine if a series of 20 numbers is exponential. Well now it gets more complicated, because with the realization of numbers, you will probably try to draw a graph in your head. Once you can visualize it, you will analyze it.

  • Shape
  • Analyze
  • Realize (multiplied by the 20 characters)
  • Visualize shape
  • Analyze
  • Realize

Even if we suppose that that the visualization part is effortless, we still have a total of 21 mental processes. And that’s only for 20 numbers.

If a computer were to draw the series for you, you would only be seeing a shape.

  • Shape
  • Analyze
  • Realize

A single mental process, versus 21 for the raw data. The visualization tools offers the possibilities of simplifying the data back to a single mental process regardless of the data size. The more data you have, the more the advantageous this becomes.

The same principle applies if I were to compare multiple graphs. Instead of having the previous 4 individual graphs, it could be easier to find relations by merging them together. Once again, this reduce the work our brain have to do.


Comparison of multiple analog objects – bacnethelp.com

This video (at around 2m40s) really shows the difference between the data merely ‘dumped’, versus a carefully designed representation. You will see that even if the data is the same, the difference for the user is staggering.

BACnet lock-in and the program object (16)

The BACnet marketing

You are in the HVAC business and trying to sell some BACnet devices. How will you market your product? Well, you’ll probably talk about how this protocol protect the user from being victim of a vendor lock-in.

Switching manufacturer

How wonderful! You can tell the customer how easy it will be for him to switch to another company if you ever let him down! But will it be so easy? Besides the various BACnet variants that might be a compatibility problem, what could be a kick in the teeth? Let’s make a quick check list of what you need in order to perform a vendor transfer:

  • Access to the controller I/Os? Yes;
  • Access the trend logs? Yes;
  • Access to alarms? Yes;
  • Access to the programs? NO!

Wait what? So the user can access every I/Os in the building, but can’t change his system behaviour. So, besides monitoring, what can he do?

“Sure, you can reprogram your controllers, but you’ll need to use our closed source interface application in order to change anything in your programs. We will gladly let you buy one for the modest amount of <insert stupid locked-in price>$ and your soul for eternity.”

This, my friends, is a lock-in.

It is also the moral fight that the Free Software Foundation and the open source projects under the GNU licence are trying to win. You should not be a slave of your programs (nor should your clients).

Priority is power

Not only can’t the user change the programs, he is most likely to be unable to change the programs priorities. This means that even if the user were to try to do a tug of war with the existing controllers by adding a new one with a whole new program in it, the new commands could be completely ignored! If the old devices have higher priorities than your the new one, it’s game over!

Towards a BACnet language standard?

The obvious solution (but less obvious to implement) is to have a language standard which could be read and edited by everyone. Obviously I would go for a lisp-like language, because I think it’s easier to grasp for the everyman. Anyone who have done primary school mathematics can understand how the parentheses are evaluated.

A language standard, while possible, is highly unlikely. The amount of work and cooperation between the many manufacturers would be non-trivial to say the least. In addition, if the program standard was ill-designed, it could drag down the entire BACnet standard with it.

Plain text program

There is however one little change in the standard that could help greatly. What if the programs were plain text and accessible through the BACnet network? Then every workstation would be able to at least open the program and let the user study it. Bonus point if they can also modify it.

The Program object type defines a standardized object whose properties represent the externally visible characteristics of an application program. In this context, an application program is an abstract representation of a process within a BACnet Device, which is executing a particular body of instructions that act upon a particular collection of data structures. The logic that is embodied in these instructions and the form and content of these data structures are local matters. – BACnet Standard 135-2004

Instead of making the content of the programs “local matters”, it could be a property, such as the description.

I can understand how, when the BACnet draft was elaborated, the controllers couldn’t have hold the plain text version of their programs, but today there’s no excuse.

Towards a truly open solution!

Emacs: Unit Converter for the Engineer

How many cubic centimeters in a liter? How many feet in a kilometer? What about gallons per minute and liters per second?

Every single engineer needs to convert units. What may change is how he does it.

  1. Find an online converter / ask Google;
  2. Use a desktop application, such as convert; https://frozenlock.files.wordpress.com/2012/08/wpid-convert.png
  3. Or do it on-the-fly with Emacs!

Now, you may ask:

“But why on earth would I ever consider Emacs to convert my units?”

Because Emacs has an amazing hidden gem inside it: Calc. Fear not, there is no need to learn yet another tool only to convert some units; I’ve package everything needed in a little .el file.

Once this is installed, you can ask Emacs, on-the-fly, to convert some units. Here is an example:

Old value and unit (type C-z for unit list) :

100oz RET

to unit (type C-z for unit list) : g


100oz converted to g = 2834.9523125 g

Pretty nice, isn’t it?

But this is far from it. What’s really handy is how you can input usual prefixes, such as k (kilo), m (milli), y (yocto)… without any special care.

Old value and unit (type C-z for unit list) :

kg RET

to unit (type C-z for unit list) :


kg converted to g = 1000 g


What if you need units not yet defined in Calc? Simply add your own!

Here are some units I’ve added to be more helpful in a HVAC context:

;;; Add some custom units often used in HVAC
(eval-after-load "calc-units"
     (setq math-additional-units
           '((gpm "gal / min" "Gallons per minute")
             (ls "l / s" "Liters per second")
             (cfm "ft^3 / min" "Cubic feet per minute"))
           math-units-table nil)))

Finally, to make sure you take Emacs and Calc seriously, here is the unit list (obtained with M-x calc-view-units-table):

Calculator Units Table:

(All definitions are exact unless marked with an asterisk (*).)

Unit    Type  Definition                  Description

 gpm      U   gal / min                   Gallons per minute
 ls       U   l / s                       Liters per second
 cfm      U   ft^3 / min                  Cubic feet per minute

 m            m                           Meter (base unit)
 in           2.54 cm                     Inch
 ft           12 in                       Foot
 yd           3 ft                        Yard
 mi           5280 ft                     Mile
 au           149597870691 m (*)          Astronomical Unit
 lyr          c yr                        Light Year
 pc           3.0856775854 10^16 m (*)    Parsec
 nmi          1852 m                      Nautical Mile
 fath         6 ft                        Fathom
 fur          660 ft                      Furlong
 mu           1 um                        Micron
 mil          (1/1000) in                 Mil
 point        (1/72) in                   Point (1/72 inch)
 Ang          10^-10 m                    Angstrom
 mfi          mi + ft + in                Miles + feet + inches
 texpt        (100/7227) in               Point (TeX conventions)
 texpc        12 texpt                    Pica
 texbp        point                       Big point (TeX conventions)
 texdd        (1238/1157) texpt           Didot point
 texcc        12 texdd                    Cicero
 texsp        (1/65536) texpt             Scaled TeX point

 hect         10000 m^2                   Hectare
 a            100 m^2                     Are
 acre         (1/640) mi^2                Acre
 b            10^-28 m^2                  Barn

 L            10^-3 m^3                   Liter
 l            L                           Liter
 gal          4 qt                        US Gallon
 qt           2 pt                        Quart
 pt           2 cup                       Pint
 cup          8 ozfl                      Cup
 ozfl         2 tbsp                      Fluid Ounce
 floz         2 tbsp                      Fluid Ounce
 tbsp         3 tsp                       Tablespoon
 tsp          4.92892159375 ml            Teaspoon
 vol          tsp+tbsp+ozfl+cup+pt+qt+gal Gallons + ... + teaspoons
 galC         galUK                       Canadian Gallon
 galUK        4.54609 L                   UK Gallon

 s            s                           Second (base unit)
 sec          s                           Second
 min          60 s                        Minute
 hr           60 min                      Hour
 day          24 hr                       Day
 wk           7 day                       Week
 hms          wk + day + hr + min + s     Hours, minutes, seconds
 yr           365.25 day                  Year (Julian)
 Hz           1 / s                       Hertz

 mph          mi / hr                     Miles per hour
 kph          km / hr                     Kilometers per hour
 knot         nmi / hr                    Knot
 c            299792458 m / s             Speed of light

 ga           9.80665 m / s^2             "g" acceleration

 g            g                           Gram (base unit)
 lb           16 oz                       Pound (mass)
 oz           28.349523125 g              Ounce (mass)
 ton          2000 lb                     Ton
 tpo          ton + lb + oz               Tons + pounds + ounces (mass)
 t            1000 kg                     Metric ton
 tonUK        1016.0469088 kg             UK ton
 lbt          12 ozt                      Troy pound
 ozt          31.10347680 g               Troy ounce
 ct           0.2 g                       Carat
 u            1.660538782 10^-27 kg (*)   Unified atomic mass

 N            m kg / s^2                  Newton
 dyn          10^-5 N                     Dyne
 gf           ga g                        Gram (force)
 lbf          ga lb                       Pound (force)
 kip          1000 lbf                    Kilopound (force)
 pdl          0.138254954376 N            Poundal

 J            N m                         Joule
 erg          10^-7 J                     Erg
 cal          4.1868 J                    International Table Calorie
 calth        4.184 J                     Thermochemical Calorie
 Cal          1000 cal                    Large Calorie
 Btu          1055.05585262 J             International Table Btu
 eV           ech V                       Electron volt
 ev           eV                          Electron volt
 therm        105506000 J                 EEC therm
 invcm        h c / cm                    Energy in inverse centimeters
 Kayser       invcm                       Kayser (inverse centimeter energy)
 men          100 / invcm                 Inverse energy in meters
 Hzen         h Hz                        Energy in Hertz
 Ken          k K                         Energy in Kelvins
 Wh           W hr                        Watt hour
 Ws           W s                         Watt second

 W            J / s                       Watt
 hp           550 ft lbf / s              Horsepower
 hpm          75 m kgf / s                Metric Horsepower

 K        K   K                           Degree Kelvin (base unit)
 dK       K   K                           Degree Kelvin
 degK     K   K                           Degree Kelvin
 dC       C   K                           Degree Celsius
 degC     C   K                           Degree Celsius
 dF       F   (5/9) K                     Degree Fahrenheit
 degF     F   (5/9) K                     Degree Fahrenheit

 Pa           N / m^2                     Pascal
 bar          10^5 Pa                     Bar
 atm          101325 Pa                   Standard atmosphere
 Torr         (1/760) atm                 Torr
 mHg          1000 Torr                   Meter of mercury
 inHg         25.4 mmHg                   Inch of mercury
 inH2O        2.490889 10^2 Pa (*)        Inch of water
 psi          lbf / in^2                  Pounds per square inch

 P            (1/10) Pa s                 Poise
 St           10^-4 m^2 / s               Stokes

 A            A                           Ampere (base unit)
 C            A s                         Coulomb
 Fdy          ech Nav                     Faraday
 e            ech                         Elementary charge
 ech          1.602176487 10^-19 C (*)    Elementary charge
 V            W / A                       Volt
 ohm          V / A                       Ohm
 mho          A / V                       Mho
 S            A / V                       Siemens
 F            C / V                       Farad
 H            Wb / A                      Henry
 T            Wb / m^2                    Tesla
 Gs           10^-4 T                     Gauss
 Wb           V s                         Weber

 cd           cd                          Candela (base unit)
 sb           10000 cd / m^2              Stilb
 lm           cd sr                       Lumen
 lx           lm / m^2                    Lux
 ph           10000 lx                    Phot
 fc           lm / ft^2                   Footcandle
 lam          10000 lm / m^2              Lambert
 flam         (1 / pi) cd / ft^2          Footlambert

 Bq           1 / s                       Becquerel
 Ci           37 10^9 Bq                  Curie
 Gy           J / kg                      Gray
 Sv           Gy                          Sievert
 R            258 10^-6 C / kg            Roentgen
 rd           (1/100) Gy                  Rad
 rem          rd                          Rem

 mol          mol                         Mole (base unit)

 rad          rad                         Radian (base unit)
 circ         2 pi rad                    Full circle
 rev          circ                        Full revolution
 deg          circ / 360                  Degree
 arcmin       deg / 60                    Arc minute
 arcsec       arcmin / 60                 Arc second
 grad         circ / 400                  Grade
 rpm          rev / min                   Revolutions per minute

 sr           sr                          Steradian (base unit)

 h            6.62606896 10^-34 J s (*)   Planck's constant
 hbar         h / 2 pi                    Planck's constant
 mu0          4 pi 10^-7 H / m            Permeability of vacuum
 eps0         1 / mu0 c^2                 Permittivity of vacuum
 G            6.67428 10^-11 m^3/(kg s^2) (*) Gravitational constant
 Nav          6.02214179 10^23 / mol (*)  Avogadro's constant
 me           9.10938215 10^-31 kg (*)    Electron rest mass
 mp           1.672621637 10^-27 kg (*)   Proton rest mass
 mn           1.674927211 10^-27 kg (*)   Neutron rest mass
 mmu          1.88353130 10^-28 kg (*)    Muon rest mass
 Ryd          10973731.568527 /m (*)      Rydberg's constant
 k            1.3806504 10^-23 J/K (*)    Boltzmann's constant
 alpha        7.2973525376 10^-3 (*)      Fine structure constant
 muB          927.400915 10^-26 J/T (*)   Bohr magneton
 muN          5.05078324 10^-27 J/T (*)   Nuclear magneton
 mue          -928.476377 10^-26 J/T (*)  Electron magnetic moment
 mup          1.410606662 10^-26 J/T (*)  Proton magnetic moment
 R0           8.314472 J/(mol K) (*)      Molar gas constant
 V0           22.710981 10^-3 m^3/mol (*) Standard volume of ideal gas

Unit Prefix Table:

 Y     10^24      Yotta
 Z     10^21      Zetta
 E     10^18      Exa
 P     10^15      Peta
 T     10^12      Tera
 G     10^9       Giga
 M     10^6       Mega
 k K   10^3       Kilo
 h H   10^2       Hecto
 D     10^1       Deka
 d     10^-1      Deci
 c     10^-2      Centi
 m     10^-3      Milli
 u     10^-6      Micro
 n     10^-9      Nano
 p     10^-12     Pico
 f     10^-15     Femto
 a     10^-18     Atto
 z     10^-21     zepto
 y     10^-24     yocto