1 """The Kitchen Sink integration contains demonstrations of various odds and ends.
3 This sets up a demo environment of features which are obscure or which represent
4 incorrect behavior, and are thus not wanted in the demo integration.
7 from __future__
import annotations
10 from random
import random
12 import voluptuous
as vol
17 async_add_external_statistics,
18 async_import_statistics,
29 DOMAIN =
"kitchen_sink"
32 COMPONENTS_WITH_DEMO_PLATFORM = [
43 CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
45 SCHEMA_SERVICE_TEST_SERVICE_1 = vol.Schema(
47 vol.Required(
"field_1"): vol.Coerce(int),
48 vol.Required(
"field_2"): vol.In([
"off",
"auto",
"cool"]),
49 vol.Optional(
"field_3"): vol.Coerce(int),
50 vol.Optional(
"field_4"): vol.In([
"forwards",
"reverse"]),
55 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
56 """Set up the demo environment."""
57 hass.async_create_task(
58 hass.config_entries.flow.async_init(
59 DOMAIN, context={
"source": SOURCE_IMPORT}, data={}
64 def service_handler(call: ServiceCall |
None =
None) ->
None:
67 hass.services.async_register(
68 DOMAIN,
"test_service_1", service_handler, SCHEMA_SERVICE_TEST_SERVICE_1
75 """Set the config entry up."""
77 await hass.config_entries.async_forward_entry_setups(
78 config_entry, COMPONENTS_WITH_DEMO_PLATFORM
85 if "recorder" in hass.config.components:
89 config_entry.async_start_reauth(hass)
95 """Create some issue registry issues."""
99 "transmogrifier_deprecated",
100 breaks_in_ha_version=
"2023.1.1",
102 learn_more_url=
"https://en.wiktionary.org/wiki/transmogrifier",
103 severity=IssueSeverity.WARNING,
104 translation_key=
"transmogrifier_deprecated",
110 "out_of_blinker_fluid",
111 breaks_in_ha_version=
"2023.1.1",
113 learn_more_url=
"https://www.youtube.com/watch?v=b9rntRxLlbU",
114 severity=IssueSeverity.CRITICAL,
115 translation_key=
"out_of_blinker_fluid",
123 learn_more_url=
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
124 severity=IssueSeverity.WARNING,
125 translation_key=
"unfixable_problem",
133 learn_more_url=
"https://www.youtube.com/watch?v=b9rntRxLlbU",
134 severity=IssueSeverity.CRITICAL,
135 translation_key=
"bad_psu",
143 severity=IssueSeverity.WARNING,
144 translation_key=
"cold_tea",
149 start: datetime.datetime, end: datetime.datetime, init_value: float, max_diff: float
150 ) -> list[StatisticData]:
151 statistics: list[StatisticData] = []
155 mean = mean + random() * max_diff - max_diff / 2
160 "min": mean - random() * max_diff,
161 "max": mean + random() * max_diff,
164 now = now + datetime.timedelta(hours=1)
171 metadata: StatisticMetaData,
172 start: datetime.datetime,
173 end: datetime.datetime,
176 statistics: list[StatisticData] = []
179 statistic_id = metadata[
"statistic_id"]
181 last_stats = await
get_instance(hass).async_add_executor_job(
182 get_last_statistics, hass, 1, statistic_id,
False, {
"sum"}
184 if statistic_id
in last_stats:
185 sum_ = last_stats[statistic_id][0][
"sum"]
or 0
187 sum_ = sum_ + random() * max_diff
194 now = now + datetime.timedelta(hours=1)
200 """Insert some fake statistics."""
202 yesterday = now - datetime.timedelta(days=1)
203 yesterday_midnight = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
204 today_midnight = yesterday_midnight + datetime.timedelta(days=1)
207 metadata: StatisticMetaData = {
209 "name":
"Outdoor temperature",
210 "statistic_id": f
"{DOMAIN}:temperature_outdoor",
211 "unit_of_measurement": UnitOfTemperature.CELSIUS,
222 "name":
"Energy consumption 1",
223 "statistic_id": f
"{DOMAIN}:energy_consumption_kwh",
224 "unit_of_measurement": UnitOfEnergy.KILO_WATT_HOUR,
234 "name":
"Energy consumption 2",
235 "statistic_id": f
"{DOMAIN}:energy_consumption_mwh",
236 "unit_of_measurement": UnitOfEnergy.MEGA_WATT_HOUR,
241 hass, metadata, yesterday_midnight, today_midnight, 0.001
248 "name":
"Gas consumption 1",
249 "statistic_id": f
"{DOMAIN}:gas_consumption_m3",
250 "unit_of_measurement": UnitOfVolume.CUBIC_METERS,
255 hass, metadata, yesterday_midnight, today_midnight, 0.5
262 "name":
"Gas consumption 2",
263 "statistic_id": f
"{DOMAIN}:gas_consumption_ft3",
264 "unit_of_measurement": UnitOfVolume.CUBIC_FEET,
273 "source": RECORDER_DOMAIN,
275 "statistic_id":
"sensor.statistics_issue_1",
276 "unit_of_measurement": UnitOfVolume.CUBIC_METERS,
285 "source": RECORDER_DOMAIN,
287 "statistic_id":
"sensor.statistics_issue_2",
288 "unit_of_measurement":
"cats",
297 "source": RECORDER_DOMAIN,
299 "statistic_id":
"sensor.statistics_issue_3",
300 "unit_of_measurement": UnitOfVolume.CUBIC_METERS,
309 "source": RECORDER_DOMAIN,
311 "statistic_id":
"sensor.statistics_issue_4",
312 "unit_of_measurement": UnitOfVolume.CUBIC_METERS,
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)
None _insert_statistics(HomeAssistant hass)
None _insert_sum_statistics(HomeAssistant hass, StatisticMetaData metadata, datetime.datetime start, datetime.datetime end, float max_diff)
list[StatisticData] _generate_mean_statistics(datetime.datetime start, datetime.datetime end, float init_value, float max_diff)
None _create_issues(HomeAssistant hass)
bool async_setup(HomeAssistant hass, ConfigType config)
None async_create_issue(HomeAssistant hass, str entry_id)
None async_import_statistics(HomeAssistant hass, StatisticMetaData metadata, Iterable[StatisticData] statistics)
None async_add_external_statistics(HomeAssistant hass, StatisticMetaData metadata, Iterable[StatisticData] statistics)
Recorder get_instance(HomeAssistant hass)