How to add custom measurement units with `Cldr.Unit.Additional`

I was checking how to add new units to Cldr following the documentation but I failed.

I added two new units alarm and person, (the settings are listed below).

In iex I tried to get the new alarm unit, but it says it does not exist.
the unit gallon works fine, as in the example.

MyApp.Cldr.Unit.to_string Cldr.Unit.new!(:alarm, 1) 
** (Cldr.UnknownUnitError) Unknown unit was detected at "alarm"
    (ex_cldr_units 3.15.0) lib/cldr/unit.ex:1021: Cldr.Unit.new!/3

Exploring with iex, I manage to see that the new units are there:

iex> Citymonitor.Cldr.Unit.Additional.additional_units
[:alarm, :person]

iex> {:ok, dic_de} = Citymonitor.Cldr.Unit.unit_strings_for :de
iex> dic_de
%{
    {"alarme", [:alarm]},
    {"alarmen", [:alarm]},
    ...
}

iex> {:ok, dic_en} = Citymonitor.Cldr.Unit.unit_strings_for :en
iex> dic_en
%{
    {"al.", [:alarm]},
    {"alarm", [:alarm]},
    ...
}

I was wondering if the custom units should be merged into the core units,
but I don’t know how or where to do this:

Cldr.Unit.known_units() |> merge_base_units()

I would appreciate any hints or tips.

Here is the rest of the configuration.

iex> Citymonitor.Cldr.Unit.Additional.additional_units
[:alarm, :person]
# File: mix.exs 

{:ex_cldr, "~> 2.34"},
{:ex_cldr_numbers, "~> 2.29"},
{:ex_cldr_units, "~> 3.15"},
{:ex_cldr_plugs, "~> 1.2"},
{:ex_cldr_dates_times, "~> 2.13.1"},
...
# File: config/config.exs 

# localization
config :ex_cldr, default_backend: MyApp.Cldr
# ...
# Cldr Units
config :ex_cldr_units,
  default_backend: MyApp.Cldr,
  additional_units: [
    alarm: [base_unit: :unit, factor: 1],
    person: [base_unit: :unit, factor: 1]
  ]
# File:  lib/myapp/cldr/cldr.ex
defmodule Citymonitor.Cldr do
  use Cldr.Unit.Additional

  use Cldr,
    locales: ["en", "de"],
    default_locale: "de",
    fuzzy_threshold: 1,
    gettext: MyApp.Gettext,
    providers: [Cldr.Number, Cldr.Unit, Cldr.List, Cldr.DateTime, Cldr.Calendar]

  # Alarm

  unit_localization(:alarm, "en", :long,
    nominative: %{
      one: "{0} alarm",
      other: "{0} alarm"
    },
    display_name: "alarm"
  )

  unit_localization(:alarm, "en", :short,
    nominative: %{
      one: "{0} al",
      other: "{0} al"
    },
    display_name: "al"
  )

  unit_localization(:alarm, "en", :narrow,
    nominative: %{
      one: "{0} a",
      other: "{0} a"
    },
    display_name: "a"
  )

  unit_localization(:alarm, "de", :long,
    nominative: %{
      one: "{0} Alarme",
      other: "{0} Alarmen"
    },
    display_name: "Alarme"
  )

  unit_localization(:alarm, "de", :short,
    nominative: %{
      one: "{0} Al.",
      other: "{0} Al."
    },
    display_name: "Al."
  )

  unit_localization(:alarm, "de", :narrow,
    nominative: %{
      one: "{0} a",
      other: "{0} a"
    },
    display_name: "a"
  )

  # Person

  unit_localization(:person, "en", :long,
    nominative: %{
      one: "{0} person",
      other: "{0} people"
    },
    display_name: "people"
  )

  unit_localization(:person, "en", :short,
    nominative: %{
      one: "{0} per",
      other: "{0} ppl"
    },
    display_name: "ppl"
  )

  unit_localization(:person, "en", :narrow,
    nominative: %{
      one: "{0} p",
      other: "{0} p"
    },
    display_name: "p"
  )

  unit_localization(:person, "de", :long,
    nominative: %{
      one: "{0} Person",
      other: "{0} Personen"
    },
    display_name: "Personen"
  )

  unit_localization(:person, "de", :short,
    nominative: %{
      one: "{0} Per",
      other: "{0} Prn"
    },
    display_name: "Prn"
  )

  unit_localization(:person, "de", :narrow,
    nominative: %{
      one: "{0} p",
      other: "{0} p"
    },
    display_name: "p"
  )
end

@Snake-Sanders, I don’t see anything immediately to explain why the new units aren’t being honoured. Additional units are merged at compile time - there is nothing you need to do to make this happen other than configure them as you have done.

I’ve created an issue on the repo and will dig into this today.

Thank you, Kip, for the quick response.
If you know another way to validate that the configuration, maybe some manual checks in iex, I will check it out.

I am seeing the same behavior. Following the example in the doc

config :ex_cldr_units, :additional_units,
  person: [
    base_unit: :unit,
    factor: 1,
    offset: 0
  ]

then a test I would expect to pass (which is not)

assert MyApp.Cldr.Unit.known_units() |> Enum.any?(&(&1 == :person))

catching up on the conversation in the git ticket, it does seem like this was fixed in 3.16.3

update 2: After trying to implement custom conversions for therms to decatherms, I realize the conversions only accept a few custom fields. I added a comment to the issue w/ what I am seeing

update 3: after cleaning deps, I do see these passing, apologies for any extra stress I created in this 30 minute adventure