Intégration Urban Solar

Bonjour,

Je suis tout nouveau propriétaire d'une centrale photovoltaïque (avec passerelle Enphase) et je viens de souscrire à la batterie virtuelle Urban Solar Energie. Je voudrais faire apparaître dans mon dashboard energy la partie batterie virtuelle. J'ai donc trouvé l'intégration de @chourmovs_vs mais je n'arrive pas à la paramétrer correctement.
Pouvez-vous m'aider ?
J'ai installé l'intégration :


Mais j'ai cette erreur :

Et je ne vois pas les sensors qui devraient être créés automatiquement.
J'ai bien redémarré HA mais rien n'y fait.
J'ai tenté de créer une nouvelle carte avec le code donné :

Où me suis je planté?

Merci pour votre aide

Bonjour,

L'erreur 500 au moment d'ajouter l'intégration, c'est le vrai blocage : tant que le flux de configuration plante, aucun fichier urban_.yaml n'est généré et donc aucune entité input_number.urban_ n'existe. Les cartes que tu as collées plantent pour cette raison, ce n'est pas un souci de Lovelace.

Deux points à vérifier avant de réessayer Paramètres > Appareils et services > Ajouter > UrbanSolar Battery :

  1. Les deux capteurs demandés (puissance totale consommée et puissance solaire produite) doivent être en kW, pas en W. Avec Enphase, beaucoup de capteurs sont en W : si c'est ton cas, crée d'abord un template qui divise par 1000, sinon le flux plante souvent.

  2. Regarde dans Paramètres > Système > Journaux la traceback au moment du 500 (filtre sur urbansolar ou ha_urbansolar) et colle-la ici. Ça dira si c'est un conflit d'include YAML ou autre chose.

Ensuite seulement, dans configuration.yaml, ajoute les includes. Si tu as déjà automation: ou sensor: ailleurs, utilise un préfixe, par exemple :

input_number: !include urban_input_numbers.yaml
sensor urban: !include urban_integrations.yaml
template: !include urban_sensors.yaml
utility_meter: !include urban_utility_meters.yaml
automation urban: !include urban_automations.yaml

puis redémarre. Tant que le config flow n'a pas réussi, ces fichiers n'existent pas encore, inutile de coller le dashboard avant.

Tu as déjà des capteurs Enphase de puissance en kW, ou seulement en W ?

Bonjour,

J'utilise des capteurs en kW :

Je ne vois rien dans les journaux, voici celui du Core :

Je croyais que l'intégration devait tout créé et qu'on n'avait pas besoin de toucher au configuration.yaml ?

Il y a un problème dans le code de l'intégration au niveau du fichier config_flow.py, voici la bonne version :

import voluptuous as vol
from homeassistant import config_entries
from homeassistant.core import callback
from homeassistant.helpers.selector import selector
from homeassistant.const import UnitOfEnergy, UnitOfPower

from .const import (
    DOMAIN,
    CONF_SOLAR_POWER_SENSOR,
    CONF_TOTAL_POWER_CONSO_SENSOR,
)


class VirtualBatteryConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    """Config flow for UrbanSolar Virtual Battery."""
    VERSION = 1

    async def async_step_user(self, user_input=None):
        """Handle user input."""
        errors = {}

        if user_input is not None:
            power = user_input[CONF_SOLAR_POWER_SENSOR]
            powercons = user_input[CONF_TOTAL_POWER_CONSO_SENSOR]

            power_state = self.hass.states.get(power)
            powercons_state = self.hass.states.get(powercons)

            if not power_state or power_state.attributes.get("unit_of_measurement") != UnitOfPower.KILO_WATT:
                errors[CONF_SOLAR_POWER_SENSOR] = "invalid_unit"

            if not powercons_state or powercons_state.attributes.get("unit_of_measurement") != UnitOfPower.KILO_WATT:
                errors[CONF_TOTAL_POWER_CONSO_SENSOR] = "invalid_unit"

            self._log("Validation errors:", errors)

            if not errors:
                entry = self.async_create_entry(
                    title="UrbanSolar Battery",
                    data=user_input
                )

                for entity_id in [
                    "input_number.urban_energie_battery_out_hourly",
                    "input_number.urban_energie_battery_in_hourly",
                ]:
                    await self.hass.services.async_call(
                        "input_number",
                        "set_value",
                        {
                            "entity_id": entity_id,
                            "value": 0,
                        },
                        blocking=True,
                    )

                return entry

        return self.async_show_form(
            step_id="user",
            data_schema=vol.Schema({
                vol.Required(CONF_SOLAR_POWER_SENSOR): selector({
                    "entity": {
                        "domain": "sensor",
                        "device_class": "power"
                    }
                }),
                vol.Required(CONF_TOTAL_POWER_CONSO_SENSOR): selector({
                    "entity": {
                        "domain": "sensor"
                    }
                }),
            }),
            errors=errors
        )

    @staticmethod
    @callback
    def async_get_options_flow(config_entry):
        """Return the options flow."""
        return VirtualBatteryOptionsFlowHandler()

    @staticmethod
    def _log(message, *args):
        """Simple logger."""
        print(f"[VirtualBatteryConfigFlow] {message} {args}")


class VirtualBatteryOptionsFlowHandler(config_entries.OptionsFlow):
    """Options flow for UrbanSolar Virtual Battery."""

    async def async_step_init(self, user_input=None):
        """Handle the options form."""
        if user_input is not None:
            self._log("Options flow user input:", user_input)
            return self.async_create_entry(title="", data=user_input)

        current_config = self.config_entry.data
        self._log("Current config:", current_config)

        return self.async_show_form(
            step_id="init",
            data_schema=vol.Schema({
                vol.Required(
                    CONF_SOLAR_POWER_SENSOR,
                    default=current_config.get(CONF_SOLAR_POWER_SENSOR, "")
                ): selector({
                    "entity": {
                        "domain": "sensor",
                        "device_class": "power"
                    }
                }),
                vol.Required(
                    CONF_TOTAL_POWER_CONSO_SENSOR,
                    default=current_config.get(CONF_TOTAL_POWER_CONSO_SENSOR, "")
                ): selector({
                    "entity": {
                        "domain": "sensor",
                        "device_class": "power"
                    }
                }),
            })
        )

    def _log(self, message, *args):
        """Simple logger."""
        print(f"[VirtualBatteryOptionsFlowHandler] {message} {args}")

J'ai maintenant cela :


Je ne comprends pas comment cela fonctionne avec la batterie virtuelle. Les chiffres n'ont pas l'air d'être réels...
Et il me manque toujours des éléments...

Quelqu'un peut il m'aider ? Si quelqu'un est sur du matériel Enphase pour que je compare les capteurs? Et pour la batterie virtuelle je suis chez Urban Solar donc si quelqu'un utilise aussi ce fournisseur je veux bien des infos sur comment gérer le stockage de la batterie virtuelle.
Merci