Sinope Thermostat Support

You just have to copy the icons in config/www.

community is for the lovelace cards

/local/heat-0.png is equal to config/www/heat-0.png for HA


Je n’ai pas réussi à trouver cette information.

Pour un thermostat sinopé à plancher zigbee - est-il nécessaire d’avoir un GT125 ou 130 afin de se connected à neviweb? Est-il possible d’utiliser un dongle zigbee USB (conbee) afin d’accéder à neviweb, en plus de HA?



pour connecter votre TH1300ZB à l’application neviweb il vous faut le GT130. le GT125 est uniquement pour les vieux appareil miwi de Sinopé.
Il y a deux façon de connecter votre thermostat.
1- via le GT130 vous allez le relier à Neviweb et par la suite vous installez le custom_component neviweb130 et il va relier vos appareils zigbee et wifi de Neviweb sur Home assistant
2- via un dongle usb comme le Conbee II et zha votre thermostat sera directement connecté à Home assistant mais pas à neviweb

Les appareils zigbee ne peuvent se connecter qu’à un seul réseau zigbee soit un dongle zigbee ou le GT130. Mais dans tous les cas ils seront relié à Home assistant si vous installez mes custom_components

Merci Claude!

Votre réponse m’éclaire!
J’hésites entre le modele wifi et zigbee, et il me semble pertinent de pouvoir accéder à neviweb.


Un thermostat wifi se connecte directement à Neviweb et il est supporté par le custom_component neviweb130.

l’avantage de se connecter à Neviweb c’est qu’on reçois automatiquement les mises a jour des firmwares alors que dans ZHA c’est pas encore disponible.

Par contre avec les wifi il faut s’assurer que ton router wifi supporte des connections à beaucoup d’appareils en même temps. Certain router ne peuvent avoir plus de 30 connection en même temps et j’ai vu quelques fois des appareils sinopé wifi qui se débranchent de neviweb et deviennent indisponibles. Dans ce cas il faut ajouter des bornes wifi pour répartir le trafique.

1 Like


Premièrement, merci beaucoup pour vos 2 HACS, j’ai des thermostats avec le GT125 et wifi et ils fonctionnent parfaitement.

Étant complètement novice dans HA, j’ai 2 questions qui peuvent paraître simple pour vous mais « pain in they ass » pour moi.

1- Comments je fais pour créer une automatisation qui va définir la température de mes thermostats? Maintenant que je suis passé sur HA, mon script sur Alexa ne fonctionne plus.

2- J’ai fait des Dashboard pour mes enfants, je veux qu’ils puissent voir la température comme ici :

Mais je ne veux pas que ce pop-up apparaissent quand ils cliquent dessus ou s’il apparaît, qu’ils ne puissent pas changer la température

Pouvez-vous m’aider?

Quick in English: How to setup an automation to set temperature and how on dashboard only show temperature.

Bonjour, vous voulez voir la température de chaque pièce seulement alors il suffit de créer des template sensor et de les afficher dans une carte lovelace

- template:
  - sensor:
      - name: "bureau_current_temperature"
        unit_of_measurement: '°C'
        device_class: temperature
        state_class: measurement
        state: >
          {% if state_attr('climate.neviweb130_climate_cave', 'current_temperature') < 1 %}
            {{ states('sensor.bureau_current_temperature') }}
          {% else %}
            {{ state_attr('climate.neviweb130_climate_cave', 'current_temperature') }}
          {% endif %}

Ca va vous donner la température de la pièce mais sans afficher les controles du thermostat.

1 Like

Hi @claudegel and community, I have recently upgraded to 2.6.1, and my thermostats TH1400WF (24V, Wifi) are not recognized properly, the state appears as “unavailable”. I looked at the recent commits, and I realize a big refactoring has been done recently, so I revert to 2.5.2 (latest tag before refactoring), and it works.
If I found the time, I try to dig a little more to provide more info or eventually find the problem… I am just reporting it here.
I also have TH1300WF that works with both 2.5.2 and 2.6.1. The problem is really on the TH1400WF…
Thx !

