###############################################################################
#  @author         :   Mahasri Kalavala
#  @date           :   12/27/2017
#  @package        :   Pi Admin Package
#  @description    :   Got way too many Raspberry Pi's and this package is to 
#                      help me with managing them via Home Assistant.
#
#  How Does It Work?
#
#  Each Raspberry Pi runs a service (a python program) locally that listens for 
#  commands via MQTT on a pre-defined topic. This package publishes commands 
#  to MQTT requesting each Raspberry Pi to respond and or return data.
#  When the responses are received (on a differet topic), the sensors gets 
#  updated automatically and are displayed.
# 
################################################################################

homeassistant:
  customize:
    script.restart_all_raspberrypis:
      friendly_name: Restart All Raspberry Pis
    script.restart_all_snapclients:
      friendly_name: Restart All Snapserver Clients
    script.shutdown_all_raspberrypis:
      friendly_name: Shutdown All Raspberry Pis
    script.query_wifi_info:
      friendly_name: Query WiFi Info
    script.query_disk_info:
      friendly_name: Query Disk Info

input_select:
  raspberry_pis:
    name: All Raspberry Pis
    options:
     - Select One
     - pi_basement
     - pi_theater
     - pi_kitchen
     - pi_familyroom
     - pi_frontroom
     - pi_garage
     - pi_guest1
     - pi_guest2
     - pi_masterbedroom
    initial: Select One
    icon: mdi:pig

  rpi_commands:
    name: RPi Commands
    options:
     - Select One
     - Restart Server
     - Shutdown
     - Restart Snapcast
    initial: Select One
    icon: mdi:pig

sensor:

## WiFi Information related sensors
  - platform: mqtt
    state_topic: "/wifi/pi_basement"
    name: Basement Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_basement"
    name: Basement Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'
    
  - platform: mqtt
    state_topic: "/wifi/pi_theater"
    name: Theater Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_theater"
    name: Theater Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'
    
  - platform: mqtt
    state_topic: "/wifi/pi_kitchen"
    name: Kitchen Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_kitchen"
    name: Kitchen Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_familyroom"
    name: Family Room Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_familyroom"
    name: Family Room Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_frontroom"
    name: Front Room Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_frontroom"
    name: Front Room Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_garage"
    name: Garage Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_garage"
    name: Garage Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_guest1"
    name: Guest 1 Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_guest1"
    name: Guest 1 Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_guest2"
    name: Guest 2 Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_guest2"
    name: Guest 2 Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

  - platform: mqtt
    state_topic: "/wifi/pi_masterbedroom"
    name: master Bedroom Pi Signal Level
    value_template: '{{ value_json["Signal Level"]}}'
    unit_of_measurement: dBm
  - platform: mqtt
    state_topic: "/wifi/pi_masterbedroom"
    name: Master Bedroom Pi Link Quality
    value_template: '{{ value_json["Link Quality"]}}'

## Disk Information related Sensors
  - platform: mqtt
    state_topic: "/disk/pi_basement"
    name: Basement Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_basement"
    name: Basement Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'
    
  - platform: mqtt
    state_topic: "/disk/pi_theater"
    name: Theater Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_theater"
    name: Theater Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'
    
  - platform: mqtt
    state_topic: "/disk/pi_kitchen"
    name: Kitchen Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_kitchen"
    name: Kitchen Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_familyroom"
    name: Family Room Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_familyroom"
    name: Family Room Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_frontroom"
    name: Front Room Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_frontroom"
    name: Front Room Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_garage"
    name: Garage Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_garage"
    name: Garage Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_guest1"
    name: Guest 1 Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_guest1"
    name: Guest 1 Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_guest2"
    name: Guest 2 Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_guest2"
    name: Guest 2 Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

  - platform: mqtt
    state_topic: "/disk/pi_masterbedroom"
    name: Master Bedroom Pi Available Disk
    value_template: '{{ value_json["Available"]}}'
  - platform: mqtt
    state_topic: "/disk/pi_masterbedroom"
    name: Master Bedroom Pi Disk Used
    value_template: '{{ value_json["% Used"]}}'

