Files
ha-chore-cleanup/ha_chore_cleanup_fast.sh
jessikitty 3e8072893c Add fast awk-based cleanup script
- Uses awk instead of line-by-line processing
- 10-100x faster than original bash version
- Shows progress for each entity removed
- Creates timestamped backups
- Simplified output for better UX
2025-12-23 01:38:58 +11:00

163 lines
4.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
################################################################################
# Home Assistant Chore Cleanup Script (Fast Sed Version)
# Removes unused chore-related entities from YAML configuration files
################################################################################
# Configuration
CONFIG_DIR="/config"
BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$CONFIG_DIR/backups/cleanup_$BACKUP_TIMESTAMP"
# Color codes
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo "======================================================================"
echo "Home Assistant Chore Cleanup Script (Fast)"
echo "======================================================================"
echo ""
# Create backup directory
mkdir -p "$BACKUP_DIR"
echo -e "${GREEN}${NC} Created backup: $BACKUP_DIR"
echo ""
# Entities to remove (regex patterns)
BOOLEANS=(
"task_lou_clean_desk_pending"
"task_jess_clean_desk_pending"
"task_william_clean_desk_pending"
"task_xander_clean_desk_pending"
"task_bella_clean_desk_pending"
"task_lou_clean_room_pending"
"task_jess_clean_room_pending"
"task_william_clean_room_pending"
"task_xander_clean_room_pending"
"task_bella_clean_room_pending"
"task_tidy_lounge_pending"
"task_vacuum_room_pending"
"task_get_school_ready_pending"
"task_clean_desks_done_this_week"
"task_clean_rooms_done_this_week"
"task_tidy_lounge_done_this_week"
"task_tidy_kitchen_done_today"
"task_clean_dining_table_done_today"
"task_vacuum_room_done_today"
)
SCRIPTS=(
"complete_task_dishwasher_unload"
"complete_task_washing_machine_unload"
"complete_task_dryer_unload"
"complete_task_bins_out"
"complete_task_bins_in"
"complete_task_kitty_litter_clean"
"complete_task_kitty_litter_change"
"complete_tidy_lounge"
"complete_vacuum_room"
"complete_get_school_ready"
)
remove_entity_block() {
local file="$1"
local entity="$2"
# Use awk to remove the entity block
awk -v entity="$entity" '
BEGIN { in_block=0; indent="" }
{
# Check if this line starts our target entity
if ($0 ~ "^[[:space:]]*" entity ":") {
in_block=1
# Capture indentation
match($0, /^[[:space:]]*/)
indent = substr($0, 1, RLENGTH)
next
}
# If in block, check if we hit next entity at same level
if (in_block) {
if ($0 ~ "^" indent "[^[:space:]]" && $0 !~ "^" indent "[[:space:]]") {
in_block=0
} else {
next
}
}
print
}
' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
}
process_file() {
local file="$1"
local entity_type="$2"
local -n entities=$3
if [ ! -f "$file" ]; then
echo -e "${YELLOW}${NC} File not found: $(basename "$file")"
return
fi
echo -e "${BLUE}${NC} Processing $(basename "$file")..."
# Backup
cp "$file" "$BACKUP_DIR/$(basename "$file")"
echo " ✓ Backed up"
local count=0
for entity in "${entities[@]}"; do
if grep -q "^[[:space:]]*${entity}:" "$file"; then
remove_entity_block "$file" "$entity"
((count++))
echo " ✓ Removed: $entity"
fi
done
if [ $count -gt 0 ]; then
echo -e "${GREEN} ✓ Removed $count ${entity_type} entries${NC}"
else
echo " No items to remove"
fi
echo ""
}
# Process input_boolean files
for pattern in "input_boolean.yaml" "input_booleans.yaml"; do
if [ -f "$CONFIG_DIR/$pattern" ]; then
process_file "$CONFIG_DIR/$pattern" "input_boolean" BOOLEANS
fi
done
# Process script files
for pattern in "scripts.yaml" "script.yaml"; do
if [ -f "$CONFIG_DIR/$pattern" ]; then
process_file "$CONFIG_DIR/$pattern" "script" SCRIPTS
fi
done
# Create restore script
cat > "$BACKUP_DIR/restore.sh" << EOF
#!/bin/bash
echo "Restoring from backup..."
cp "$BACKUP_DIR"/*.yaml "$CONFIG_DIR/"
echo "Files restored! Restart Home Assistant: ha core restart"
EOF
chmod +x "$BACKUP_DIR/restore.sh"
echo "======================================================================"
echo "CLEANUP COMPLETE"
echo "======================================================================"
echo ""
echo "Backups: $BACKUP_DIR"
echo ""
echo "NEXT STEPS:"
echo "1. Check config: ha core check"
echo "2. Restart HA: ha core restart"
echo "3. If issues: bash $BACKUP_DIR/restore.sh"
echo ""
echo "======================================================================"