274 lines
10 KiB
Python
274 lines
10 KiB
Python
from icon_mapping import get_icon_char
|
|
import apis
|
|
from helper import get_attr_safe
|
|
|
|
weather_mapping = {
|
|
'clear-night': 'weather-night',
|
|
'cloudy': 'weather-cloudy',
|
|
'exceptional': 'alert-circle-outline',
|
|
'fog': 'weather-fog',
|
|
'hail': 'weather-hail',
|
|
'lightning': 'weather-lightning',
|
|
'lightning-rainy': 'weather-lightning-rainy',
|
|
'partlycloudy': 'weather-partly-cloudy',
|
|
'pouring': 'weather-pouring',
|
|
'rainy': 'weather-rainy',
|
|
'snowy': 'weather-snowy',
|
|
'snowy-rainy': 'weather-snowy-rainy',
|
|
'sunny': 'weather-sunny',
|
|
'windy': 'weather-windy',
|
|
'windy-variant': 'weather-windy-variant'
|
|
}
|
|
|
|
sensor_mapping_off = {
|
|
"battery": "battery",
|
|
"battery_charging": "battery",
|
|
"carbon_monoxide": "smoke-detector",
|
|
"cold": "thermometer",
|
|
"connectivity": "close-network-outline",
|
|
"door": "door-closed",
|
|
"garage_door": "garage",
|
|
"power": "power-plug-off",
|
|
"gas": "checkbox-marked-circle",
|
|
"problem": "checkbox-marked-circle",
|
|
"safety": "checkbox-marked-circle",
|
|
"tamper": "check-circle",
|
|
"smoke": "smoke-detector-variant",
|
|
"heat": "thermometer",
|
|
"light": "brightness-5",
|
|
"lock": "lock",
|
|
"moisture": "water-off",
|
|
"motion": "motion-sensor-off",
|
|
"occupancy": "home-outline",
|
|
"opening": "square",
|
|
"plug": "power-plug-off",
|
|
"presence": "home-outline",
|
|
"running": "stop",
|
|
"sound": "music-note-off",
|
|
"update": "package",
|
|
"vibration": "crop-portrait",
|
|
"window": "window-closed",
|
|
}
|
|
|
|
sensor_mapping_on = {
|
|
"battery": "battery-outline",
|
|
"battery_charging": "battery-charging",
|
|
"carbon_monoxide": "smoke-detector-alert",
|
|
"cold": "snowflake",
|
|
"connectivity": "check-network-outline",
|
|
"door": "door-open",
|
|
"garage_door": "garage-open",
|
|
"power": "power-plug",
|
|
"gas": "alert-circle",
|
|
"problem": "alert-circle",
|
|
"safety": "alert-circle",
|
|
"tamper": "alert-circle",
|
|
"smoke": "smoke-detector-variant-alert",
|
|
"heat": "fire",
|
|
"light": "brightness-7",
|
|
"lock": "lock-open",
|
|
"moisture": "water",
|
|
"motion": "motion-sensor",
|
|
"occupancy": "home",
|
|
"opening": "square-outline",
|
|
"plug": "power-plug",
|
|
"presence": "home",
|
|
"running": "play",
|
|
"sound": "music-note",
|
|
"update": "package-up",
|
|
"vibration": "vibrate",
|
|
"window": "window-open",
|
|
}
|
|
|
|
sensor_mapping = {
|
|
"apparent_power": "flash",
|
|
"aqi": "smog",
|
|
"battery": "battery",
|
|
"carbon_dioxide": "smog",
|
|
"carbon_monoxide": "smog",
|
|
"current": "flash",
|
|
"date": "calendar",
|
|
"duration": "timer",
|
|
"energy": "flash",
|
|
"frequency": "chart-bell-curve",
|
|
"gas": "gas-cylinder",
|
|
"humidity": "air-humidifier",
|
|
"illuminance": "light",
|
|
"monetary": "cash",
|
|
"nitrogen_dioxide": "smog",
|
|
"nitrogen_monoxide": "smog",
|
|
"nitrous_oxide": "smog",
|
|
"ozone": "smog",
|
|
"pm1": "smog",
|
|
"pm10": "smog",
|
|
"pm25": "smog",
|
|
"power_factor": "flash",
|
|
"power": "flash",
|
|
"pressure": "gauge",
|
|
"reactive_power": "flash",
|
|
"signal_strength": "signal",
|
|
"sulphur_dioxide": "smog",
|
|
"temperature": "thermometer",
|
|
"timestamp": "calendar-clock",
|
|
"volatile_organic_compounds": "smog",
|
|
"voltage": "flash"
|
|
}
|
|
|
|
cover_mapping = {
|
|
#"device_class": ("icon-open", "icon-closed", "icon-cover-open", "icon-cover-stop", "icon-cover-close")
|
|
"awning": ("window-open", "window-closed", "arrow-up", "stop", "arrow-down"),
|
|
"blind": ("blinds-open", "blinds", "arrow-up", "stop", "arrow-down"),
|
|
"curtain": ("curtains", "curtains-closed", "arrow-expand-horizontal", "stop", "arrow-collapse-horizontal"),
|
|
"damper": ("checkbox-blank-circle", "circle-slice-8", "arrow-up", "stop", "arrow-down"),
|
|
"door": ("door-open", "door-closed", "arrow-expand-horizontal", "stop", "arrow-collapse-horizontal"),
|
|
"garage": ("garage-open", "garage", "arrow-up", "stop", "arrow-down"),
|
|
"gate": ("gate-open", "gate", "arrow-expand-horizontal", "stop", "arrow-collapse-horizontal"),
|
|
"shade": ("blinds-open", "blinds", "arrow-up", "stop", "arrow-down"),
|
|
"shutter": ("window-shutter-open", "window-shutter", "arrow-up", "stop", "arrow-down"),
|
|
"window": ("window-open", "window-closed", "arrow-up", "stop", "arrow-down"),
|
|
}
|
|
|
|
simple_type_mapping = {
|
|
'button': 'gesture-tap-button',
|
|
'navigate': 'gesture-tap-button',
|
|
'input_button': 'gesture-tap-button',
|
|
'input_select': 'gesture-tap-button',
|
|
'scene': 'palette',
|
|
'script': 'script-text',
|
|
'switch': 'light-switch',
|
|
'automation': 'robot',
|
|
'number': 'ray-vertex',
|
|
'input_number': 'ray-vertex',
|
|
'light': 'lightbulb',
|
|
'fan': 'fan',
|
|
'person': 'account',
|
|
'vacuum': 'robot-vacuum',
|
|
'timer': 'timer-outline'
|
|
|
|
}
|
|
|
|
alarm_control_panel_mapping = {
|
|
'disarmed': 'shield-off',
|
|
'armed_home': 'shield-home',
|
|
'armed_away': 'shield-lock',
|
|
'armed_night': 'weather-night',
|
|
'armed_vacation': 'shield-airplane',
|
|
'arming': 'shield',
|
|
'pending': 'shield',
|
|
'triggered': 'bell-ring'
|
|
}
|
|
|
|
climate_mapping = {
|
|
'auto': 'calendar-sync',
|
|
'heat_cool': 'calendar-sync',
|
|
'heat': 'fire',
|
|
'off': 'power',
|
|
'cool': 'snowflake',
|
|
'dry': 'water-percent',
|
|
'fan_only': 'fan'
|
|
}
|
|
|
|
media_content_type_mapping = {
|
|
'music': 'music',
|
|
'tvshow': 'movie',
|
|
'video': 'video',
|
|
'episode': 'alert-circle-outline',
|
|
'channel': 'alert-circle-outline',
|
|
'playlist': 'alert-circle-outline'
|
|
}
|
|
|
|
def get_icon(ha_type, overwrite=None):
|
|
if overwrite is not None:
|
|
if type(overwrite) is str:
|
|
return get_icon_char(overwrite)
|
|
|
|
result_icon = "alert-circle-outline"
|
|
if ha_type == "script":
|
|
result_icon = "script-text"
|
|
elif ha_type == "alarm-arm-fail":
|
|
result_icon = "progress-alert"
|
|
|
|
return get_icon_char(result_icon)
|
|
|
|
def get_action_icon(ha_type, action, device_class=None, overwrite=None):
|
|
if overwrite is not None:
|
|
return get_icon_char(overwrite)
|
|
if ha_type == "cover":
|
|
if action == "open":
|
|
actionicon = cover_mapping[device_class][2] if device_class in cover_mapping else "alert-circle-outline"
|
|
elif action == "close":
|
|
actionicon = cover_mapping[device_class][4] if device_class in cover_mapping else "alert-circle-outline"
|
|
elif action == "stop":
|
|
actionicon = cover_mapping[device_class][3] if device_class in cover_mapping else "alert-circle-outline"
|
|
else:
|
|
actionicon = "alert-circle-outline"
|
|
else:
|
|
actionicon = "alert-circle-outline"
|
|
return get_icon_char(actionicon)
|
|
|
|
def get_icon_ha(entity_id, overwrite=None, stateOverwrite=None):
|
|
|
|
ha_type = entity_id.split(".")[0]
|
|
if (apis.ha_api.entity_exists(entity_id)):
|
|
entity = apis.ha_api.get_entity(entity_id)
|
|
state = entity.state if stateOverwrite is None else stateOverwrite
|
|
|
|
if entity_id in ["sensor.weather_forecast_daily", "sensor.weather_forecast_hourly"]:
|
|
ha_type = "weather"
|
|
|
|
if overwrite is not None:
|
|
if type(overwrite) is str:
|
|
return get_icon_char(overwrite)
|
|
if type(overwrite) is dict:
|
|
for overwrite_state, overwrite_icon in overwrite.items():
|
|
if overwrite_state == state:
|
|
return get_icon_char(overwrite_icon)
|
|
|
|
result_icon = "alert-circle-outline"
|
|
|
|
# icons only based on state
|
|
if ha_type in simple_type_mapping:
|
|
result_icon = simple_type_mapping[ha_type]
|
|
elif ha_type == "weather":
|
|
result_icon = weather_mapping[state] if state in weather_mapping else "alert-circle-outline"
|
|
elif ha_type == "input_boolean":
|
|
result_icon = "check-circle-outline" if state == "on" else "close-circle-outline"
|
|
elif ha_type == "lock":
|
|
result_icon = "lock-open" if state == "unlocked" else "lock"
|
|
elif ha_type == "sun":
|
|
result_icon = "weather-sunset-up" if state == "above_horizon" else "weather-sunset-down"
|
|
elif ha_type == "alarm_control_panel":
|
|
if state in alarm_control_panel_mapping:
|
|
result_icon = alarm_control_panel_mapping[state]
|
|
elif ha_type == "climate":
|
|
if state in climate_mapping:
|
|
result_icon = climate_mapping[state]
|
|
# icons only based on state and device_class
|
|
elif ha_type == "cover":
|
|
device_class = get_attr_safe(entity, "device_class", "window")
|
|
if state == "closed":
|
|
result_icon = cover_mapping[device_class][1] if device_class in cover_mapping else "alert-circle-outline"
|
|
else:
|
|
result_icon = cover_mapping[device_class][0] if device_class in cover_mapping else "alert-circle-outline"
|
|
elif ha_type == "sensor":
|
|
device_class = get_attr_safe(entity, "device_class", "")
|
|
result_icon = sensor_mapping[device_class] if device_class in sensor_mapping else "alert-circle-outline"
|
|
elif ha_type == "binary_sensor":
|
|
device_class = get_attr_safe(entity, "device_class", "")
|
|
if state == "on":
|
|
result_icon = "checkbox-marked-circle"
|
|
if device_class in sensor_mapping_on:
|
|
result_icon = sensor_mapping_on[device_class]
|
|
else:
|
|
result_icon = "radiobox-blank"
|
|
if device_class in sensor_mapping_off:
|
|
result_icon = sensor_mapping_off[device_class]
|
|
# based on media_content_type
|
|
elif ha_type == "media_player":
|
|
result_icon = "speaker-off"
|
|
if "media_content_type" in entity.attributes:
|
|
if entity.attributes.media_content_type in media_content_type_mapping:
|
|
result_icon = media_content_type_mapping[entity.attributes.media_content_type]
|
|
|
|
return get_icon_char(result_icon)
|