This skill provides comprehensive knowledge for deploying and managing the Ahling Command Center home automation layer: Home Assistant, Mosquitto MQTT, Zigbee2MQTT, ESPHome, and Node-RED.
/plugin marketplace add Lobbi-Docs/claude/plugin install ahling-command-center@claude-orchestrationThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill provides comprehensive knowledge for deploying and managing the Ahling Command Center home automation layer: Home Assistant, Mosquitto MQTT, Zigbee2MQTT, ESPHome, and Node-RED.
┌─────────────────────────────────────────────────────────────────────────┐
│ HOME AUTOMATION LAYER (Phase 2) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ DEVICE LAYER │ │
│ │ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Zigbee │───▶│ Zigbee2MQTT │───▶│ MQTT │ │ │
│ │ │ Devices │ │ (Bridge) │ │ (Mosquitto) │ │ │
│ │ └─────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │
│ │ ┌─────────┐ ┌─────────────┐ │ │ │
│ │ │ ESP32 │───▶│ ESPHome │──────────┤ │ │
│ │ │ Devices │ │ (Flash) │ │ │ │
│ │ └─────────┘ └─────────────┘ │ │ │
│ └───────────────────────────────────────────┼───────────────────┘ │
│ │ │
│ ┌───────────────────────────────────────────┼───────────────────┐ │
│ │ CONTROL LAYER ▼ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Home Assistant │ │ │
│ │ │ (Central Controller) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌─────────────┐ │ ┌─────────────┐ │ │
│ │ │ Node-RED │◀─────┴─────▶│ Ollama │ │ │
│ │ │ (Flows) │ │ (Intent) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
privileged: true
environment:
TZ: America/Chicago
volumes:
- ./homeassistant/config:/config
- /run/dbus:/run/dbus:ro
network_mode: host # For discovery
restart: unless-stopped
depends_on:
- postgres
- mosquitto
# homeassistant/config/configuration.yaml
homeassistant:
name: Ahling Command Center
latitude: !secret latitude
longitude: !secret longitude
elevation: !secret elevation
unit_system: imperial
time_zone: America/Chicago
external_url: https://ha.ahling.local
internal_url: http://homeassistant:8123
# Database
recorder:
db_url: postgresql://ha_user:${HA_DB_PASSWORD}@postgres:5432/homeassistant
commit_interval: 1
exclude:
domains:
- automation
- updater
entity_globs:
- sensor.weather_*
# MQTT
mqtt:
broker: mosquitto
port: 1883
username: homeassistant
password: !secret mqtt_password
# Includes
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
sensor: !include sensors.yaml
# Wyoming Voice
wyoming:
# Ollama Conversation
conversation:
- platform: ollama
name: ahling
url: http://ollama:11434
model: ahling-home
max_history: 10
# HTTP API
http:
use_x_forwarded_for: true
trusted_proxies:
- 172.16.0.0/12
- 10.0.0.0/8
# homeassistant/config/secrets.yaml
# IMPORTANT: This file should be encrypted in Vault
latitude: "XX.XXXX"
longitude: "-XX.XXXX"
elevation: "XXX"
mqtt_password: "${MQTT_PASSWORD}"
# Long-lived access tokens (generate in HA UI)
ha_token: "eyJ0eXAiOi..."
# External service keys
openweathermap_api_key: "abc123..."
services:
mosquitto:
image: eclipse-mosquitto:2
container_name: mosquitto
ports:
- "1883:1883"
- "9001:9001" # WebSocket
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
restart: unless-stopped
# mosquitto/config/mosquitto.conf
listener 1883
listener 9001
protocol websockets
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all
allow_anonymous false
password_file /mosquitto/config/passwd
# ACL for topic-level permissions
acl_file /mosquitto/config/acl
# Optional TLS
#listener 8883
#cafile /mosquitto/certs/ca.crt
#certfile /mosquitto/certs/server.crt
#keyfile /mosquitto/certs/server.key
# mosquitto/config/acl
# Home Assistant - full access
user homeassistant
topic readwrite #
# Zigbee2MQTT
user zigbee2mqtt
topic readwrite zigbee2mqtt/#
topic read homeassistant/#
# Frigate
user frigate
topic readwrite frigate/#
# ESPHome devices
user esphome
topic readwrite esphome/#
# Read-only monitoring
user monitor
topic read #
# Create password file
docker exec mosquitto mosquitto_passwd -c /mosquitto/config/passwd homeassistant
docker exec mosquitto mosquitto_passwd -b /mosquitto/config/passwd zigbee2mqtt ${Z2M_MQTT_PASSWORD}
docker exec mosquitto mosquitto_passwd -b /mosquitto/config/passwd frigate ${FRIGATE_MQTT_PASSWORD}
docker exec mosquitto mosquitto_passwd -b /mosquitto/config/passwd esphome ${ESPHOME_MQTT_PASSWORD}
services:
zigbee2mqtt:
image: koenkk/zigbee2mqtt:latest
container_name: zigbee2mqtt
volumes:
- ./zigbee2mqtt/data:/app/data
- /run/udev:/run/udev:ro
ports:
- "8080:8080"
environment:
TZ: America/Chicago
devices:
- /dev/ttyUSB0:/dev/ttyUSB0 # Zigbee coordinator
depends_on:
- mosquitto
restart: unless-stopped
# zigbee2mqtt/data/configuration.yaml
homeassistant: true
permit_join: false
mqtt:
base_topic: zigbee2mqtt
server: mqtt://mosquitto:1883
user: zigbee2mqtt
password: ${Z2M_MQTT_PASSWORD}
serial:
port: /dev/ttyUSB0
adapter: zstack # or deconz, ezsp depending on coordinator
frontend:
port: 8080
host: 0.0.0.0
advanced:
network_key: GENERATE # Will auto-generate
pan_id: GENERATE
channel: 20
log_level: info
log_output:
- console
- file
log_directory: /app/data/log
# Device-specific settings
devices:
'0x00158d0001234567':
friendly_name: 'living_room_motion'
retain: false
# Groups
groups:
'1':
friendly_name: living_room_lights
devices:
- '0x00158d0001234568/1'
- '0x00158d0001234569/1'
| Coordinator | Adapter Type | Notes |
|---|---|---|
| Sonoff ZBDongle-P | zstack | CC2652P, recommended |
| Sonoff ZBDongle-E | ezsp | EFR32MG21 |
| ConBee II | deconz | deCONZ firmware |
| SLZB-06 | zstack | PoE, external antenna |
services:
esphome:
image: ghcr.io/esphome/esphome:latest
container_name: esphome
volumes:
- ./esphome/config:/config
- /etc/localtime:/etc/localtime:ro
ports:
- "6052:6052"
environment:
ESPHOME_DASHBOARD_USE_PING: true
restart: unless-stopped
# esphome/config/living_room_sensor.yaml
esphome:
name: living-room-sensor
friendly_name: Living Room Sensor
esp32:
board: esp32dev
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Living-Room-Sensor"
password: !secret ap_password
captive_portal:
logger:
api:
encryption:
key: !secret api_key
ota:
password: !secret ota_password
mqtt:
broker: mosquitto
username: esphome
password: !secret mqtt_password
# Sensors
sensor:
- platform: dht
pin: GPIO4
temperature:
name: "Living Room Temperature"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 5
humidity:
name: "Living Room Humidity"
update_interval: 60s
- platform: adc
pin: GPIO34
name: "Living Room Light Level"
update_interval: 10s
binary_sensor:
- platform: gpio
pin:
number: GPIO5
mode: INPUT_PULLUP
name: "Living Room Motion"
device_class: motion
filters:
- delayed_off: 30s
switch:
- platform: gpio
pin: GPIO23
name: "Living Room Relay"
id: relay1
services:
nodered:
image: nodered/node-red:latest
container_name: nodered
environment:
TZ: America/Chicago
ports:
- "1880:1880"
volumes:
- nodered_data:/data
depends_on:
- mosquitto
- homeassistant
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.nodered.rule=Host(`nodered.ahling.local`)"
# Install via Node-RED UI or CLI
npm install \
node-red-contrib-home-assistant-websocket \
node-red-contrib-mqtt-broker \
node-red-contrib-ollama \
node-red-contrib-cron-plus \
node-red-contrib-dashboard \
node-red-contrib-influxdb
[
{
"id": "mqtt_voice",
"type": "mqtt in",
"topic": "voice/commands",
"broker": "mosquitto"
},
{
"id": "ollama_intent",
"type": "ollama",
"model": "ahling-home",
"system": "Extract home automation intent from voice command"
},
{
"id": "ha_service",
"type": "api-call-service",
"server": "homeassistant",
"domain": "{{ msg.intent.domain }}",
"service": "{{ msg.intent.service }}"
}
]
# Device state
zigbee2mqtt/living_room_motion
esphome/living_room_sensor/sensor/temperature/state
frigate/events
# Commands
zigbee2mqtt/living_room_light/set
homeassistant/switch/relay1/set
# Discovery (Home Assistant)
homeassistant/sensor/living_room_temp/config
homeassistant/binary_sensor/motion/config
# homeassistant/config/automations.yaml
- id: motion_lights
alias: "Motion Activated Lights"
trigger:
- platform: mqtt
topic: "zigbee2mqtt/living_room_motion"
payload: '{"occupancy": true}'
condition:
- condition: sun
after: sunset
action:
- service: light.turn_on
target:
entity_id: light.living_room
data:
brightness_pct: "{{ 30 if now().hour > 22 else 100 }}"
- id: voice_control
alias: "Voice Control via Ollama"
trigger:
- platform: mqtt
topic: "voice/transcription"
action:
- service: conversation.process
data:
agent_id: conversation.ahling
text: "{{ trigger.payload }}"
| Component | RAM |
|---|---|
| Home Assistant | 2GB |
| Mosquitto | 256MB |
| Zigbee2MQTT | 256MB |
| ESPHome | 512MB |
| Node-RED | 512MB |
| Total | ~3.5GB |
# Check MQTT connectivity
mosquitto_sub -h mosquitto -u monitor -P ${MONITOR_PASSWORD} -t '#' -v
# Zigbee2MQTT logs
docker logs -f zigbee2mqtt
# Home Assistant logs
docker logs -f homeassistant | grep -E "(ERROR|WARNING)"
# ESPHome device logs
docker exec esphome esphome logs living_room_sensor.yaml
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.