1 """Support for monitoring a GreenEye Monitor energy monitor."""
3 from __future__
import annotations
8 import voluptuous
as vol
14 CONF_TEMPERATURE_UNIT,
15 EVENT_HOMEASSISTANT_STOP,
26 CONF_COUNTED_QUANTITY,
27 CONF_COUNTED_QUANTITY_PER_PULSE,
33 CONF_TEMPERATURE_SENSORS,
36 DATA_GREENEYE_MONITOR,
38 TEMPERATURE_UNIT_CELSIUS,
41 _LOGGER = logging.getLogger(__name__)
43 TEMPERATURE_SENSOR_SCHEMA = vol.Schema(
44 {vol.Required(CONF_NUMBER): vol.Range(1, 8), vol.Required(CONF_NAME): cv.string}
47 TEMPERATURE_SENSORS_SCHEMA = vol.Schema(
49 vol.Required(CONF_TEMPERATURE_UNIT): cv.temperature_unit,
50 vol.Required(CONF_SENSORS): vol.All(
51 cv.ensure_list, [TEMPERATURE_SENSOR_SCHEMA]
56 VOLTAGE_SENSOR_SCHEMA = vol.Schema(
57 {vol.Required(CONF_NUMBER): vol.Range(1, 48), vol.Required(CONF_NAME): cv.string}
60 VOLTAGE_SENSORS_SCHEMA = vol.All(cv.ensure_list, [VOLTAGE_SENSOR_SCHEMA])
62 PULSE_COUNTER_SCHEMA = vol.Schema(
64 vol.Required(CONF_NUMBER): vol.Range(1, 4),
65 vol.Required(CONF_NAME): cv.string,
66 vol.Required(CONF_COUNTED_QUANTITY): cv.string,
67 vol.Optional(CONF_COUNTED_QUANTITY_PER_PULSE, default=1.0): vol.Coerce(float),
68 vol.Optional(CONF_TIME_UNIT, default=UnitOfTime.SECONDS): vol.Any(
69 UnitOfTime.SECONDS.value, UnitOfTime.MINUTES.value, UnitOfTime.HOURS.value
74 PULSE_COUNTERS_SCHEMA = vol.All(cv.ensure_list, [PULSE_COUNTER_SCHEMA])
76 CHANNEL_SCHEMA = vol.Schema(
78 vol.Required(CONF_NUMBER): vol.Range(1, 48),
79 vol.Required(CONF_NAME): cv.string,
80 vol.Optional(CONF_NET_METERING, default=
False): cv.boolean,
84 CHANNELS_SCHEMA = vol.All(cv.ensure_list, [CHANNEL_SCHEMA])
86 MONITOR_SCHEMA = vol.Schema(
88 vol.Required(CONF_SERIAL_NUMBER): vol.All(
94 "GEM serial number must be specified as an 8-character "
95 "string (including leading zeroes)."
100 vol.Optional(CONF_CHANNELS, default=[]): CHANNELS_SCHEMA,
102 CONF_TEMPERATURE_SENSORS,
103 default={CONF_TEMPERATURE_UNIT: TEMPERATURE_UNIT_CELSIUS, CONF_SENSORS: []},
104 ): TEMPERATURE_SENSORS_SCHEMA,
105 vol.Optional(CONF_PULSE_COUNTERS, default=[]): PULSE_COUNTERS_SCHEMA,
106 vol.Optional(CONF_VOLTAGE_SENSORS, default=[]): VOLTAGE_SENSORS_SCHEMA,
110 MONITORS_SCHEMA = vol.All(cv.ensure_list, [MONITOR_SCHEMA])
112 COMPONENT_SCHEMA = vol.Schema(
113 {vol.Required(CONF_PORT): cv.port, vol.Required(CONF_MONITORS): MONITORS_SCHEMA}
116 CONFIG_SCHEMA = vol.Schema({DOMAIN: COMPONENT_SCHEMA}, extra=vol.ALLOW_EXTRA)
119 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
120 """Set up the GreenEye Monitor component."""
121 monitors = greeneye.Monitors()
122 hass.data[DATA_GREENEYE_MONITOR] = monitors
124 server_config = config[DOMAIN]
125 await monitors.start_server(server_config[CONF_PORT])
127 async
def close_monitors(event: Event) ->
None:
128 """Close the Monitors object."""
129 await monitors.close()
131 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, close_monitors)
134 for monitor_config
in config[DOMAIN][CONF_MONITORS]:
135 num_sensors += len(monitor_config[CONF_CHANNELS])
136 num_sensors += len(monitor_config[CONF_PULSE_COUNTERS])
137 num_sensors += len(monitor_config[CONF_TEMPERATURE_SENSORS][CONF_SENSORS])
138 num_sensors += len(monitor_config[CONF_VOLTAGE_SENSORS])
142 "Configuration must specify at least one "
143 "channel, voltage, pulse counter or temperature sensor"
147 hass.async_create_task(
bool async_setup(HomeAssistant hass, ConfigType config)
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)