553 lines
17 KiB
YAML
553 lines
17 KiB
YAML
###############################################################################
|
|
# @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') | lower != 'select one' }}"
|
|
- condition: template
|
|
value_template: "{{ states('input_select.rpi_commands') | lower != 'select one' }}"
|
|
action:
|
|
service: mqtt.publish
|
|
data_template:
|
|
retain: false
|
|
topic: "{{ '/server/' ~ states('input_select.raspberry_pis') }}"
|
|
payload: >-
|
|
{% if states('input_select.rpi_commands') | lower == "restart server" %}
|
|
CMD_REBOOT_PI
|
|
{% elif states('input_select.rpi_commands') | lower == "restart snapcast" %}
|
|
CMD_RESTART_SNAPCLIENT
|
|
{% else %}
|
|
CMD_SHUTDOWN_PI
|
|
{% endif %}
|