1 """Adds a simulated sensor."""
3 from __future__
import annotations
5 from datetime
import datetime
7 from random
import Random
9 import voluptuous
as vol
12 PLATFORM_SCHEMA
as SENSOR_PLATFORM_SCHEMA,
23 CONF_AMP =
"amplitude"
26 CONF_PERIOD =
"period"
30 CONF_RELATIVE_TO_EPOCH =
"relative_to_epoch"
35 DEFAULT_NAME =
"simulated"
39 DEFAULT_UNIT =
"value"
40 DEFAULT_RELATIVE_TO_EPOCH =
True
44 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
46 vol.Optional(CONF_AMP, default=DEFAULT_AMP): vol.Coerce(float),
47 vol.Optional(CONF_FWHM, default=DEFAULT_FWHM): vol.Coerce(float),
48 vol.Optional(CONF_MEAN, default=DEFAULT_MEAN): vol.Coerce(float),
49 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
50 vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int,
51 vol.Optional(CONF_PHASE, default=DEFAULT_PHASE): vol.Coerce(float),
52 vol.Optional(CONF_SEED, default=DEFAULT_SEED): cv.positive_int,
53 vol.Optional(CONF_UNIT, default=DEFAULT_UNIT): cv.string,
55 CONF_RELATIVE_TO_EPOCH, default=DEFAULT_RELATIVE_TO_EPOCH
64 async_add_entities: AddEntitiesCallback,
65 discovery_info: DiscoveryInfoType |
None =
None,
67 """Set up the simulated sensor."""
70 ir.async_create_issue(
74 breaks_in_ha_version=
"2025.1.0",
76 severity=ir.IssueSeverity.WARNING,
77 translation_key=
"simulated_deprecation",
78 translation_placeholders={
"integration": DOMAIN},
79 learn_more_url=
"https://www.home-assistant.io/integrations/simulated",
82 name = config.get(CONF_NAME)
83 unit = config.get(CONF_UNIT)
84 amp = config.get(CONF_AMP)
85 mean = config.get(CONF_MEAN)
86 period = config.get(CONF_PERIOD)
87 phase = config.get(CONF_PHASE)
88 fwhm = config.get(CONF_FWHM)
89 seed = config.get(CONF_SEED)
90 relative_to_epoch = config.get(CONF_RELATIVE_TO_EPOCH)
93 name, unit, amp, mean, period, phase, fwhm, seed, relative_to_epoch
99 """Class for simulated sensor."""
101 _attr_icon =
"mdi:chart-line"
104 self, name, unit, amp, mean, period, phase, fwhm, seed, relative_to_epoch
106 """Init the class."""
117 datetime(1970, 1, 1, tzinfo=dt_util.UTC)
119 else dt_util.utcnow()
125 """Return the time delta."""
127 dt1 = dt_util.utcnow()
131 """Calculate the signal."""
132 mean = self.
_mean_mean
134 time_delta = self.
time_deltatime_delta().total_seconds() * 1e6
135 period = self.
_period_period * 1e6
136 fwhm = self.
_fwhm_fwhm / 2
137 phase = math.radians(self.
_phase_phase)
141 periodic = amp * (math.sin((2 * math.pi * time_delta / period) + phase))
142 noise = self.
_random_random.gauss(mu=0, sigma=fwhm)
143 return round(mean + periodic + noise, 3)
146 """Update the sensor."""
151 """Return the name of the sensor."""
152 return self.
_name_name
156 """Return the state of the sensor."""
161 """Return the unit this state is expressed in."""
162 return self.
_unit_unit
166 """Return other details about the sensor state."""
168 "amplitude": self.
_amp_amp,
169 "mean": self.
_mean_mean,
171 "phase": self.
_phase_phase,
172 "spread": self.
_fwhm_fwhm,
173 "seed": self.
_seed_seed,
def __init__(self, name, unit, amp, mean, period, phase, fwhm, seed, relative_to_epoch)
def extra_state_attributes(self)
def native_unit_of_measurement(self)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
datetime_sys datetime(Any value)