- config flow: template (A/B/F с пояснениями, значения с устройства, определение по oem_model; для неизвестных моделей — пробинг A/B/F тремя короткими сессиями) -> capabilities (23 тумблера с описаниями, дефолты из device_capabilities/num_dir/ответов) -> limits (диапазон/шаг, ручная конверсия); каждая страница с пометкой «значения определены автоматически, можно пропустить» - features.py: FeatureSet/LiveValues/device_default/resolve_features; entry.data["features"] хранит выбор пользователя; reconfigure предзаполняет; YAML-import получает дефолты - сущности создаются только для включённых фич: climate (режимы/скорости/ swing/пресеты), switch, select заслонок (caps+num_dir), датчик комнаты; исправлено появление select без ламелей - trial: caps/num_dir и presence-зонды (необязательные свойства), answered; координатор ждёт первые свойства перед созданием сущностей (feature- дефолты без гонки) - атрибут description у сущностей (HA не поддерживает тултипы) + описания фич в мастере (en/ru) - тесты: features, probing, обновлённые flow/entities/repairs; 57 components
268 lines
9.5 KiB
JSON
268 lines
9.5 KiB
JSON
{
|
||
"config": {
|
||
"step": {
|
||
"user": {
|
||
"title": "FGLair",
|
||
"menu_options": {
|
||
"cloud": "Cloud sign-in (FGLair account)",
|
||
"manual": "Manual setup",
|
||
"import_json": "Import config_*.json"
|
||
}
|
||
},
|
||
"cloud": {
|
||
"title": "FGLair cloud sign-in",
|
||
"description": "Used once for provisioning: fetches the static LAN key of the device.",
|
||
"data": {
|
||
"email": "Email",
|
||
"password": "Password",
|
||
"region": "Region"
|
||
},
|
||
"data_description": {
|
||
"region": "FGLair/Ayla account region"
|
||
}
|
||
},
|
||
"cloud_device": {
|
||
"title": "Select air conditioner",
|
||
"data": {
|
||
"dsn": "Device"
|
||
}
|
||
},
|
||
"manual": {
|
||
"title": "Device parameters",
|
||
"data": {
|
||
"host": "Host (IP or DNS name)",
|
||
"device_port": "Device port",
|
||
"dsn": "DSN",
|
||
"lanip_key": "LAN IP key",
|
||
"lanip_key_id": "LAN IP key ID",
|
||
"name": "Name (optional)",
|
||
"model": "Model / oem_model (optional)"
|
||
},
|
||
"data_description": {
|
||
"device_port": "Default 80; change only for port-forwarding setups",
|
||
"lanip_key": "From cloud discovery or ESPHome diagnostics"
|
||
}
|
||
},
|
||
"import_json": {
|
||
"title": "Import config_*.json",
|
||
"data": {
|
||
"config_json": "config JSON"
|
||
},
|
||
"data_description": {
|
||
"config_json": "Paste a JSON object produced by fglair-discover or fglctl"
|
||
}
|
||
},
|
||
"template": {
|
||
"title": "Module template",
|
||
"description": "Read from the device:\n\n{device_values}\n\n{probe_note} The template defines the module's property table (names, types, conversions); actual features are tuned on the next step.\n\nIf unsure, keep the default.",
|
||
"data": {
|
||
"template": "Template"
|
||
},
|
||
"data_description": {
|
||
"template": "A — AP-WA/AP-WC/AP-WD modules: room temperature sensor, louver directions and swing, all flags. B — AP-WB modules: no room temperature sensor, no louver directions, 1.0 °C setpoint step. F — like A but for AP-WF modules (monitor1, filter_sign_reset)."
|
||
}
|
||
},
|
||
"capabilities": {
|
||
"title": "Device capabilities",
|
||
"description": "Toggles are pre-set from the device:\n\n{device_values}\n\nDisable what the device cannot do or what you do not want to expose. Entities are created only for enabled features.\n\nIf unsure, keep as is.",
|
||
"data": {
|
||
"mode_cool": "Cooling",
|
||
"mode_dry": "Dry",
|
||
"mode_fan": "Fan only",
|
||
"mode_heat": "Heating",
|
||
"mode_auto": "Automatic",
|
||
"fan_quiet": "Quiet fan",
|
||
"fan_low": "Low fan",
|
||
"fan_medium": "Medium fan",
|
||
"fan_high": "High fan",
|
||
"fan_auto": "Auto fan",
|
||
"swing_vertical": "Vertical swing",
|
||
"swing_horizontal": "Horizontal swing",
|
||
"economy_mode": "Economy",
|
||
"min_heat": "Minimum heat",
|
||
"indoor_fan_control": "Indoor fan control",
|
||
"powerful_mode": "Powerful",
|
||
"outdoor_low_noise": "Outdoor low noise",
|
||
"coil_dry_mode": "Coil dry",
|
||
"display_temperature": "Room temperature sensor",
|
||
"human_det_auto_save": "Human detection auto save",
|
||
"wifi_led_enable": "Wi-Fi LED",
|
||
"af_vertical_direction": "Vertical louver position",
|
||
"af_horizontal_direction": "Horizontal louver position"
|
||
},
|
||
"data_description": {
|
||
"mode_cool": "Cooling",
|
||
"mode_dry": "Dry",
|
||
"mode_fan": "Fan only",
|
||
"mode_heat": "Heating",
|
||
"mode_auto": "Automatic mode",
|
||
"fan_auto": "Auto fan speed",
|
||
"fan_quiet": "Quiet fan speed",
|
||
"fan_low": "Low fan speed",
|
||
"fan_medium": "Medium fan speed",
|
||
"fan_high": "High fan speed",
|
||
"swing_vertical": "Vertical louver swing",
|
||
"swing_horizontal": "Horizontal louver swing",
|
||
"economy_mode": "Economy mode",
|
||
"min_heat": "Minimum heat (keep +10 °C)",
|
||
"indoor_fan_control": "Indoor fan control while outdoor unit runs",
|
||
"powerful_mode": "Powerful mode",
|
||
"outdoor_low_noise": "Outdoor unit low noise",
|
||
"coil_dry_mode": "Coil dry",
|
||
"display_temperature": "Room temperature sensor",
|
||
"human_det_auto_save": "Human detection auto save",
|
||
"wifi_led_enable": "Wi-Fi LED indicator",
|
||
"af_vertical_direction": "Vertical louver position",
|
||
"af_horizontal_direction": "Horizontal louver position"
|
||
}
|
||
},
|
||
"limits": {
|
||
"title": "Setpoint (range and step)",
|
||
"description": "Range and step are auto-detected (A/F step 0.5 °C, B — 1.0). Optionally enable a custom linear conversion (API units are 0.1 °C).\n\nIf unsure, keep as is.",
|
||
"data": {
|
||
"temp_min": "Minimum setpoint (°C)",
|
||
"temp_max": "Maximum setpoint (°C)",
|
||
"temp_step": "Setpoint step (°C)",
|
||
"temp_num": "Conversion numerator",
|
||
"temp_den": "Conversion denominator",
|
||
"temp_offset": "Conversion offset (0.1 °C)"
|
||
},
|
||
"data_description": {
|
||
"temp_num": "display = raw × num / den + offset; raw is the protocol value (setpoint: 0.1 °C)",
|
||
"temp_den": "display = raw × num / den + offset",
|
||
"temp_offset": "display = raw × num / den + offset"
|
||
}
|
||
}
|
||
},
|
||
"error": {
|
||
"cannot_connect": "Could not connect to the device",
|
||
"no_slots": "Both LAN slots are busy (FGLair app or ESPHome connected). Close one and retry",
|
||
"key_mismatch": "LAN key does not match the device; re-run discovery or re-import the config",
|
||
"timeout": "Timed out waiting for the device to come online",
|
||
"invalid_auth": "Invalid email or password",
|
||
"invalid_import": "Invalid config JSON",
|
||
"no_devices": "No devices found in the account",
|
||
"unknown": "Unexpected error",
|
||
"properties_missing": "The device connected but did not report its base properties",
|
||
"invalid_range": "Minimum must be less than maximum"
|
||
},
|
||
"abort": {
|
||
"already_configured": "This device is already configured",
|
||
"invalid_import": "Invalid config JSON",
|
||
"cannot_connect": "Could not connect to the device",
|
||
"no_slots": "Both LAN slots are busy",
|
||
"key_mismatch": "LAN key does not match the device",
|
||
"timeout": "Timed out waiting for the device",
|
||
"properties_missing": "The device connected but did not report its base properties",
|
||
"unique_id_mismatch": "This is a different device (unique ID mismatch)",
|
||
"reconfigure_successful": "Reconfiguration successful"
|
||
}
|
||
},
|
||
"entity": {
|
||
"sensor": {
|
||
"room_temperature": {
|
||
"name": "Room temperature"
|
||
},
|
||
"error_code": {
|
||
"name": "Error code"
|
||
},
|
||
"connection_state": {
|
||
"name": "Connection state",
|
||
"state": {
|
||
"idle": "Idle",
|
||
"registering": "Registering",
|
||
"online": "Online",
|
||
"recovering": "Recovering",
|
||
"offline": "Offline",
|
||
"key_error": "Key error"
|
||
}
|
||
}
|
||
},
|
||
"binary_sensor": {
|
||
"connectivity": {
|
||
"name": "Connectivity"
|
||
},
|
||
"defrost": {
|
||
"name": "Defrost"
|
||
},
|
||
"maintenance": {
|
||
"name": "Maintenance"
|
||
},
|
||
"oil_recovery": {
|
||
"name": "Oil recovery"
|
||
},
|
||
"pump_down": {
|
||
"name": "Pump down"
|
||
},
|
||
"check_operation": {
|
||
"name": "Check operation"
|
||
},
|
||
"simultaneous": {
|
||
"name": "Simultaneous operation"
|
||
},
|
||
"different_modes": {
|
||
"name": "Freeze/oil/other modes (template B)"
|
||
}
|
||
},
|
||
"switch": {
|
||
"economy_mode": {
|
||
"name": "Economy"
|
||
},
|
||
"powerful_mode": {
|
||
"name": "Powerful"
|
||
},
|
||
"coil_dry_mode": {
|
||
"name": "Coil dry"
|
||
},
|
||
"min_heat": {
|
||
"name": "Minimum heat"
|
||
},
|
||
"outdoor_low_noise": {
|
||
"name": "Outdoor low noise"
|
||
},
|
||
"human_det_auto_save": {
|
||
"name": "Human detection auto save"
|
||
},
|
||
"wifi_led_enable": {
|
||
"name": "Wi-Fi LED"
|
||
},
|
||
"indoor_fan_control": {
|
||
"name": "Indoor fan control"
|
||
}
|
||
},
|
||
"select": {
|
||
"af_vertical_direction": {
|
||
"name": "Vertical airflow direction"
|
||
},
|
||
"af_horizontal_direction": {
|
||
"name": "Horizontal airflow direction"
|
||
}
|
||
}
|
||
},
|
||
"issues": {
|
||
"key_mismatch": {
|
||
"title": "FGLair: LAN key mismatch",
|
||
"description": "Device {device} ({host}) rejected the stored LAN key (key_id mismatch). Use Reconfigure on the integration card to fetch the current key (cloud sign-in) or paste a fresh config_*.json.",
|
||
"fix_flow": {
|
||
"step": {
|
||
"confirm": {
|
||
"title": "FGLair: LAN key mismatch",
|
||
"description": "Confirm to reload device {device} ({host}). If the key is still wrong, use Reconfigure on the integration card: sign in to the FGLair cloud to fetch the current key or paste a fresh config_*.json. This repair item disappears once the device comes online."
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"options": {
|
||
"step": {
|
||
"init": {
|
||
"title": "FGLair LAN key",
|
||
"description": "Full LAN key (for ESPHome secrets.yaml). Copy it, or paste a new one to replace the stored key. DSN: {dsn}; key ID: {lanip_key_id}; host: {host}. Saving a changed key reloads the device.",
|
||
"data": {
|
||
"lanip_key": "LAN IP key"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|