Lines 100.00% 2 / 2
Methods 100.00% 2 / 2
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 listKindsForDomain 100.00% 1 / 1 100.00% 1 / 1 1
 findKind 100.00% 1 / 1 100.00% 1 / 1 1
7final readonly class AttributeCatalog
8{
9    private const array COMMON = [
10        'assumed_state' => AttributeKind::Bool,
11        'attribution' => AttributeKind::String,
12        'device_class' => AttributeKind::String,
13        'entity_picture' => AttributeKind::String,
14        'icon' => AttributeKind::String,
15        'state_class' => AttributeKind::String,
16        'supported_features' => AttributeKind::Float,
17        'unit_of_measurement' => AttributeKind::String,
18    ];
19
20    private const array BY_DOMAIN = [
21        'alarm_control_panel' => [
22            'changed_by' => AttributeKind::String,
23            'code_arm_required' => AttributeKind::Bool,
24            'code_format' => AttributeKind::String,
25        ],
26        'automation' => [
27            'current' => AttributeKind::Float,
28            'id' => AttributeKind::String,
29            'last_triggered' => AttributeKind::String,
30            'max' => AttributeKind::Float,
31            'mode' => AttributeKind::String,
32        ],
33        'calendar' => [
34            'all_day' => AttributeKind::Bool,
35            'description' => AttributeKind::String,
36            'end_time' => AttributeKind::String,
37            'location' => AttributeKind::String,
38            'message' => AttributeKind::String,
39            'start_time' => AttributeKind::String,
40        ],
41        'camera' => [
42            'access_token' => AttributeKind::String,
43            'frontend_stream_type' => AttributeKind::String,
44        ],
45        'climate' => [
46            'current_humidity' => AttributeKind::Float,
47            'current_temperature' => AttributeKind::Float,
48            'fan_mode' => AttributeKind::String,
49            'fan_modes' => AttributeKind::Array,
50            'humidity' => AttributeKind::Float,
51            'hvac_action' => AttributeKind::String,
52            'hvac_modes' => AttributeKind::Array,
53            'max_humidity' => AttributeKind::Float,
54            'max_temp' => AttributeKind::Float,
55            'min_humidity' => AttributeKind::Float,
56            'min_temp' => AttributeKind::Float,
57            'preset_mode' => AttributeKind::String,
58            'preset_modes' => AttributeKind::Array,
59            'swing_horizontal_mode' => AttributeKind::String,
60            'swing_horizontal_modes' => AttributeKind::Array,
61            'swing_mode' => AttributeKind::String,
62            'swing_modes' => AttributeKind::Array,
63            'target_temp_high' => AttributeKind::Float,
64            'target_temp_low' => AttributeKind::Float,
65            'target_temp_step' => AttributeKind::Float,
66            'temperature' => AttributeKind::Float,
67        ],
68        'counter' => [
69            'editable' => AttributeKind::Bool,
70            'initial' => AttributeKind::Float,
71            'maximum' => AttributeKind::Float,
72            'minimum' => AttributeKind::Float,
73            'step' => AttributeKind::Float,
74        ],
75        'cover' => [
76            'current_position' => AttributeKind::Float,
77            'current_tilt_position' => AttributeKind::Float,
78        ],
79        'device_tracker' => [
80            'altitude' => AttributeKind::Float,
81            'battery_level' => AttributeKind::Float,
82            'gps_accuracy' => AttributeKind::Float,
83            'host_name' => AttributeKind::String,
84            'ip' => AttributeKind::String,
85            'latitude' => AttributeKind::Float,
86            'longitude' => AttributeKind::Float,
87            'mac' => AttributeKind::String,
88            'source_type' => AttributeKind::String,
89        ],
90        'event' => [
91            'event_type' => AttributeKind::String,
92            'event_types' => AttributeKind::Array,
93        ],
94        'fan' => [
95            'direction' => AttributeKind::String,
96            'oscillating' => AttributeKind::Bool,
97            'percentage' => AttributeKind::Float,
98            'percentage_step' => AttributeKind::Float,
99            'preset_mode' => AttributeKind::String,
100            'preset_modes' => AttributeKind::Array,
101        ],
102        'humidifier' => [
103            'action' => AttributeKind::String,
104            'available_modes' => AttributeKind::Array,
105            'current_humidity' => AttributeKind::Float,
106            'humidity' => AttributeKind::Float,
107            'max_humidity' => AttributeKind::Float,
108            'min_humidity' => AttributeKind::Float,
109            'mode' => AttributeKind::String,
110        ],
111        'image' => [
112            'access_token' => AttributeKind::String,
113        ],
114        'input_boolean' => [
115            'editable' => AttributeKind::Bool,
116        ],
117        'input_button' => [
118            'editable' => AttributeKind::Bool,
119        ],
120        'input_datetime' => [
121            'day' => AttributeKind::Float,
122            'editable' => AttributeKind::Bool,
123            'has_date' => AttributeKind::Bool,
124            'has_time' => AttributeKind::Bool,
125            'hour' => AttributeKind::Float,
126            'minute' => AttributeKind::Float,
127            'month' => AttributeKind::Float,
128            'second' => AttributeKind::Float,
129            'timestamp' => AttributeKind::Float,
130            'year' => AttributeKind::Float,
131        ],
132        'input_number' => [
133            'editable' => AttributeKind::Bool,
134            'initial' => AttributeKind::Float,
135            'max' => AttributeKind::Float,
136            'min' => AttributeKind::Float,
137            'mode' => AttributeKind::String,
138            'step' => AttributeKind::Float,
139        ],
140        'input_select' => [
141            'editable' => AttributeKind::Bool,
142            'options' => AttributeKind::Array,
143        ],
144        'input_text' => [
145            'editable' => AttributeKind::Bool,
146            'max' => AttributeKind::Float,
147            'min' => AttributeKind::Float,
148            'mode' => AttributeKind::String,
149            'pattern' => AttributeKind::String,
150        ],
151        'light' => [
152            'brightness' => AttributeKind::Float,
153            'color_mode' => AttributeKind::String,
154            'color_temp_kelvin' => AttributeKind::Float,
155            'effect' => AttributeKind::String,
156            'effect_list' => AttributeKind::Array,
157            'hs_color' => AttributeKind::Array,
158            'max_color_temp_kelvin' => AttributeKind::Float,
159            'min_color_temp_kelvin' => AttributeKind::Float,
160            'rgb_color' => AttributeKind::Array,
161            'rgbw_color' => AttributeKind::Array,
162            'rgbww_color' => AttributeKind::Array,
163            'supported_color_modes' => AttributeKind::Array,
164            'xy_color' => AttributeKind::Array,
165        ],
166        'lock' => [
167            'changed_by' => AttributeKind::String,
168            'code_format' => AttributeKind::String,
169        ],
170        'media_player' => [
171            'app_id' => AttributeKind::String,
172            'app_name' => AttributeKind::String,
173            'entity_picture' => AttributeKind::String,
174            'group_members' => AttributeKind::Array,
175            'is_volume_muted' => AttributeKind::Bool,
176            'media_album_artist' => AttributeKind::String,
177            'media_album_name' => AttributeKind::String,
178            'media_artist' => AttributeKind::String,
179            'media_channel' => AttributeKind::String,
180            'media_content_id' => AttributeKind::String,
181            'media_content_type' => AttributeKind::String,
182            'media_duration' => AttributeKind::Float,
183            'media_episode' => AttributeKind::String,
184            'media_playlist' => AttributeKind::String,
185            'media_position' => AttributeKind::Float,
186            'media_position_updated_at' => AttributeKind::String,
187            'media_season' => AttributeKind::String,
188            'media_series_title' => AttributeKind::String,
189            'media_title' => AttributeKind::String,
190            'media_track' => AttributeKind::Float,
191            'repeat' => AttributeKind::String,
192            'shuffle' => AttributeKind::Bool,
193            'sound_mode' => AttributeKind::String,
194            'sound_mode_list' => AttributeKind::Array,
195            'source' => AttributeKind::String,
196            'source_list' => AttributeKind::Array,
197            'volume_level' => AttributeKind::Float,
198        ],
199        'number' => [
200            'max' => AttributeKind::Float,
201            'min' => AttributeKind::Float,
202            'mode' => AttributeKind::String,
203            'step' => AttributeKind::Float,
204        ],
205        'person' => [
206            'device_trackers' => AttributeKind::Array,
207            'gps_accuracy' => AttributeKind::Float,
208            'id' => AttributeKind::String,
209            'latitude' => AttributeKind::Float,
210            'longitude' => AttributeKind::Float,
211            'source' => AttributeKind::String,
212            'user_id' => AttributeKind::String,
213        ],
214        'remote' => [
215            'activity_list' => AttributeKind::Array,
216            'current_activity' => AttributeKind::String,
217        ],
218        'scene' => [
219            'entity_id' => AttributeKind::Array,
220            'id' => AttributeKind::String,
221        ],
222        'script' => [
223            'current' => AttributeKind::Float,
224            'last_triggered' => AttributeKind::String,
225            'max' => AttributeKind::Float,
226            'mode' => AttributeKind::String,
227        ],
228        'select' => [
229            'options' => AttributeKind::Array,
230        ],
231        'sensor' => [
232            'last_reset' => AttributeKind::String,
233            'options' => AttributeKind::Array,
234        ],
235        'siren' => [
236            'available_tones' => AttributeKind::Array,
237        ],
238        'sun' => [
239            'azimuth' => AttributeKind::Float,
240            'elevation' => AttributeKind::Float,
241            'next_dawn' => AttributeKind::String,
242            'next_dusk' => AttributeKind::String,
243            'next_midnight' => AttributeKind::String,
244            'next_noon' => AttributeKind::String,
245            'next_rising' => AttributeKind::String,
246            'next_setting' => AttributeKind::String,
247            'rising' => AttributeKind::Bool,
248        ],
249        'text' => [
250            'max' => AttributeKind::Float,
251            'min' => AttributeKind::Float,
252            'mode' => AttributeKind::String,
253            'pattern' => AttributeKind::String,
254        ],
255        'timer' => [
256            'duration' => AttributeKind::String,
257            'editable' => AttributeKind::Bool,
258            'finishes_at' => AttributeKind::String,
259            'remaining' => AttributeKind::String,
260            'restore' => AttributeKind::Bool,
261        ],
262        'update' => [
263            'auto_update' => AttributeKind::Bool,
264            'display_precision' => AttributeKind::Float,
265            'in_progress' => AttributeKind::Bool,
266            'installed_version' => AttributeKind::String,
267            'latest_version' => AttributeKind::String,
268            'release_summary' => AttributeKind::String,
269            'release_url' => AttributeKind::String,
270            'skipped_version' => AttributeKind::String,
271            'title' => AttributeKind::String,
272            'update_percentage' => AttributeKind::Float,
273        ],
274        'vacuum' => [
275            'battery_icon' => AttributeKind::String,
276            'battery_level' => AttributeKind::Float,
277            'fan_speed' => AttributeKind::String,
278            'fan_speed_list' => AttributeKind::Array,
279            'status' => AttributeKind::String,
280        ],
281        'valve' => [
282            'current_position' => AttributeKind::Float,
283        ],
284        'water_heater' => [
285            'away_mode' => AttributeKind::String,
286            'current_temperature' => AttributeKind::Float,
287            'max_temp' => AttributeKind::Float,
288            'min_temp' => AttributeKind::Float,
289            'operation_list' => AttributeKind::Array,
290            'operation_mode' => AttributeKind::String,
291            'target_temp_high' => AttributeKind::Float,
292            'target_temp_low' => AttributeKind::Float,
293            'temperature' => AttributeKind::Float,
294        ],
295        'weather' => [
296            'apparent_temperature' => AttributeKind::Float,
297            'cloud_coverage' => AttributeKind::Float,
298            'dew_point' => AttributeKind::Float,
299            'humidity' => AttributeKind::Float,
300            'ozone' => AttributeKind::Float,
301            'precipitation_unit' => AttributeKind::String,
302            'pressure' => AttributeKind::Float,
303            'pressure_unit' => AttributeKind::String,
304            'temperature' => AttributeKind::Float,
305            'temperature_unit' => AttributeKind::String,
306            'uv_index' => AttributeKind::Float,
307            'visibility' => AttributeKind::Float,
308            'visibility_unit' => AttributeKind::String,
309            'wind_bearing' => AttributeKind::Mixed,
310            'wind_gust_speed' => AttributeKind::Float,
311            'wind_speed' => AttributeKind::Float,
312            'wind_speed_unit' => AttributeKind::String,
313        ],
314        'zone' => [
315            'editable' => AttributeKind::Bool,
316            'latitude' => AttributeKind::Float,
317            'longitude' => AttributeKind::Float,
318            'passive' => AttributeKind::Bool,
319            'persons' => AttributeKind::Array,
320            'radius' => AttributeKind::Float,
321        ],
322    ];
323
324    /** @return array<string, AttributeKind> */
325    public function listKindsForDomain(string $domain): array
326    {
327        return self::BY_DOMAIN[$domain] ?? [];
328    }
329
330    public function findKind(string $domain, string $key): ?AttributeKind
331    {
332        return self::BY_DOMAIN[$domain][$key] ?? self::COMMON[$key] ?? null;
333    }
334}