www/community/homie-dashboard/config.js, www/community/homie-dashboard/homie-dashboard.html

This commit is contained in:
Home Assistant Version Control
2026-07-27 12:48:59 +00:00
parent 335a361f9b
commit 54151795f8
2 changed files with 0 additions and 22273 deletions
-616
View File
@@ -1,616 +0,0 @@
/* ═══════════════════════════════════════════════════════════════════════════
* HOMIE DASHBOARD CONFIGURATION v4.0.0
* ═══════════════════════════════════════════════════════════════════════════
* This is the main configuration file. Edit the sections below to customise the dashboard for your home.
* Both homie-dashboard.html and config.js must be in the same folder.
*
* Search for "YOUR_" to find every value you need to personalise
* ═══════════════════════════════════════════════════════════════════════════ */
/* ─── TOKEN AUTHENTICATION ────────────────────────────────────────────────────────
* Paste your Home Assistant Long-Lived Access Token between the quotes below.
* Generate one in HA → Profile → Security → Long-Lived Access Tokens.
* ─────────────────────────────────────────────────────────────────────────── */
const HA_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4YTJiMDAwMjk3ODY0ZDE4YmYyYWVlZmI1ZTE1YTU3MSIsImlhdCI6MTc4MjE0MjIzNywiZXhwIjoyMDk3NTAyMjM3fQ.3GVbrURrNSqwRt55xcp-Dlg_FleA59tA4DbJCbC1EME";
/* ─── WEBSOCKET CONNECTION ────────────────────────────────────────────────────────
* wsUrl — WebSocket URL of your HA instance. Must match the host/port the dashboard is served from.
* Use ws:// for HTTP, wss:// for HTTPS.
* e.g. if HA is at http://192.168.1.100:8123 use: ws://192.168.1.100:8123/api/websocket
*
* BASE is derived automatically from wsUrl — do not edit it.
* ─────────────────────────────────────────────────────────────────────────── */
const WS_URL = "wss://my-ha.asuscomm.com/api/websocket";
const BASE = WS_URL
.replace(/^wss:\/\//, "https://")
.replace(/^ws:\/\//, "http://")
.replace(/\/api\/websocket$/, "");
/* ─── ALARMO CONFIGURATION ────────────────────────────────────────────────────────
* ALARM_CODE - Your Alarmo PIN code — sent silently with every arm/disarm command.
* Leave as empty string ("") if your Alarmo panel has no code configured.
* ALARM_ENTITY — entity ID of your Alarmo alarm panel.
* ─────────────────────────────────────────────────────────────────────────── */
const ALARM_CODE = "";
const ALARM_ENTITY = "YOUR_ALARM_ENTITY";
/* ─── PHOTO FRAME ───────────────────────────────────────────────────────────
* Place images in a photos/ folder alongside this file.
* Supported formats: jpg, jpeg, png, webp, gif.
* Filenames are case-sensitive. Missing photos are skipped automatically.
* PHOTO_FRAME_INTERVAL — seconds each photo is displayed.
* ─────────────────────────────────────────────────────────────────────────── */
const PHOTO_FRAME_IMAGES = [
// "photos/YOUR_photo1.jpg",
// "photos/YOUR_photo2.jpg",
// "photos/YOUR_photo3.jpg",
];
const PHOTO_FRAME_INTERVAL = 20; // seconds per photo
const CONFIG = {
/* ── WELCOME GREETING ────────────────────────────────────────────────────
* Automatically changes based on the time of day.
* Edit `from` (inclusive) for each slot to match your schedule.
* Slots are evaluated in order — the first match wins.
* The last slot acts as the fallback (its `from` is ignored).
* ──────────────────────────────────────────────────────────────────── */
greetingSlots: [
{ slot: 'morning', from: 5, label: 'GOOD MORNING' },
{ slot: 'afternoon', from: 12, label: 'GOOD AFTERNOON' },
{ slot: 'evening', from: 18, label: 'GOOD EVENING' },
{ slot: 'night', from: 22, label: 'GOOD NIGHT' },
],
get welcomeText() {
const h = new Date().getHours();
const slots = this.greetingSlots;
for (let i = slots.length - 1; i >= 0; i--) {
if (h >= slots[i].from) return slots[i].label;
}
return slots[slots.length - 1].label;
},
/* ── SERVER CONNECTION ───────────────────────────────────────────────────
* References the constants defined above. Do not edit here — edit
* WS_URL and ALARM_ENTITY at the top of this file instead.
* ──────────────────────────────────────────────────────────────────── */
wsUrl: WS_URL,
alarmEntity: ALARM_ENTITY,
/* ── SECURITY ────────────────────────────────────────────────────────────
* Quick-action buttons for security devices (siren, garage/gate).
* Each entry: label, entity (service call), action (HA service to call).
* ─────────────────────────────────────────────────────────────────────── */
security: [
{ label: "Siren On", entity: "YOUR_SIREN_ON_ENTITY" },
{ label: "Siren Off", entity: "YOUR_SIREN_OFF_ENTITY" },
{ label: "Garage/Gate Open", entity: "YOUR_GARAGE_GATE_OPEN_ENTITY" },
{ label: "Garage/Gate Close", entity: "YOUR_GARAGE_GATE_CLOSE_ENTITY" },
],
/* ── WEATHER ─────────────────────────────────────────────────────────────
* HA weather entity shown at the top-centre of the dashboard.
* Change tempUnit to "°F" if you prefer Fahrenheit.
* ──────────────────────────────────────────────────────────────────── */
weather: {
entity: "YOUR_WEATHER_ENTITY",
tempUnit: "°C",
},
/* ── SUN RISE / SUN SET ──────────────────────────────────────────────────
* Sensor entities for the sunrise/sunset arc in the weather screen.
* Note: these may differ from the standard HA sun integration names
* (sensor.sun_next_rising / sensor.sun_next_setting). Check yours at
* HA → Developer Tools → States and search for "sun".
*
* timezone — IANA timezone string (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
* ──────────────────────────────────────────────────────────────────── */
sun: {
sunrise: "YOUR_SUNRISE_ENTITY", // check HA → Developer Tools → States if unsure
sunset: "YOUR_SUNSET_ENTITY",
timezone: "YOUR_TIMEZONE", // e.g. "Europe/London", "America/New_York"
},
/* ── AIR QUALITY INDEX ───────────────────────────────────────────────────
* Sensor entity for the AQI ring card in the weather screen.
* You can use worlds-air-quality-index from HACS.
* ──────────────────────────────────────────────────────────────────── */
aqi: {
entity: "YOUR_AQI_ENTITY",
pm25: "YOUR_AQI_PM25_ENTITY",
pm10: "YOUR_AQI_PM10_ENTITY",
co: "YOUR_AQI_CO_ENTITY",
no2: "YOUR_AQI_NO2_ENTITY",
/* ── AQI BANDS ────────────────────────────────────────────────────────
* Six bands that map an AQI value to a label, description, and colour.
* Defaults follow the US EPA scale (0500). If your sensor uses a
* different scale (EU CAQI, China AQI, etc.) adjust max values,
* labels, and descriptions to match.
*
* Each band needs:
* max — upper bound (inclusive) for this band; use Infinity for the
* last band so any value above the previous max is caught.
* label — short name shown inside the AQI ring (e.g. "Good").
* text — longer description shown below the ring.
* color — hex colour used for the label text and the lit ring dots.
* ──────────────────────────────────────────────────────────────────── */
bands: [
{ max: 50, label: "Good", color: "#4caf8a", text: "The air is in standard level and is healthy for everyone." },
{ max: 100, label: "Moderate", color: "#f0c040", text: "Air quality is acceptable; some pollutants may affect sensitive groups." },
{ max: 150, label: "Unhealthy for Sensitive Groups", color: "#f08040", text: "Members of sensitive groups may experience health effects." },
{ max: 200, label: "Unhealthy", color: "#e04040", text: "Everyone may begin to experience health effects." },
{ max: 300, label: "Very Unhealthy", color: "#9c40a0", text: "Health warnings of emergency conditions." },
{ max: Infinity, label: "Hazardous", color: "#7e0023", text: "Health alert: everyone may experience serious health effects." },
],
},
/* ── MOON PHASE ──────────────────────────────────────────────────────────
* Sensor entity for the moon phase display in the weather screen.
* You can use the moon integration from HA.
* ──────────────────────────────────────────────────────────────────── */
moon: {
entity: "YOUR_MOON_PHASE_ENTITY",
},
/* ── HOME OVERVIEW STATS ─────────────────────────────────────────────────
* Stats shown in the hero area on the Overview screen (up to 10, 5-column grid).
* Each entry: label, entity, onValue, offValue.
*
* Special cases handled automatically:
* alarm_control_panel.* — onValue when armed (any armed_* / arming state).
* cover.* / binary_sensor.* — "on" triggers on "open" or "opening" state.
*
* If a stat shows "—", verify the entity ID at HA → Developer Tools → States.
* ──────────────────────────────────────────────────────────────────── */
homeStats: [
{ label: "Doors", entity: "YOUR_ALL_DOORS_ENTITY", onValue: "Open", offValue: "Closed" },
{ label: "Windows", entity: "YOUR_ALL_WINDOWS_ENTITY", onValue: "Open", offValue: "Closed" },
{ label: "Alarm", entity: "YOUR_ALARM_ENTITY", onValue: "Armed", offValue: "Disarmed" },
{ label: "Cameras", entity: "YOUR_CAMERAS_PRIVACY_ENTITY", onValue: "Off", offValue: "Active" },
{ label: "Motion", entity: "YOUR_ALL_MOTION_SENSORS_ENTITY", onValue: "Detected", offValue: "Clear" },
{ label: "Lights", entity: "YOUR_ALL_LIGHTS_ENTITY", onValue: "On", offValue: "Off" },
{ label: "Air Con", entity: "YOUR_ALL_AC_UNITS_ENTITY", onValue: "On", offValue: "Off" },
{ label: "Purifiers", entity: "YOUR_ALL_PURIFIERS_ENTITY", onValue: "On", offValue: "Off" },
{ label: "W. Heater", entity: "YOUR_WATER_HEATER_ENTITY", onValue: "On", offValue: "Off" },
{ label: "T. Warmer", entity: "YOUR_ALL_TOWEL_WARMERS_ENTITY", onValue: "On", offValue: "Off" },
],
/* ── SENSOR ROW ──────────────────────────────────────────────────────────
* floorSensors — side-by-side floor panels, each with any number of readings.
* Add/remove entire { label, sensors } blocks to add/remove panels.
* Add/remove sensor lines within a panel to add/remove readings.
* ─────────────────────────────────────────────────────────────────────────── */
floorSensors: [
{
label: "First Floor",
sensors: [
{ type: "temp", entity: "YOUR_FIRST_FLOOR_TEMP_ENTITY", unit: "°C", decimal: true },
{ type: "humidity", entity: "YOUR_FIRST_FLOOR_HUMIDITY_ENTITY", unit: "%" },
{ type: "pm25", entity: "YOUR_FIRST_FLOOR_PM25_ENTITY", unit: "μg/m³" },
],
},
{
label: "Second Floor",
sensors: [
{ type: "temp", entity: "YOUR_SECOND_FLOOR_TEMP_ENTITY", unit: "°C", decimal: true },
{ type: "humidity", entity: "YOUR_SECOND_FLOOR_HUMIDITY_ENTITY", unit: "%" },
{ type: "pm25", entity: "YOUR_SECOND_FLOOR_PM25_ENTITY", unit: "μg/m³" },
],
},
{
label: "Solar",
get sensors() { return CONFIG.solar.sensorRow; },
},
],
/* ── SOLAR DASHBOARD ─────────────────────────────────────────────────────
* All entities used by the Solar fullscreen dashboard.
* sensorRow — shown in the floor sensor strip (keep this lean).
* stats — drives the two stat rows inside the solar dashboard.
* The first 5 types (solar, power, export, battery, solar-temp) feed the
* bottom stat row. The remaining 4 feed the top consumption/cost row.
* ──────────────────────────────────────────────────────────────────────── */
solar: {
sensorRow: [
{ type: "solar", entity: "YOUR_SOLAR_PRODUCTION_KW_ENTITY", unit: "kW", decimal: true },
{ type: "power", entity: "YOUR_TODAYS_ENERGY_IN_KW_ENTITY", unit: "kW", decimal: true },
{ type: "export", entity: "YOUR_SOLAR_EXPORT_KW_ENTITY", unit: "kW", decimal: true },
{ type: "battery", entity: "YOUR_BATTERY_STATE_OF_CHARGE_ENTITY", unit: "%" },
{ type: "solar-temp", entity: "YOUR_INVERTER_TEMPERATURE_ENTITY", unit: "°C", decimal: true },
],
stats: [
{ type: "solar", entity: "YOUR_SOLAR_PRODUCTION_KW_ENTITY", unit: "kW", decimal: true },
{ type: "power", entity: "YOUR_TODAYS_ENERGY_IN_KW_ENTITY", unit: "kW", decimal: true },
{ type: "export", entity: "YOUR_SOLAR_EXPORT_KW_ENTITY", unit: "kW", decimal: true },
{ type: "battery", entity: "YOUR_BATTERY_STATE_OF_CHARGE_ENTITY", unit: "%", decimal: false },
{ type: "solar-temp", entity: "YOUR_INVERTER_TEMPERATURE_ENTITY", unit: "°C", decimal: true },
{ type: "live-consumption", entity: "YOUR_TODAYS_ENERGY_IN_W_ENTITY", unit: "W", decimal: false },
{ type: "monthly-kwh", entity: "YOUR_MONTHLY_ENERGY_IN_KW_ENTITY", unit: "kWh", decimal: true },
{ type: "today-cost", entity: "YOUR_TODAYS_ENERGY_COST_ENTITY", unit: "€", decimal: true },
{ type: "monthly-cost", entity: "YOUR_MONTHLY_ENERGY_COST_ENTITY", unit: "€", decimal: true },
],
},
/* ── MUSIC PLAYERS ───────────────────────────────────────────────────────
* Each entry: entity (required), label (optional; derived from entity ID if omitted).
* The dashboard shows whichever player is currently active. Tap the source
* pill to cycle through multiple active players.
* ──────────────────────────────────────────────────────────────────── */
musicPlayers: [
{ entity: "YOUR_SPOTIFY_MEDIA_PLAYER_ENTITY", label: "Spotify" },
{ entity: "YOUR_ECHO_MEDIA_PLAYER_ENTITY", label: "Echo" },
{ entity: "YOUR_SONOS_MEDIA_PLAYER_ENTITY", label: "Sonos" },
// { entity: "YOUR_APPLE_TV_MEDIA_PLAYER_ENTITY", label: "Apple TV" },
// { entity: "YOUR_MA_MEDIA_PLAYER_ENTITY", label: "MA" },
],
/* musicHideDelay — ms the Now Playing bar stays visible after music stops.
* Default: 10000 (10 seconds). */
musicHideDelay: 10_000,
/* ── CALENDAR ────────────────────────────────────────────────────────────
* List of HA calendar entities to pull upcoming events from.
* Events are merged and sorted by date. */
calendarEntities: ["YOUR_CALENDAR_ENTITY_1", "YOUR_CALENDAR_ENTITY_2"],
mealCalendarEntity: "YOUR_MEAL_CALENDAR_ENTITY",
/* mealSlots — the four meal periods in the Today's Meals card.
* Each entry: key (matched case-insensitively against calendar event titles),
* label, icon (inline SVG), hour (023, fallback time when none is set).
* ────────────────────────────────────────────────────────────────────── */
mealSlots: [
{ key: "breakfast", label: "Breakfast", icon: ICONS.meals.breakfast, hour: 9 },
{ key: "lunch", label: "Lunch", icon: ICONS.meals.lunch, hour: 13 },
{ key: "snack", label: "Snack", icon: ICONS.meals.snack, hour: 16 },
{ key: "dinner", label: "Dinner", icon: ICONS.meals.dinner, hour: 19 },
],
/* ── NOTIFICATIONS ───────────────────────────────────────────────────────
* Binary sensors or input_booleans to watch for reminders.
* When any are "on", a notification bar appears on the Overview screen.
* Add as many as you like.
* ──────────────────────────────────────────────────────────────────── */
notifications: [
{ label: "Cat Maintenance", entity: "YOUR_CAT_MAINTENANCE_ENTITY" },
{ label: "Car Maintenance", entity: "YOUR_CAR_MAINTENANCE_ENTITY" },
{ label: "Home Maintenance", entity: "YOUR_HOME_MAINTENANCE_ENTITY" },
{ label: "Personal Maintenance", entity: "YOUR_PERSONAL_MAINTENANCE_ENTITY" },
{ label: "Take Your Vitamins", entity: "YOUR_VITAMINS_TAKEN_ENTITY" },
{ label: "Shumi Litter Box Needs Cleaning", entity: "YOUR_LITTER_BOX_CLEAN_ENTITY" },
{ label: "Shumi Food/Water Problem", entity: "YOUR_FOOD_WATER_PROBLEM_ENTITY" },
{ label: "Prepare Coffee for Tomorrow", entity: "YOUR_COFFEE_PREPARATION_ENTITY" },
],
/* ── ECHO TIMERS ─────────────────────────────────────────────────────────
* Amazon Echo timer sensors. Each active timer is shown as a live
* countdown bubble underneath the notification bar.
* Add/remove entries to match your Echo devices.
* ──────────────────────────────────────────────────────────────────── */
echoTimers: [
{ label: "Office", entity: "YOUR_ECHO_OFFICE_TIMER_ENTITY" },
{ label: "Bedroom", entity: "YOUR_ECHO_BEDROOM_TIMER_ENTITY" },
{ label: "Living Room", entity: "YOUR_ECHO_LIVING_ROOM_TIMER_ENTITY" },
],
/* ── WAZE TRAVEL TIME ────────────────────────────────────────────────────
* Displays a travel-time notification bubble (same style as Echo timers)
* only on the configured days and within the specified time window.
*
* label — text shown in the bubble (e.g. "Work Travel")
* entity — HA sensor entity_id (e.g. "sensor.work_travel_time")
* days — days of the week to show it (0 = Sunday … 6 = Saturday)
* timeStart — hour (023) at which the bubble starts appearing (inclusive)
* timeEnd — hour (023) at which the bubble stops appearing (exclusive)
* ──────────────────────────────────────────────────────────────────── */
wazeTravelTime: [
// Add as many entries as you like. Each one becomes its own bubble.
// days: 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat
{ label: "Work Travel", entity: "YOUR_WORK_TRAVEL_TIME_ENTITY", days: [2, 4, 5], timeStart: 7, timeEnd: 21 },
// { label: "Home Travel", entity: "sensor.home_travel_time", days: [1,2,3,4,5], timeStart: 16, timeEnd: 19 },
],
/* ── CAMERAS ─────────────────────────────────────────────────────────────
* List of camera entities shown in the Cameras dashboard (launcher button).
* Up to 6 cameras are displayed in a 3×2 grid.
*
* entity — HA camera entity_id
* label — display name shown in the bottom-left of each cell
* motionEntity — (optional) binary_sensor entity_id for motion detection;
* cell glows red with a pulsing dot when motion is detected
*
* cameraRefreshSeconds — how often each frame is fetched (default: 1)
* ──────────────────────────────────────────────────────────────────────── */
cameraRefreshSeconds: 1,
cameras: [
{ entity: "YOUR_CAMERA_1_ENTITY", label: "Camera 1", motionEntity: "YOUR_CAMERA_1_MOTION_ENTITY" },
{ entity: "YOUR_CAMERA_2_ENTITY", label: "Camera 2", motionEntity: "YOUR_CAMERA_2_MOTION_ENTITY" },
{ entity: "YOUR_CAMERA_3_ENTITY", label: "Camera 3", motionEntity: "YOUR_CAMERA_3_MOTION_ENTITY" },
{ entity: "YOUR_CAMERA_4_ENTITY", label: "Camera 4", motionEntity: "YOUR_CAMERA_4_MOTION_ENTITY" },
{ entity: "YOUR_CAMERA_5_ENTITY", label: "Camera 5", motionEntity: "YOUR_CAMERA_5_MOTION_ENTITY" },
{ entity: "YOUR_CAMERA_6_ENTITY", label: "Camera 6", motionEntity: "YOUR_CAMERA_6_MOTION_ENTITY" },
],
/* ── DOORBELL ────────────────────────────────────────────────────────────
* buttonEntity — the HA button entity that triggers the doorbell overlay.
* cameraEntity — the HA camera entity to stream when the bell is pressed.
* label — text shown in the overlay header.
* ─────────────────────────────────────────────────────────────────────── */
doorbell: {
buttonEntity: "YOUR_DOORBELL_BUTTON_ENTITY",
cameraEntity: "YOUR_DOORBELL_CAMERA_ENTITY",
label: "Doorbell · Front Door",
},
/* ── PET STATS ───────────────────────────────────────────────────────────
* Entities for the pet stats popup (top-right button).
* petName — name shown on the button and popup title
* litterCount/Last — visits today / last use timestamp
* foodCount/Weight — portions dispensed / total grams today
* foodDes — feeder desiccant days remaining
* waterVol/Filter — purified water today (ml) / filter life (%)
* ──────────────────────────────────────────────────────────────────── */
petName: "YOUR_PET_NAME",
petStats: {
litterCount: "YOUR_LITTER_COUNT_ENTITY",
litterLast: "YOUR_LITTER_LAST_ENTITY",
litterCounter: "YOUR_LITTER_COUNTER_ENTITY",
litterResetAuto: "YOUR_LITTER_RESET_AUTO_ENTITY",
litterCleanBoolean: "YOUR_LITTER_CLEAN_BOOLEAN_ENTITY",
foodCount: "YOUR_FOOD_COUNT_ENTITY",
foodWeight: "YOUR_FOOD_WEIGHT_ENTITY",
foodDes: "YOUR_FOOD_DES_ENTITY",
waterVol: "YOUR_WATER_VOL_ENTITY",
waterFilter: "YOUR_WATER_FILTER_ENTITY",
/* ── LITTER CHART COLOUR THRESHOLDS ──────────────────────────────────────────
* Bar colours in the "Last 5 Days" litter chart.
* ≤ okMax visits/day → green; ≤ warnMax → orange; above → red.
* ──────────────────────────────────────────────────────────────────── */
litterChart: {
okMax: 5, // ≤ this many visits/day → green
warnMax: 10, // ≤ this many visits/day → orange (anything above → red)
colors: {
ok: "#22a722",
warn: "#f59e0b",
high: "#ef4444",
},
},
},
/* ── HABIT & MOOD TRACKER ────────────────────────────────────────────────
* HISTORY SYNC — input_text helpers that persist history in HA.
* Must match configuration.yaml:
* input_text:
* dashboard_habits_log: { name: Dashboard Habits Log, max: 255 }
* dashboard_mood_log: { name: Dashboard Mood Log, max: 255 }
*
* moods — each entry: key (letters only), icon (emoji), label.
* Set to [] to disable the mood tracker.
* habits — each entry: key, label, icon (SVG; use stroke="var(--accent)").
* Set to [] to disable the habit tracker.
* ──────────────────────────────────────────────────────────────────── */
habitsMoodHistoryEntities: {
habits: "YOUR_HABITS_LOG_ENTITY",
mood: "YOUR_MOOD_LOG_ENTITY",
},
moods: [
{ key: "great", icon: "😄", label: "Great" },
{ key: "good", icon: "😊", label: "Good" },
{ key: "okay", icon: "😐", label: "Okay" },
{ key: "meh", icon: "😕", label: "Meh" },
{ key: "bad", icon: "😢", label: "Bad" },
],
habits: [
{ key: "water", label: "Hydrate", icon: ICONS.habits.water },
{ key: "workout", label: "Workout", icon: ICONS.habits.workout },
{ key: "read", label: "Read", icon: ICONS.habits.read },
{ key: "meditate", label: "Meditate", icon: ICONS.habits.meditate },
{ key: "snacks", label: "Snacks", icon: ICONS.habits.snacks },
],
/* ── GLOBAL CONTROLS ─────────────────────────────────────────────────────
* Chip buttons shown at the bottom of the Overview screen.
*
* Card type is determined by entity domain:
* light.* → brightness + colour presets
* climate.* → AC card (mode, fan speed, temperature)
* cover.* → blind/curtain card (open, close, stop, position)
* fan.* → purifier card (power, fan speed)
* switch.* / input_boolean.* / group.* / everything else → on/off toggle
* (group.* toggles the whole group — list lights as light.* for per-light control)
*
* subEntities — flat list; subGroups — per-room accordion. Mix freely.
* expandable: true on a subEntity adds a nested accordion within a subGroup.
*
* Optional chip flags:
* showCount: true — shows active count next to the label
* noRoomGrouping: true — flat list even when subGroups is used
* twoColumnGrid: true — two-column layout for many small cards
* isSceneChip: true — turns subGroups into scene category launchers
* ──────────────────────────────────────────────────────────────────── */
controls: [
{
label: "Lights",
showCount: true,
subGroups: [
{ label: "Living", subEntities: [
{ label: "Center", entity: "YOUR_LIVING_ROOM_LIGHT_CENTER_ENTITY" },
{ label: "Table", entity: "YOUR_LIVING_ROOM_LIGHT_TABLE_ENTITY" },
{ label: "Couch", entity: "YOUR_LIVING_ROOM_LIGHT_COUCH_ENTITY" },
{ label: "TV Strip", entity: "YOUR_LIVING_ROOM_LIGHT_TV_STRIP_ENTITY" },
{ label: "TV Cabinet", entity: "YOUR_LIVING_ROOM_LIGHT_TV_CABINET_ENTITY" },
]},
{ label: "Dining", subEntities: [
{ label: "Center", entity: "YOUR_DINING_ROOM_LIGHT_ENTITY" },
]},
{ label: "Kitchen", subEntities: [
{ label: "Center", entity: "YOUR_KITCHEN_LIGHT_ENTITY" },
]},
{ label: "Office", subEntities: [
{ label: "Center", entity: "YOUR_OFFICE_LIGHT_ENTITY" },
{ label: "Desk Lamp", entity: "YOUR_OFFICE_DESK_LAMP_ENTITY" },
]},
{ label: "Storage", subEntities: [
{ label: "Center", entity: "YOUR_STORAGE_LIGHT_ENTITY" },
]},
{ label: "Bedroom", subEntities: [
{ label: "Center", entity: "YOUR_BEDROOM_LIGHT_ENTITY" },
{ label: "Iris", entity: "YOUR_BEDROOM_LIGHT_IRIS_ENTITY" },
]},
{ label: "Bathrooms", subEntities: [
{ label: "Guest", entity: "YOUR_BATHROOM_GUEST_LIGHT_ENTITY" },
{ label: "Main", entity: "YOUR_BATHROOM_MAIN_LIGHT_ENTITY" },
{ label: "Ensuite", entity: "YOUR_BATHROOM_ENSUITE_LIGHT_ENTITY" },
]},
{ label: "Outside", subEntities: [
{ label: "Entrance", entity: "YOUR_OUTSIDE_ENTRANCE_LIGHT_ENTITY" },
{ label: "Garage", entity: "YOUR_OUTSIDE_GARAGE_LIGHT_ENTITY" },
{ label: "Side", entity: "YOUR_OUTSIDE_SIDE_LIGHT_ENTITY" },
{ label: "Porch", entity: "YOUR_OUTSIDE_PORCH_LIGHT_ENTITY" },
]},
{ label: "Garden", subEntities: [
{ label: "Front Wall", entity: "YOUR_GARDEN_FRONT_WALL_LIGHT_ENTITY" },
{ label: "Back Wall", entity: "YOUR_GARDEN_BACK_WALL_LIGHT_ENTITY" },
{ label: "Spots", entity: "YOUR_GARDEN_SPOTS_LIGHT_ENTITY" },
]},
],
},
{ label: "Scenes", noRoomGrouping: true, isSceneChip: true,
subGroups: [
{
label: "Living",
scenes: [
{ label: "Relax", entity: "YOUR_LIVING_ROOM_RELAX_SCENE_ENTITY", color: "#4a2d7a", icon: ICONS.scenes.relax },
{ label: "Romantic", entity: "YOUR_LIVING_ROOM_ROMANTIC_SCENE_ENTITY", color: "#8b2252", icon: ICONS.scenes.romantic },
{ label: "Movie", entity: "YOUR_LIVING_ROOM_MOVIE_SCENE_ENTITY", color: "#f0ece4", icon: ICONS.scenes.movie },
{ label: "Candle", entity: "YOUR_LIVING_ROOM_CANDLE_SCENE_ENTITY", color: "#7a4a1e", icon: ICONS.scenes.candle },
{ label: "Fireplace", entity: "YOUR_LIVING_ROOM_FIREPLACE_SCENE_ENTITY", color: "#8b3a10", icon: ICONS.scenes.fireplace },
],
},
{
label: "Bedroom",
scenes: [
{ label: "Nightlight", entity: "YOUR_BEDROOM_NIGHTLIGHT_SCENE_ENTITY", color: "#6b3800", icon: ICONS.scenes.nightlight },
{ label: "Romantic", entity: "YOUR_BEDROOM_ROMANTIC_SCENE_ENTITY", color: "#8b2252", icon: ICONS.scenes.romantic },
{ label: "Candle", entity: "YOUR_BEDROOM_CANDLE_SCENE_ENTITY", color: "#7a4a1e", icon: ICONS.scenes.candle },
{ label: "Fireplace", entity: "YOUR_BEDROOM_FIREPLACE_SCENE_ENTITY", color: "#8b3a10", icon: ICONS.scenes.fireplace },
],
},
],
},
{ label: "Air Con", showCount: true,
subEntities: [
{ label: "Living", entity: "YOUR_AC_LIVING_ENTITY" },
{ label: "Dining", entity: "YOUR_AC_DINING_ENTITY" },
{ label: "Office", entity: "YOUR_AC_OFFICE_ENTITY" },
{ label: "Storage", entity: "YOUR_AC_STORAGE_ENTITY" },
{ label: "Bedroom", entity: "YOUR_AC_BEDROOM_ENTITY" },
],
},
{ label: "Purifiers", showCount: true,
subEntities: [
{ label: "Living", entity: "YOUR_PURIFIER_LIVING_ENTITY" },
{ label: "Office", entity: "YOUR_PURIFIER_OFFICE_ENTITY" },
{ label: "Bedroom", entity: "YOUR_PURIFIER_BEDROOM_ENTITY" },
],
},
{ label: "Blinds", showCount: true,
noRoomGrouping: true,
// isCurtain: true — flips the open/close arrow direction for side-to-side curtains.
subEntities: [
{ label: "Living", entity: "YOUR_BLIND_LIVING_ENTITY" },
{ label: "Dining", entity: "YOUR_BLIND_DINING_ENTITY", isCurtain: true },
{ label: "Kitchen", entity: "YOUR_BLIND_KITCHEN_ENTITY" },
{ label: "Storage", entity: "YOUR_BLIND_STORAGE_ENTITY" },
{ label: "Office", entity: "YOUR_BLIND_OFFICE_ENTITY" },
{ label: "Bedroom", entity: "YOUR_BLIND_BEDROOM_ENTITY" },
],
},
{ label: "Bath", showCount: true, noRoomGrouping: true,
subGroups: [
{
label: "House",
subEntities: [
{ label: "Water Heater", entity: "YOUR_WATER_HEATER_ENTITY" },
{ label: "HW Circulation", expandable: true,
subEntities: [
{ label: "Kitchen", entity: "YOUR_HW_CIRC_KITCHEN_ENTITY" },
{ label: "Main Bath", entity: "YOUR_HW_CIRC_MAIN_BATH_ENTITY" },
{ label: "Ensuite", entity: "YOUR_HW_CIRC_ENSUITE_ENTITY" },
],
},
],
},
{
label: "Main Bath",
subEntities: [
{ label: "Fan", entity: "YOUR_MAIN_BATH_FAN_ENTITY" },
{ label: "Towel Warmer", entity: "YOUR_MAIN_BATH_TOWEL_WARMER_ENTITY" },
],
},
{
label: "Ensuite",
subEntities: [
{ label: "Fan", entity: "YOUR_ENSUITE_FAN_ENTITY" },
{ label: "Towel Warmer", entity: "YOUR_ENSUITE_TOWEL_WARMER_ENTITY" },
],
},
],
},
{ label: "Irrigation", showCount: true,
noRoomGrouping: true,
twoColumnGrid: true,
subEntities: [
{ label: "Front", entity: "YOUR_IRRIGATION_FRONT_ENTITY" },
{ label: "Back", entity: "YOUR_IRRIGATION_BACK_ENTITY" },
],
},
],
/* ── GARDEN ──────────────────────────────────────────────────────────────
* Soil moisture sensors for your plants.
* Add as many entries as you like — one per plant.
*
* Each entry:
* label — display name for the plant
* entity — HA sensor entity_id for the soil moisture reading
* unit — unit of measurement (default "%")
*
* Moisture thresholds (used for colour coding):
* dryBelow — below this % → dry (amber warning)
* wetAbove — above this % → overwatered (blue warning)
* (between the two → healthy, green)
* ──────────────────────────────────────────────────────────────────────── */
garden: {
soilMoisture: [
{ label: "Plant 1", entity: "YOUR_SOIL_MOISTURE_1_ENTITY", unit: "%" },
{ label: "Plant 2", entity: "YOUR_SOIL_MOISTURE_2_ENTITY", unit: "%" },
{ label: "Plant 3", entity: "YOUR_SOIL_MOISTURE_3_ENTITY", unit: "%" },
{ label: "Plant 4", entity: "YOUR_SOIL_MOISTURE_4_ENTITY", unit: "%" },
{ label: "Plant 5", entity: "YOUR_SOIL_MOISTURE_5_ENTITY", unit: "%" },
{ label: "Plant 6", entity: "YOUR_SOIL_MOISTURE_6_ENTITY", unit: "%" },
{ label: "Plant 7", entity: "YOUR_SOIL_MOISTURE_7_ENTITY", unit: "%" },
{ label: "Plant 8", entity: "YOUR_SOIL_MOISTURE_8_ENTITY", unit: "%" },
// Add more plants below — copy and paste a line above:
// { label: "Plant x", entity: "YOUR_SOIL_MOISTURE_X_ENTITY", unit: "%" },
],
thresholds: {
dryBelow: 30, // % — below this → dry (show amber)
wetAbove: 80, // % — above this → overwatered (show blue)
},
},
};
File diff suppressed because it is too large Load Diff