Thanks for reporting this. Effectively I’ve done a big reformating of the neviweb130 component. As I don’t have wifi devices to test them it is possible that I’ve missed something.
This is easy to find what is the problem. if you implement the logging with the following in configuration.yaml:

  default: warning
    homeassistant.custom_components: debug
    custom_components.neviweb130: debug

Then restart HA.
The log will tell what is the problem. Please search in your log for line containing this:
[custom_components.neviweb130.climate] Updating neviweb130 climate... name of your thermostat...
also check for line with unknown attribute or things like that. There is probably a misnamed attribute.
Check for line like

[homeassistant.components.climate] neviweb130: Error on device update!
File "/config/custom_components/neviweb130/", line 2840, in update self._load2 = device_data[ATTR_FLOOR_OUTPUT2]["status"] 
~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~^^^^^^^^^^ 
TypeError: 'int' object is not subscriptable

It will be easy to find out and fix the problem

It is possible that the offending attribute is ATTR_FLOOR_OUTPUT2. In that case you will find the error in your log and the fix is easy.
I’ve set a new branch to try to fix the TH1400WF

replace your file by the one in this branch. Make sure you are at 2.6.1 before and restart HA.
Let me know
I’ve found another attribute, ATTR_PUMP_PROTEC_DURATION, that can cause problem and I’ve added it to the above branche. Please test file on your system so we can fix it for everybody that have TH1400WF thermostat.

Hi @claudegel, thank you for you help.

I still have missing keys in device_data, so I did the following (patch file):

diff --git a/custom_components/neviweb130/ b/custom_components/neviweb130/
index 5a112d3..a49e57f 100644
--- a/custom_components/neviweb130/
+++ b/custom_components/neviweb130/
@@ -2598,8 +2598,10 @@ class Neviweb130LowWifiThermostat(Neviweb130Thermostat):
                     if device_data[ATTR_PUMP_PROTEC]["status"] == "on":
                         self._pump_protec_period = device_data[ATTR_PUMP_PROTEC]["frequency"]
                         self._pump_protec_duration = device_data[ATTR_PUMP_PROTEC]["duration"]
-                    self._pump_duration_value = device_data[ATTR_PUMP_PROTEC_DURATION]
-                    self._aux_heat = device_data[ATTR_FLOOR_AUX]
+                    if ATTR_PUMP_PROTEC_DURATION in device_data:
+                        self._pump_duration_value = device_data[ATTR_PUMP_PROTEC_DURATION]
+                    if ATTR_FLOOR_AUX in device_data:
+                        self._aux_heat = device_data[ATTR_FLOOR_AUX]
                     self._load2 = device_data[ATTR_FLOOR_OUTPUT2]
                 elif device_data["errorCode"] == "ReadTimeout":
                     _LOGGER.warning("A timeout occur during data update. Device %s do not respond. Check your network... (%s)", self._name, device_data)

But now, I realize some of the private members are not initialized and end up being None, apparently causing in issue when updating the extra_state_attributes data dictionary (, line 1610 and after…).
I currently have the issue with _code_thermal_overload, but I expect the same thing for others (basically keys that may be excluded from getting initialized because of an if statement, exactely as I did…). This is where my knowledge ends … I have no clue what could be a default value that would make sense for _code_thermal_overload or the other members…

So I am reverting to 2.5.2 again, I’ll check later if you got something.

Thanks again !

Could you post the line in your log containing
[custom_components.neviweb130.climate] Updating neviweb130 climate «name of your thermostat»
All attributes are listed there and this will allow us to fix the problem.
As for _code_thermal_overload and other they are set to None and this won’t affect extra_state_attributes. They are set to None as Sinopé did remove them temporarily.

As soon as I get your log line I’ll be able to fix

Hi @claudegel , finally I got the last piece missing:

diff --git a/custom_components/neviweb130/ b/custom_components/neviweb130/
index a49e57f..5b56355 100644
--- a/custom_components/neviweb130/
+++ b/custom_components/neviweb130/
@@ -2515,6 +2515,7 @@ class Neviweb130LowWifiThermostat(Neviweb130Thermostat):
         self._pump_duration_value = None
         self._code_reference_sensor = None
         self._code_compensation_sensor = None
+        self._code_thermal_overload = None
         self._code_air_sensor = None
         self._code_wire_sensor = None
         self._code_current_overload = None

