Add Home Assistant configuration for device control
This commit is contained in:
481
opnsense_device_control.yaml
Normal file
481
opnsense_device_control.yaml
Normal file
@@ -0,0 +1,481 @@
|
||||
# OPNsense Device Control Configuration for Home Assistant
|
||||
# This provides device discovery, user assignment, and internet blocking capabilities
|
||||
|
||||
# Input Selects for User Assignment
|
||||
input_select:
|
||||
# Bella's Devices (Age 14)
|
||||
device_user_bella_phone:
|
||||
name: "Bella's Phone Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "Bella"
|
||||
icon: mdi:cellphone
|
||||
|
||||
device_user_bella_tablet:
|
||||
name: "Bella's Tablet Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "Bella"
|
||||
icon: mdi:tablet
|
||||
|
||||
# Xander's Devices (Age 15)
|
||||
device_user_xander_phone:
|
||||
name: "Xander's Phone Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "Xander"
|
||||
icon: mdi:cellphone
|
||||
|
||||
device_user_xander_desktop:
|
||||
name: "Xander's Desktop Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "Xander"
|
||||
icon: mdi:desktop-tower
|
||||
|
||||
# William's Devices (Age 17)
|
||||
device_user_william_phone:
|
||||
name: "William's Phone Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "William"
|
||||
icon: mdi:cellphone
|
||||
|
||||
device_user_william_laptop:
|
||||
name: "William's Laptop Owner"
|
||||
options:
|
||||
- "Bella"
|
||||
- "Xander"
|
||||
- "William"
|
||||
- "Parent"
|
||||
- "Guest"
|
||||
- "Unassigned"
|
||||
initial: "William"
|
||||
icon: mdi:laptop
|
||||
|
||||
# Input Booleans for Internet Blocking
|
||||
input_boolean:
|
||||
# Master Controls
|
||||
parental_controls_enabled:
|
||||
name: "Parental Controls Enabled"
|
||||
icon: mdi:shield-account
|
||||
|
||||
# Bella's Device Blocks
|
||||
block_bella_phone:
|
||||
name: "Block Bella's Phone"
|
||||
icon: mdi:cellphone-off
|
||||
|
||||
block_bella_tablet:
|
||||
name: "Block Bella's Tablet"
|
||||
icon: mdi:tablet-off
|
||||
|
||||
# Xander's Device Blocks
|
||||
block_xander_phone:
|
||||
name: "Block Xander's Phone"
|
||||
icon: mdi:cellphone-off
|
||||
|
||||
block_xander_desktop:
|
||||
name: "Block Xander's Desktop"
|
||||
icon: mdi:desktop-tower-off
|
||||
|
||||
# William's Device Blocks
|
||||
block_william_phone:
|
||||
name: "Block William's Phone"
|
||||
icon: mdi:cellphone-off
|
||||
|
||||
block_william_laptop:
|
||||
name: "Block William's Laptop"
|
||||
icon: mdi:laptop-off
|
||||
|
||||
# User-wide blocks (blocks ALL devices for a user)
|
||||
block_all_bella_devices:
|
||||
name: "Block All Bella's Devices"
|
||||
icon: mdi:account-off
|
||||
|
||||
block_all_xander_devices:
|
||||
name: "Block All Xander's Devices"
|
||||
icon: mdi:account-off
|
||||
|
||||
block_all_william_devices:
|
||||
name: "Block All William's Devices"
|
||||
icon: mdi:account-off
|
||||
|
||||
# Input Text for Device MAC Addresses
|
||||
input_text:
|
||||
# Bella's Device MACs
|
||||
mac_bella_phone:
|
||||
name: "Bella's Phone MAC"
|
||||
initial: ""
|
||||
icon: mdi:cellphone
|
||||
|
||||
mac_bella_phone_wifi:
|
||||
name: "Bella's Phone WiFi MAC"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
mac_bella_tablet:
|
||||
name: "Bella's Tablet MAC"
|
||||
initial: ""
|
||||
icon: mdi:tablet
|
||||
|
||||
mac_bella_tablet_wifi:
|
||||
name: "Bella's Tablet WiFi MAC"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
# Xander's Device MACs
|
||||
mac_xander_phone:
|
||||
name: "Xander's Phone MAC"
|
||||
initial: ""
|
||||
icon: mdi:cellphone
|
||||
|
||||
mac_xander_phone_wifi:
|
||||
name: "Xander's Phone WiFi MAC"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
mac_xander_desktop:
|
||||
name: "Xander's Desktop MAC (Wired)"
|
||||
initial: ""
|
||||
icon: mdi:desktop-tower
|
||||
|
||||
mac_xander_desktop_wifi:
|
||||
name: "Xander's Desktop MAC (WiFi)"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
# William's Device MACs
|
||||
mac_william_phone:
|
||||
name: "William's Phone MAC"
|
||||
initial: ""
|
||||
icon: mdi:cellphone
|
||||
|
||||
mac_william_phone_wifi:
|
||||
name: "William's Phone WiFi MAC"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
mac_william_laptop:
|
||||
name: "William's Laptop MAC (Wired)"
|
||||
initial: ""
|
||||
icon: mdi:laptop
|
||||
|
||||
mac_william_laptop_wifi:
|
||||
name: "William's Laptop MAC (WiFi)"
|
||||
initial: ""
|
||||
icon: mdi:wifi
|
||||
|
||||
# Sensors for Device Status
|
||||
sensor:
|
||||
- platform: template
|
||||
sensors:
|
||||
bella_devices_blocked_count:
|
||||
friendly_name: "Bella Blocked Devices"
|
||||
value_template: >
|
||||
{% set count = 0 %}
|
||||
{% if is_state('input_boolean.block_bella_phone', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_bella_tablet', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{{ count }}
|
||||
icon_template: mdi:counter
|
||||
|
||||
xander_devices_blocked_count:
|
||||
friendly_name: "Xander Blocked Devices"
|
||||
value_template: >
|
||||
{% set count = 0 %}
|
||||
{% if is_state('input_boolean.block_xander_phone', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_xander_desktop', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{{ count }}
|
||||
icon_template: mdi:counter
|
||||
|
||||
william_devices_blocked_count:
|
||||
friendly_name: "William Blocked Devices"
|
||||
value_template: >
|
||||
{% set count = 0 %}
|
||||
{% if is_state('input_boolean.block_william_phone', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_william_laptop', 'on') %}
|
||||
{% set count = count + 1 %}
|
||||
{% endif %}
|
||||
{{ count }}
|
||||
icon_template: mdi:counter
|
||||
|
||||
# REST Commands for OPNsense API
|
||||
rest_command:
|
||||
# Create/Update Firewall Alias for Blocked MACs
|
||||
opnsense_update_blocked_alias:
|
||||
url: "https://10.0.0.254/api/firewall/alias/setItem/{{ alias_uuid }}"
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
payload: >
|
||||
{
|
||||
"alias": {
|
||||
"enabled": "1",
|
||||
"name": "{{ alias_name }}",
|
||||
"type": "mac",
|
||||
"content": "{{ mac_addresses }}",
|
||||
"description": "{{ description }}"
|
||||
}
|
||||
}
|
||||
username: !secret opnsense_api_key
|
||||
password: !secret opnsense_api_secret
|
||||
verify_ssl: false
|
||||
|
||||
# Apply Firewall Changes
|
||||
opnsense_apply_firewall:
|
||||
url: "https://10.0.0.254/api/firewall/filter/apply"
|
||||
method: POST
|
||||
username: !secret opnsense_api_key
|
||||
password: !secret opnsense_api_secret
|
||||
verify_ssl: false
|
||||
|
||||
# Create Block Rule for Alias
|
||||
opnsense_create_block_rule:
|
||||
url: "https://10.0.0.254/api/firewall/filter/addRule"
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
payload: >
|
||||
{
|
||||
"rule": {
|
||||
"enabled": "1",
|
||||
"action": "block",
|
||||
"interface": "lan",
|
||||
"direction": "out",
|
||||
"ipprotocol": "inet",
|
||||
"protocol": "any",
|
||||
"source_net": "{{ alias_name }}",
|
||||
"destination_net": "any",
|
||||
"description": "{{ description }}",
|
||||
"log": "1"
|
||||
}
|
||||
}
|
||||
username: !secret opnsense_api_key
|
||||
password: !secret opnsense_api_secret
|
||||
verify_ssl: false
|
||||
|
||||
# Automations
|
||||
automation:
|
||||
# Block All Bella Devices Toggle
|
||||
- id: block_all_bella_devices_on
|
||||
alias: "Block All Bella Devices - ON"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_bella_devices
|
||||
to: 'on'
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_bella_phone
|
||||
- input_boolean.block_bella_tablet
|
||||
|
||||
- id: block_all_bella_devices_off
|
||||
alias: "Block All Bella Devices - OFF"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_bella_devices
|
||||
to: 'off'
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_bella_phone
|
||||
- input_boolean.block_bella_tablet
|
||||
|
||||
# Block All Xander Devices Toggle
|
||||
- id: block_all_xander_devices_on
|
||||
alias: "Block All Xander Devices - ON"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_xander_devices
|
||||
to: 'on'
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_xander_phone
|
||||
- input_boolean.block_xander_desktop
|
||||
|
||||
- id: block_all_xander_devices_off
|
||||
alias: "Block All Xander Devices - OFF"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_xander_devices
|
||||
to: 'off'
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_xander_phone
|
||||
- input_boolean.block_xander_desktop
|
||||
|
||||
# Block All William Devices Toggle
|
||||
- id: block_all_william_devices_on
|
||||
alias: "Block All William Devices - ON"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_william_devices
|
||||
to: 'on'
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_william_phone
|
||||
- input_boolean.block_william_laptop
|
||||
|
||||
- id: block_all_william_devices_off
|
||||
alias: "Block All William Devices - OFF"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.block_all_william_devices
|
||||
to: 'off'
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.block_william_phone
|
||||
- input_boolean.block_william_laptop
|
||||
|
||||
# Update OPNsense when blocks change
|
||||
- id: update_opnsense_bella_blocks
|
||||
alias: "Update OPNsense - Bella Blocks"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- input_boolean.block_bella_phone
|
||||
- input_boolean.block_bella_tablet
|
||||
action:
|
||||
- service: rest_command.opnsense_update_blocked_alias
|
||||
data:
|
||||
alias_uuid: "bella_blocked"
|
||||
alias_name: "Blocked_Bella"
|
||||
description: "Bella's Blocked Devices"
|
||||
mac_addresses: >
|
||||
{% set macs = [] %}
|
||||
{% if is_state('input_boolean.block_bella_phone', 'on') %}
|
||||
{% if states('input_text.mac_bella_phone') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_bella_phone')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_bella_phone_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_bella_phone_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_bella_tablet', 'on') %}
|
||||
{% if states('input_text.mac_bella_tablet') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_bella_tablet')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_bella_tablet_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_bella_tablet_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ macs | join('\n') }}
|
||||
- delay:
|
||||
seconds: 2
|
||||
- service: rest_command.opnsense_apply_firewall
|
||||
|
||||
- id: update_opnsense_xander_blocks
|
||||
alias: "Update OPNsense - Xander Blocks"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- input_boolean.block_xander_phone
|
||||
- input_boolean.block_xander_desktop
|
||||
action:
|
||||
- service: rest_command.opnsense_update_blocked_alias
|
||||
data:
|
||||
alias_uuid: "xander_blocked"
|
||||
alias_name: "Blocked_Xander"
|
||||
description: "Xander's Blocked Devices"
|
||||
mac_addresses: >
|
||||
{% set macs = [] %}
|
||||
{% if is_state('input_boolean.block_xander_phone', 'on') %}
|
||||
{% if states('input_text.mac_xander_phone') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_xander_phone')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_xander_phone_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_xander_phone_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_xander_desktop', 'on') %}
|
||||
{% if states('input_text.mac_xander_desktop') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_xander_desktop')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_xander_desktop_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_xander_desktop_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ macs | join('\n') }}
|
||||
- delay:
|
||||
seconds: 2
|
||||
- service: rest_command.opnsense_apply_firewall
|
||||
|
||||
- id: update_opnsense_william_blocks
|
||||
alias: "Update OPNsense - William Blocks"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- input_boolean.block_william_phone
|
||||
- input_boolean.block_william_laptop
|
||||
action:
|
||||
- service: rest_command.opnsense_update_blocked_alias
|
||||
data:
|
||||
alias_uuid: "william_blocked"
|
||||
alias_name: "Blocked_William"
|
||||
description: "William's Blocked Devices"
|
||||
mac_addresses: >
|
||||
{% set macs = [] %}
|
||||
{% if is_state('input_boolean.block_william_phone', 'on') %}
|
||||
{% if states('input_text.mac_william_phone') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_william_phone')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_william_phone_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_william_phone_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.block_william_laptop', 'on') %}
|
||||
{% if states('input_text.mac_william_laptop') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_william_laptop')] %}
|
||||
{% endif %}
|
||||
{% if states('input_text.mac_william_laptop_wifi') != '' %}
|
||||
{% set macs = macs + [states('input_text.mac_william_laptop_wifi')] %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ macs | join('\n') }}
|
||||
- delay:
|
||||
seconds: 2
|
||||
- service: rest_command.opnsense_apply_firewall
|
||||
Reference in New Issue
Block a user