Funções do qos e retain

Pessoal,
Tenho uma dúvida, que já procurei na internet mas não consegui entender na pratica para que serve os comandos “qos” e “retain” na comunicação MQTT

Fiz alguns testes com esses comandos e sem esses comandos e não identifiquei diferença.

Exemplo 1

  - platform: mqtt
    name: "Luz Azul"
#    state_topic: "aqua/sonoff_4CH/tele/STATE"
#    value_template: "{{ value_json.POWER4 }}"
    state_topic: "aqua/sonoff_4CH/stat/POWER4"
    command_topic: "aqua/sonoff_4CH/cmnd/POWER4"
    availability_topic: "aqua/sonoff_4CH/tele/LWT"
 #   qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    payload_available: "Conectado"
    payload_not_available: "Desconectado"
 #   retain: true

Exemplo 2

  - platform: mqtt
    name: "Misturar Água (TPA)"
#    state_topic: "aqua/sonoff_4CH/tele/STATE"
#    value_template: "{{ value_json.POWER1 }}"
    state_topic: "aqua/sonoff_4CH/stat/POWER1"
    command_topic: "aqua/sonoff_4CH/cmnd/POWER1"
    availability_topic: "aqua/sonoff_4CH/tele/LWT"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    payload_available: "Conectado"
    payload_not_available: "Desconectado"
    retain: true