anchor.diff:    linkblox_startup_complete => "LinkBlox startup complete",
     err_starting_linkblox => "Error: ~p starting LinkBlox",
   
  -  host_name => "Host name: ~p",
  +  distributed_node_started => "Distributed node: ~p started",
  +  err_distributed_node_already_started => "Distributed node: ~p already started",
  +  err_starting_distributed_node => "Error: ~p, Starting distributed node: ~p",
  +
  +  host_name => "Host name: ~s",
   
     starting_logger => "Starting logger",
     unknown_logger_call_msg => "logger, Unknown call message: ~p",
  
positive.code: 
  
  %%
  %% Map of attribute string ids to actual strings
  %% Order alphabetically by the attribute string id
  %% Add a map entry for each unique attribute id
  %% Attribute strings must be unique and not contain any spaces
  %% The attribute strings are used to look up the attribute IDs and visa-versa
  %% 
  attrib_strings() -> #{
    '0_out' => "0_out", % Output value for false input
    '1_out' => "1_out", % Output value for true input
    'X_out' => "X_out", % Output value for null input
  
    '0_0_out' => "0_0_out", % Output value for input 2 = false & 1 = false
    '0_1_out' => "0_1_out", % Output value for input 2 = false & 1 = true
    '0_X_out' => "0_X_out", % Output value for input 2 = false & 1 = null
    '1_0_out' => "1_0_out", % Output value for input 2 = true & 1 = false
    '1_1_out' => "1_1_out", % Output value for input 2 = true & 1 = true
    '1_X_out' => "1_X_out", % Output value for input 2 = true & 1 = null
    'X_0_out' => "X_0_out", % Output value for input 2 = null & 1 = false
    'X_1_out' => "X_1_out", % Output value for input 2 = null & 1 = true
    'X_X_out' => "X_X_out", % Output value for input 2 = null & 1 = null
  
    '0_0_0_out' => "0_0_0_out", % Output value for input 3 = false & 2 = false & 1 = false
    '0_0_1_out' => "0_0_1_out", % Output value for input 3 = false & 2 = false & 1 = true
    '0_0_X_out' => "0_0_X_out", % Output value for input 3 = false & 2 = false & 1 = null
    '0_1_0_out' => "0_1_0_out", % Output value for input 3 = false & 2 = true & 1 = false
    '0_1_1_out' => "0_1_1_out", % Output value for input 3 = false & 2 = true & 1 = true
    '0_1_X_out' => "0_1_X_out", % Output value for input 3 = false & 2 = true & 1 = null
    '0_1_X_out' => "0_1_X_out", % Output value for input 3 = false & 2 = null & 1 = false
    '0_1_X_out' => "0_1_X_out", % Output value for input 3 = false & 2 = null & 1 = true
    '0_X_X_out' => "0_X_X_out", % Output value for input 3 = false & 2 = null & 1 = null
  
    '1_0_0_out' => "1_0_0_out", % Output value for input 3 = true & 2 = false & 1 = false
    '1_0_1_out' => "1_0_1_out", % Output value for input 3 = true & 2 = false & 1 = true
    '1_0_X_out' => "1_0_X_out", % Output value for input 3 = true & 2 = false & 1 = null
    '1_1_0_out' => "1_1_0_out", % Output value for input 3 = true & 2 = true & 1 = false
    '1_1_1_out' => "1_1_1_out", % Output value for input 3 = true & 2 = true & 1 = true
    '1_1_X_out' => "1_1_X_out", % Output value for input 3 = true & 2 = true & 1 = null
    '1_X_0_out' => "1_X_0_out", % Output value for input 3 = true & 2 = null & 1 = false
    '1_X_1_out' => "1_X_1_out", % Output value for input 3 = true & 2 = null & 1 = true
    '1_X_X_out' => "1_X_X_out", % Output value for input 3 = true & 2 = null & 1 = null
  
    'X_0_0_out' => "X_0_0_out", % Output value for input 3 = null & 2 = false & 1 = false
    'X_0_1_out' => "X_0_1_out", % Output value for input 3 = null & 2 = false & 1 = true
    'X_0_X_out' => "X_0_X_out", % Output value for input 3 = null & 2 = false & 1 = null
    'X_1_0_out' => "X_1_0_out", % Output value for input 3 = null & 2 = true & 1 = false
    'X_1_1_out' => "X_1_1_out", % Output value for input 3 = null & 2 = true & 1 = true
    'X_1_X_out' => "X_1_X_out", % Output value for input 3 = null & 2 = true & 1 = null
    'X_X_0_out' => "X_X_0_out", % Output value for input 3 = null & 2 = null & 1 = false
    'X_X_1_out' => "X_X_1_out", % Output value for input 3 = null & 2 = null & 1 = true
    'X_X_X_out' => "X_X_X_out", % Output value for input 3 = null & 2 = null & 1 = null
  
    '0_0_0_0_out' => "0_0_0_0_out", % Output value for input 4 = false & 3 = false & 2 = false & 1 = false
    '0_0_0_1_out' => "0_0_0_1_out", % Output value for input 4 = false & 3 = false & 2 = false & 1 = true
    '0_0_1_0_out' => "0_0_1_0_out", % Output value for input 4 = false & 3 = false & 2 = true & 1 = false
    '0_0_1_1_out' => "0_0_1_1_out", % Output value for input 4 = false & 3 = false & 2 = true & 1 = true
    '0_1_0_0_out' => "0_1_0_0_out", % Output value for input 4 = false & 3 = true & 2 = false & 1 = false
    '0_1_0_1_out' => "0_1_0_1_out", % Output value for input 4 = false & 3 = true & 2 = false & 1 = true
    '0_1_1_0_out' => "0_1_1_0_out", % Output value for input 4 = false & 3 = true & 2 = true & 1 = false
    '0_1_1_1_out' => "0_1_1_1_out", % Output value for input 4 = false & 3 = true & 2 = true & 1 = true
    '1_0_0_0_out' => "1_0_0_0_out", % Output value for input 4 = true & 3 = false & 2 = false & 1 = false
    '1_0_0_1_out' => "1_0_0_1_out", % Output value for input 4 = true & 3 = false & 2 = false & 1 = true
    '1_0_1_0_out' => "1_0_1_0_out", % Output value for input 4 = true & 3 = false & 2 = true & 1 = false
    '1_0_1_1_out' => "1_0_1_1_out", % Output value for input 4 = true & 3 = false & 2 = true & 1 = true
    '1_1_0_0_out' => "1_1_0_0_out", % Output value for input 4 = true & 3 = true & 2 = false & 1 = false
    '1_1_0_1_out' => "1_1_0_1_out", % Output value for input 4 = true & 3 = true & 2 = false & 1 = true
    '1_1_1_0_out' => "1_1_1_0_out", % Output value for input 4 = true & 3 = true & 2 = true & 1 = false
    '1_1_1_1_out' => "1_1_1_1_out",  % Output value for input 4 = true & 3 = true & 2 = true & 1 = true
  
    active_true => "active_true",
    active_false => "active_false",
    backlight => "backlight",
    blink_cursor => "blink_cursor",
    blink_rate => "blink_rate",
    block_name => "block_name",
    block_module => "block_module",
    brightness => "brightness",
    broker => "broker", % MQTT server URL
    carry => "carry",
    clear => "clear",
    clean_sess => "clean_sess",
    client_id => "client_id",
    colon => "colon",
    cursor => "cursor",
    dec_pnt => "dec_pnt", % Decimal Point
    default_value => "default_value",
    deg_f => "deg_f", % Degrees Fahrenheit
    description => "description",
    digits => "digits",
    digit1 => "digit1",
    digit2 => "digit2",
    digit3 => "digit3",
    digit4 => "digit4",
    disable => "disable",
    display => "display",
    display_on => "display_on",
    exec_in =>"exec_in",
    exec_interval => "exec_interval",
    exec_method => "exec_method",
    exec_out => "exec_out",
    false_input => "false_input",
    field_width => "field_width",
    field_widths => "field_widths",
    filter_coeff => "filter_coeff",
    final_value => "final_value",
    freeze => "freeze",
    gpio_pin => "gpio_pin",
    gpio_pin_phase_A => "gpio_pin_phase_A",
    gpio_pin_phase_B => "gpio_pin_phase_B",
    gpio_pin_switch => "gpio_pin_switch",
    high_limit => "high_limit",
    humid => "humid", % Humidity
    humid_mode => "humid_mode", % Humidity Mode
    humid_offset => "humid_offset", % Humidity Offset
    i2c_addr => "i2c_addr",
    i2c_device => "i2c_device",
    ignore_nulls => "ignore_nulls",
    inch_merc => "inch_merc", % Inches of Mercury (barometric pressure)
    initial_state => "initial_state",
    initial_value => "initial_value",
    input => "input",
    input1 => "input1",
    input2 => "input2",
    input3 => "input3",
    input4 => "input4",
    inputs => "inputs",
    input_a => "input_a",
    input_b => "input_b",
    input_j => "input_j",
    input_k => "input_k",
    invert_output => "invert_output",
    keepalive => "keepalive",
    last_exec => "last_exec",
    leading_zeros => "leading_zeros",
    led_id => "led_id",
    left_justify => "left_justify",
    logger => "logger",
    low_limit => "low_limit",
    min_on_time => "min_on_time",
    neg_overflow => "neg_overflow",
    neg_precision => "neg_precision",
    nodes => "nodes",
    nodes_state => "nodes_state",
    not_active_str => "not_active_str",
    null_input => "null_input",
    number_base => "number_base",
    num_of_digits => "num_of_digits",
    num_of_inputs => "num_of_inputs",
    num_of_nodes => "num_of_nodes",
    num_of_pubs => "num_of_pubs", % MQTT quantity of topics to publish
    num_of_subs => "num_of_subs", % MQTT quantity of topics to subscribe to
    num_of_values => "num_of_values",
    password => "password",
    phase_int_edge => "phase_int_edge",
    port => "port", % MQTT server port number
    pos_overflow => "pos_overflow",
    pos_precision => "pos_precision",
    precision => "precision",
    press => "press", % Pressure
    press_mode => "press_mode", % Pressure Mode
    press_offset => "press_offset", % Pressure Offset
    proto_ver => "proto_ver", % MQTT protocol version
    pub_inputs => "pub_inputs", % MQTT values to publis
    pub_topics => "pub_topics", % MQTT topics to publish
    read_mode => "read_mode",
    receive_values => "receive_values",
    reset => "reset",
    rollover => "rollover",
    seg_a => "seg_a",
    seg_b => "seg_b",
    seg_c => "seg_c",
    seg_d => "seg_d",
    seg_e => "seg_e",
    seg_f => "seg_f",
    seg_g => "seg_g",
    seg_dp => "seg_dp",
    segments => "segments",
    select => "select",
    send_values => "send_values",
    standby_time => "standby_time",
    start_cols => "start_cols",
    start_rows => "start_rows",
    status => "status",
    sub_topics => "sub_topics", % MQTT topics to subscribe to
    sub_values => "sub_values", % MQTT value of subscribed topics
    switch => "switch",
    switch_int_edge => "switch_int_edge",
    temp => "temp",
    temp_mode => "temp_mode", % Temperature Mode
    temp_offset => "temp_offset", % Temperature Offset
    true_input => "true_input",
    username => "username",
    value => "value",
    version => "version"
  }.
  
  
  %%
  %% Map block type module name to block type name strings
  %% Add a map entry for each block type
  %% Block type name strings must be unique and not contain any spaces
  %% Block type name strings are used to look up the block type module names and visa-versa
  %%
  block_type_names() -> #{
    lblx_exec_count => "exec_count",
    lblx_float_to_7seg => "float_to_7seg",
    lblx_float_to_str => "float_to_str",
    lblx_gpio_di => "gpio_di",
    lblx_gpio_do => "gpio_do",
    lblx_i2c_bme280 => "i2c_bme280",
    lblx_i2c_hd44780 => "i2c_hd44780",
    lblx_i2c_ht16k33 => "i2c_ht16k33",
    lblx_i2c_mcp9808 => "i2c_mcp9808",
    lblx_i2c_pca9685 => "i2c_pca9685",
    lblx_identity => "identity",
    lblx_int_to_7seg => "int_to_7seg",
    lblx_logic_and => "logic_and",
    lblx_logic_config1 => "logic_config1",
    lblx_logic_config1n => "logic_config1n",
    lblx_logic_config2 => "logic_config2",
    lblx_logic_config2n => "logic_config2n",
    lblx_logic_config3 => "logic_config3",
    lblx_logic_config3n => "logic_config3n",
    lblx_logic_config4 => "logic_config4",
    lblx_logic_jk_ff => "logic_jk_ff",
    lblx_logic_nand => "logic_nand",
    lblx_logic_nor => "logic_nor",
    lblx_logic_not => "logic_not",
    lblx_logic_or => "logic_or",
    lblx_logic_toggle => "logic_toggle",
    lblx_logic_tristate => "logic_tristate",
    lblx_logic_xnor => "logic_xnor",
    lblx_logic_xor => "logic_xor",
    lblx_math_avg => "math_avg",
    lblx_math_limit => "math_limit",
    lblx_math_sum => "math_sum",
    lblx_mqtt_pub_sub => "mqtt_pub_sub",
    lblx_one_digit_7seg => "one_digit_7seg",
    lblx_receive_values => "receive_values",
    lblx_rotary_encoder => "rotary_encoder",
    lblx_rpi_led => "rpi_led",
    lblx_select_bin => "select_bin",
    lblx_select_n => "select_n",
    lblx_select_pri => "select_pri",
    lblx_select_tri => "select_tri",
    lblx_send_values => "send_values",
    lblx_template => "template",
    lblx_timer_min_on => "timer_min_on"
  }.
  
  
  %%
  %% Map block type module name to block type description strings
  %% Add a map entry for each block type
  %%
  block_type_descrs() -> #{
    lblx_exec_count => "Incr/Decr counter output value on block execution",
    lblx_float_to_7seg => "Convert floating point value input to multiple 7 segment digits outputs",
    lblx_float_to_str => "Convert floating point value to a string",
    lblx_gpio_di => "GPIO digital input",
    lblx_gpio_do => "GPIO digital output",
    lblx_i2c_bme280 => "Bosch temperature, pressure, and humidity sensor with I2C interface",
    lblx_i2c_hd44780 => "4 Row X 20 Col LCD display with I2C interface",
    lblx_i2c_ht16k33 => "4 digit 7 segment LED display with I2C interface",
    lblx_i2c_mcp9808 => "Precision temp sensor with I2C interface",
    lblx_i2c_pca9685 => "PCA9685 16 Channel 12 bit PWM Output with I2C interface",
    lblx_identity => "Output value is identical to input value",
    lblx_int_to_7seg => "Convert integer input to multiple 7 segment digits outputs",
    lblx_logic_and => "AND of All of the Binary Inputs",
    lblx_logic_config1 => "1 Input Configurable Logic Gate",
    lblx_logic_config1n => "1 Input Configurable Logic Gate, Null Values Allowed",
    lblx_logic_config2 => "2 Input Configurable Logic Gate",
    lblx_logic_config2n => "2 Input Configurable Logic Gate, Null Values Allowed",
    lblx_logic_config3 => "3 Input Configurable Logic Gate",
    lblx_logic_config3n => "3 Input Configurable Logic Gate, Null Values Allowed",
    lblx_logic_config4 => "4 Input Configurable Logic Gate",
    lblx_logic_jk_ff => "JK Flip-Flop",
    lblx_logic_nand => "NAND of All of the Binary Inputs",
    lblx_logic_nor => "NOR of All of the Binary Inputs",
    lblx_logic_not => "Invert boolean value",
    lblx_logic_or => "OR of All of the Binary Inputs",
    lblx_logic_toggle => "Toggle binary output value on block execution",
    lblx_logic_tristate => "Tri-State a Binary Input Value",
    lblx_logic_xnor => "XNOR of the Binary Inputs",
    lblx_logic_xor => "XOR of the Binary Inputs",
    lblx_math_avg => "Average All Input Values",
    lblx_math_limit => "Limit Input Value",
    lblx_math_sum => "Sum All Input Values",
    lblx_mqtt_pub_sub => "Publish and Subscribe values to and from an MQTT Broker",
    lblx_one_digit_7seg => "Single digit 7 segment LED driver",
    lblx_receive_values => "Receive values from other nodes",
    lblx_rotary_encoder => "Rotary encoder with optional switch",
    lblx_rpi_led => "Control Raspi on-board LED",
    lblx_select_bin => "Binary Input Selects the True or False Input Value",
    lblx_select_n => "Select 1 of N Inputs",
    lblx_select_pri => "Select Highest Priority Active Input Value",
    lblx_select_tri => "Trinary Select True, False, or Null Input Value",
    lblx_send_values => "Send Values to other nodes",
    lblx_template => "Short description of block function",
    lblx_timer_min_on => "Output remain on for minimum specified time"
  }.
negative.code: 
    starting_linkblox_block_supervisor => "Starting LinkBlox Block supervisor",
    loading_demo_config => "Loading Demo config...",
    creating_type_version => "Creating: ~p Type: ~s Version: ~s",
  
    block_config_saved_to_file => "Block config saved to file: ~s",
    block_values_file => "Default block values file: ~s",
    opening_block_values_config_file => "Opening block Values config file: ~p",
    err_no_directory_saving_block_config_file => "Error: ~p no directory, saving block config file: ~s",
    err_reading_block_config_file => "Error: ~p reading block config file: ~p",
  