Skip to content

Commit

Permalink
V.1.5
Browse files Browse the repository at this point in the history
  • Loading branch information
chrispazz committed Sep 24, 2024
1 parent a79153c commit 12dd199
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 97 deletions.
97 changes: 28 additions & 69 deletions custom_components/light_pairing/config_flow.py
Original file line number Diff line number Diff line change
@@ -1,89 +1,48 @@
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.core import callback
import voluptuous as vol
from homeassistant.helpers.selector import selector
from .const import DOMAIN

# Parametri di configurazione
CONF_BRIGHTNESS_ON_SWITCH = "brightness_on_switch"
CONF_TURN_OFF_PHYSICAL = "turn_off_physical"
CONF_PHYSICAL_LIGHT = "physical_light"
CONF_SMART_LIGHT = "smart_light"

class LightPairingConfigFlow(config_entries.ConfigFlow, domain="light_pairing"):
"""Gestisce il flusso di configurazione per il pairing delle luci."""

class LightPairConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 1

async def async_step_user(self, user_input=None):
"""Gestisce lo step iniziale."""
errors = {}

"""Gestisce il flusso di configurazione iniziale."""
if user_input is not None:
# Gestisce i dati inseriti dall'utente
return self.async_create_entry(title=user_input["name"], data=user_input)

schema = vol.Schema({
vol.Required("name"): str,
vol.Required(CONF_PHYSICAL_LIGHT): selector({
"entity": {"domain": "light"}
}),
vol.Required(CONF_SMART_LIGHT): selector({
"entity": {"domain": "light"}
}),
vol.Optional(CONF_BRIGHTNESS_ON_SWITCH, default=100): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)),
vol.Optional(CONF_TURN_OFF_PHYSICAL, default=False): bool
})

return self.async_show_form(
step_id="user",
data_schema=schema,
errors=errors
data_schema=vol.Schema({
vol.Required("physical_light"): selector({"entity": {"domain": ["switch", "light"]}}),
vol.Required("smart_light"): selector({"entity": {"domain": "light"}}),
vol.Required("name"): str,
vol.Optional("brightness_on_switch", default=80): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)),
vol.Optional("turn_off_physical", default=True): bool
})
)

@staticmethod
@callback
def async_get_options_flow(config_entry):
"""Ritorna il flusso di opzioni per la riconfigurazione."""
return LightPairingOptionsFlowHandler(config_entry)


class LightPairingOptionsFlowHandler(config_entries.OptionsFlow):
"""Gestisce il flusso di opzioni per riconfigurare i parametri."""

def __init__(self, config_entry):
"""Inizializza il flusso di opzioni."""
self.config_entry = config_entry

async def async_step_init(self, user_input=None):
"""Inizia il flusso di riconfigurazione."""
return await self.async_step_reconfigure()

async def async_step_reconfigure(self, user_input=None):
"""Gestisce la riconfigurazione dei parametri."""
"""Gestisce il flusso di riconfigurazione."""
if user_input is not None:
# Aggiorna i parametri nel config entry
self.hass.config_entries.async_update_entry(
self.config_entry,
options={**self.config_entry.options, **user_input}
)
return self.async_create_entry(title="", data=None)

# Preleva i parametri attuali dalle opzioni o dai dati di configurazione iniziale
current_brightness_on_switch = self.config_entry.options.get(
CONF_BRIGHTNESS_ON_SWITCH,
self.config_entry.data.get(CONF_BRIGHTNESS_ON_SWITCH, 100)
)
current_turn_off_physical = self.config_entry.options.get(
CONF_TURN_OFF_PHYSICAL,
self.config_entry.data.get(CONF_TURN_OFF_PHYSICAL, False)
)
# Aggiorna la configurazione esistente con i nuovi valori
return self.async_create_entry(title=user_input["name"], data=user_input)

# Schema per riconfigurare i due parametri
schema = vol.Schema({
vol.Optional(CONF_BRIGHTNESS_ON_SWITCH, default=current_brightness_on_switch): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)),
vol.Optional(CONF_TURN_OFF_PHYSICAL, default=current_turn_off_physical): bool
})
current_config = self._get_current_config()

return self.async_show_form(
step_id="reconfigure",
data_schema=schema
data_schema=vol.Schema({
vol.Required("physical_light", default=current_config.get("physical_light")): selector({"entity": {"domain": ["switch", "light"]}}),
vol.Required("smart_light", default=current_config.get("smart_light")): selector({"entity": {"domain": "light"}}),
vol.Required("name", default=current_config.get("name")): str,
vol.Optional("brightness_on_switch", default=current_config.get("brightness_on_switch", 100)): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)),
vol.Optional("turn_off_physical", default=current_config.get("turn_off_physical", True)): bool
})
)

