def unit_normal(a, b, c):
    x = det([[1,a[1],a[2]],
             [1,b[1],b[2]],
             [1,c[1],c[2]]])
    y = det([[a[0],1,a[2]],
             [b[0],1,b[2]],
             [c[0],1,c[2]]])
    z = det([[a[0],a[1],1],
             [b[0],b[1],1],
             [c[0],c[1],1]])
    magnitude = (x**2 + y**2 + z**2)**.5
    if magnitude == 0.0:
        raise ValueError("The normal of the polygon has no magnitude. Check the polygon. The most common cause for this are two identical sequential points or collinear points.")
    return (x/magnitude, y/magnitude, z/magnitude)
``list_hardware`` returns valid JSON.
dataset/ETHPy150Open tudelft3d/CityGML2OBJs/polygon3dmodule.py/unit_normal--crossover with--dataset/ETHPy150Open ClusterHQ/flocker/flocker/node/test/test_diagnostics.py/ListHardwareTests.test_list_hardware