script:
  restart_all_raspberrypis:
    sequence:
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_basement'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_theater'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_kitchen'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_familyroom'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_frontroom'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_garage'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest1'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest2'
          payload: CMD_REBOOT_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_masterbedroom'
          payload: CMD_REBOOT_PI
          retain: false

  restart_all_snapclients:
    sequence:
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_basement'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_theater'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_kitchen'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_familyroom'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_frontroom'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_garage'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest1'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest2'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_masterbedroom'
          payload: CMD_RESTART_SNAPCLIENT
          retain: false

  shutdown_all_raspberrypis:
    sequence:
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_basement'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_theater'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_kitchen'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_familyroom'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_frontroom'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_garage'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest1'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_guest2'
          payload: CMD_SHUTDOWN_PI
          retain: false
      - service: mqtt.publish
        data_template:
          topic: '/server/pi_masterbedroom'
          payload: CMD_SHUTDOWN_PI
          retain: false

# Script to Query Disk Information - Publishes message 'CMD_REPORT_WIFI_DETAILS'
# to MQTT, so that the message gets received by individual Raspberry Pi
###############################################################################
  query_wifi_info:
    sequence:
      - service: mqtt.publish
        data:
          topic: /server/pi_basement
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_theater
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_kitchen
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_familyroom
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_frontroom
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_garage
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_guest1
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_guest2
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_masterbedroom
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pizero_green
          payload: 'CMD_REPORT_WIFI_DETAILS'
          retain: false

# Script to Query Disk Information - Publishes message 'CMD_REPORT_DISK_DETAILS'
# to MQTT, so that the message gets received by individual Raspberry Pi
###############################################################################
  query_disk_info:
    sequence:
      - service: mqtt.publish
        data:
          topic: /server/pi_basement
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_theater
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_kitchen
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_familyroom
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_frontroom
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_garage
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_guest1
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_guest2
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pi_masterbedroom
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false
      - service: mqtt.publish
        data:
          topic: /server/pizero_green
          payload: 'CMD_REPORT_DISK_DETAILS'
          retain: false

###############################################################################
#                _                        _   _                 
#     /\        | |                      | | (_)                
#    /  \  _   _| |_ ___  _ __ ___   __ _| |_ _  ___  _ __  ___ 
#   / /\ \| | | | __/ _ \| '_ ` _ \ / _` | __| |/ _ \| '_ \/ __|
#  / ____ \ |_| | || (_) | | | | | | (_| | |_| | (_) | | | \__ \
# /_/    \_\__,_|\__\___/|_| |_| |_|\__,_|\__|_|\___/|_| |_|___/
#                                                                              
###############################################################################

# Automations: Various automations to query and issue commands to Raspberry Pis
###############################################################################
automation:

# Queries WiFi Signal Level and Link Quality - it loads during startup, and
# updates once every 30 minutes
###############################################################################
  - alias: Query RPi Wifi Data
    initial_state: true
    trigger:
      - platform: time_pattern
        minutes: '/30'
      - platform: homeassistant
        event: start
    action:
      - service: script.query_wifi_info

# Queries Disk Available and % Used - it loads during startup, and
# updates once every 30 minutes
###############################################################################
  - alias: Query RPi Disk Data
    initial_state: true
    trigger:
      - platform: time_pattern
        minutes: '/30'
      - platform: homeassistant
        event: start        
    action:
      - service: script.query_disk_info

# Issues commands to Raspberry Pi via MQTT - On Demand
###############################################################################
  - alias: Raspberry Pi Command
    initial_state: true
    trigger:
      - platform: state
        entity_id: input_select.rpi_commands
    condition:
      - condition: template
        value_template: '{{ states.input_select.raspberry_pis.state | lower != "select one" }}'
      - condition: template
        value_template: '{{ states.input_select.rpi_commands.state | lower != "select one" }}'
    action:
      service: mqtt.publish
      data_template:
        retain: false
        topic: "{{ '/server/' ~ states.input_select.raspberry_pis.state }}"
        payload: >-
          {% if states.input_select.rpi_commands.state | lower == "restart server" %}
            CMD_REBOOT_PI
          {% elif states.input_select.rpi_commands.state | lower == "restart snapcast" %}
            CMD_RESTART_SNAPCLIENT
          {% else %}
            CMD_SHUTDOWN_PI
          {% endif %}