def _get_current_config(self):
"""Ottiene la configurazione attuale per l'entità da modificare."""
entry = self.hass.config_entries.async_get_entry(self.context["entry_id"])
return entry.data if entry else {}
43 changes: 36 additions & 7 deletions custom_components/light_pairing/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def __init__(self, hass, physical_light, smart_light, name, entry_id, brightness
self._entry_id = entry_id
self._brightness_on_switch = brightness_on_switch
self._turn_off_physical = turn_off_physical
self._config_entry = config_entry # Mantiene un riferimento al config_entry per futuri aggiornamenti
self._config_entry = config_entry # Mantiene un riferimento al config_entry per aggiornamenti futuri
self._state = None
self._brightness = None
self._xy_color = None
Expand Down Expand Up @@ -137,11 +137,26 @@ async def async_turn_on(self, **kwargs):

physical_state = self.hass.states.get(self._physical_light).state

if physical_state == STATE_OFF:
# Accendi la luce fisica
await self.hass.services.async_call("light", "turn_on", {
"entity_id": self._physical_light
})
# Se il flag per spegnere la luce fisica è attivo, aggiorna immediatamente lo stato virtuale a "acceso"
if self._turn_off_physical:
if physical_state == STATE_OFF:
# Accendi la luce fisica
await self.hass.services.async_call("light", "turn_on", {
"entity_id": self._physical_light
})

# Imposta immediatamente lo stato della luce virtuale su "acceso"
self._state = STATE_ON
self.async_write_ha_state()
else:
# Se il flag non è attivo, controlla lo stato della luce smart
smart_state = self.hass.states.get(self._smart_light)
if smart_state and smart_state.state == STATE_ON:
self._state = STATE_ON
else:
self._state = STATE_OFF

self.async_write_ha_state()

# Attendere che la luce smart diventi disponibile prima di applicare la luminosità
await self._wait_for_smart_light_available()
Expand All @@ -155,6 +170,7 @@ async def async_turn_on(self, **kwargs):
else:
await self.hass.services.async_call("light", "turn_on", {"entity_id": self._smart_light})

# Imposta lo stato su acceso una volta completata l'operazione
self._state = STATE_ON
self.async_write_ha_state()

Expand All @@ -177,8 +193,18 @@ async def _wait_for_smart_light_available(self):
await self.hass.services.async_call("light", "turn_off", {
"entity_id": self._physical_light
})
self._state = STATE_OFF # Aggiorna lo stato della luce virtuale
self.async_write_ha_state() # Scrivi lo stato
return # Spegni subito la luce e interrompi l'attesa

# Una volta che la luce smart è disponibile, aggiorna lo stato
if smart_state and smart_state.state == STATE_ON:
self._state = STATE_ON
else:
self._state = STATE_OFF

self.async_write_ha_state()

async def async_turn_off(self, **kwargs):
"""Spegne la luce."""
self._update_parameters_from_config()
Expand All @@ -193,7 +219,7 @@ async def async_turn_off(self, **kwargs):
# Interrompi l'attesa per la luce smart, se attiva
self._waiting_for_smart_light = False

self._state = STATE_OFF
self._state = STATE_OFF # Aggiorna lo stato della luce virtuale
self.async_write_ha_state()

async def async_update(self):
Expand All @@ -209,6 +235,9 @@ async def async_update(self):
self._color_mode = smart_state.attributes.get(ATTR_COLOR_MODE)
self._supported_color_modes = smart_state.attributes.get(ATTR_SUPPORTED_COLOR_MODES) or ['color_temp', 'xy']
self._supported_features = smart_state.attributes.get('supported_features', SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP | SUPPORT_COLOR)
elif physical_state.state == STATE_ON and self._turn_off_physical:
# Mantieni lo stato acceso se la luce fisica è accesa e il flag è attivo
self._state = STATE_ON
else:
self._state = STATE_OFF

Expand Down
2 changes: 1 addition & 1 deletion custom_components/light_pairing/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"requirements": [],
"codeowners": ["@chrispazz"],
"iot_class": "local_polling",
"version": "1.4",
"version": "1.5",
"config_flow": true
}

32 changes: 22 additions & 10 deletions custom_components/light_pairing/translations/en.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
{
"config": {
"step": {
"user": {
"title": "Setup a new entity pair",
"data": {
"physical_light": "Select your phisical light entity (switch or light)",
"smart_light": "Select your smart light (light)",
"name": "New Light name"
}
}
"config": {
"step": {
"user": {
"title": "Configure a new light pair",
"data": {
"physical_light": "Select the physical light (switch or light)",
"smart_light": "Select the smart light (light)",
"name": "New light name",
"brightness_on_switch": "Brightness percentage when physical switch is turned on (0-100)",
"turn_off_physical": "Turn off physical switch when virtual light is turned off (yes or no)"
}
},
"reconfigure": {
"title": "Reconfigure light pair",
"data": {
"physical_light": "Select the physical light (switch or light)",
"smart_light": "Select the smart light (light)",
"name": "Light name",
"brightness_on_switch": "Brightness percentage when physical switch is turned on (0-100)",
"turn_off_physical": "Turn off physical switch when virtual light is turned off (yes or no)"
}
}
}
}
}
32 changes: 22 additions & 10 deletions custom_components/light_pairing/translations/it.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
{
"config": {
"step": {
"user": {
"title": "Configura l'abbinamento delle luci",
"data": {
"physical_light": "Seleziona la luce o interruttore fisico",
"smart_light": "Seleziona la luce smart",
"name": "Nome della nuova luce"
}
}
"config": {
"step": {
"user": {
"title": "Configura una nuova coppia di luci",
"data": {
"physical_light": "Seleziona la luce fisica (interruttore o luce)",
"smart_light": "Seleziona la luce smart (luce)",
"name": "Nome della nuova luce",
"brightness_on_switch": "Percentuale di luminosità quando l'interruttore fisico è acceso (0-100)",
"turn_off_physical": "Spegni l'interruttore fisico quando la luce virtuale viene spenta (sì o no)"
}
},
"reconfigure": {
"title": "Riconfigura la coppia di luci",
"data": {
"physical_light": "Seleziona la luce fisica (interruttore o luce)",
"smart_light": "Seleziona la luce smart (luce)",
"name": "Nome della luce",
"brightness_on_switch": "Percentuale di luminosità quando l'interruttore fisico è acceso (0-100)",
"turn_off_physical": "Spegni l'interruttore fisico quando la luce virtuale viene spenta (sì o no)"
}
}
}
}
}

0 comments on commit 12dd199

Please sign in to comment.