It works now. No errors and all my thermostats are here.

Thx !

OK thank you. I’ll make the correction.
Can you send me the line in your log about the update of your device:
[custom_components.neviweb130.climate] Updating neviweb130 climate name of your TH1400WF...
This will help me to insure that we have all attributes correctly set

Sorry for the late reply. My heaters are hard to identify, I had the great idea to call them all “Chauffage”, just the room differentiate them… and the room is not a member of the neviweb data structure :wink:

here is what I got:

2024-02-08 19:18:23.703 DEBUG (SyncWorker_2) [custom_components.neviweb130.climate] Updating neviweb130 climate Chauffage (1.259 sec): {'drStatus': {'drActive': 'off', 'optOut': 'off', 'setpoint': 'off', 'powerAbsolute': 'off', 'powerRelative': 'off', 'onOff': 'off'}, 'outputPercentDisplay': {'percent': 0, 'sourceType': 'heating'}, 'roomSetpoint': 22, 'roomTemperatureDisplay': {'status': 'on', 'value': 23.5}, 'temperatureFormat': 'celsius', 'setpointMode': 'manual', 'drSetpoint': {'status': 'off', 'value': None}, 'roomSetpointMax': 36, 'roomSetpointMin': 5, 'roomTemperature': {'error': None, 'value': 23.4}, 'timeFormat': '24h', 'loadWattOutput2': 0, 'roomSetpointAway': 15, 'earlyStartCfg': 'on', 'backlightAutoDim': 'alwaysOn', 'occupancyMode': 'home', 'config2ndDisplay': 'exteriorTemperature', 'keyboardLock': 'unlock', 'wifiRssi': -43, 'loadWatt': 9000, 'loadWattOutput1': 9000, 'pumpProtection': {'status': 'off'}, 'floorMaxAirTemperature': {'status': 'off', 'value': None}, 'airFloorMode': 'floor', 'floorSensorType': '10k', 'auxCycleLength': 0, 'cycleLength': 900, 'floorLimitHigh': {'status': 'on', 'value': 25.5}, 'floorLimitLow': {'status': 'on', 'value': 23.5}}

With a prettier version of the json content:



Thank you, I’ll check if eveything is there.

@claudegel Salut M. gélinas, je suis nouveau sur home assistant. j’ai un système sinope. j’ai installé via HACS le plugin mais je ne suis pas capable de faire détecter mes appareils. est-ce que vous pouvez me guider.

j’ai ces message dans les logs

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/", line 404, in _async_setup_component
    result = await task
  File "/usr/local/lib/python3.12/concurrent/futures/", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/neviweb130/", line 135, in setup
    data = Neviweb130Data(hass_config[DOMAIN])
  File "/config/custom_components/neviweb130/", line 168, in __init__
    self.neviweb130_client = Neviweb130Client(username, password, network, network2)
  File "/config/custom_components/neviweb130/", line 199, in __init__
  File "/config/custom_components/neviweb130/", line 244, in __get_network
    raw_res = requests.get(LOCATIONS_URL + self._account, headers=self._headers,
TypeError: can only concatenate str (not "NoneType") to str

j’ai trouvé. erreur de débutant…

Bien sure, Il semble que votre conenction à Neviweb n’est pas établie.
Dans vos log vous devriez voir une ligne:
[custom_components.neviweb130] Successfully logged in to: xxxxx
Ceci veux dire que vous êtes bien connecté à Neviweb. Le numéro xxxxx sert pour l’étape suivante et représente votre numéro d’abbonné dans Néviweb
Votre configuration dans configuration.yaml est comme suit:

  username: !secret climate_username  <-- votre courriel utilisée pour connecter à Neviweb
  password: !secret climate_password  <-- votre mot de passe neviweb
  network: !secret climate_gateway130  <-- ne nom de la location où sont vos appareils dans Neviweb
  scan_interval: 360
  stat_interval: 600

le !secret climate_username est utilisé pour sécuriser vos identifiants dans le fichier secrets.yaml
dans celui-ci vous mettez:

climate_username: '[email protected]'
climate_password: 'mon_mot_de_passe'
climate_gateway130: 'Ma_location'

ce sont les identifiants pour vous connecter à Neviweb