Viessmann OpenV vcontrold Client (Optolink)

You’re welcome. Sorry if I took it too broadly even things that are obvious to you :face_with_peeking_eye:. My “disability” :sweat_smile:.

I’m attaching my current vito.xml in the attachment.

I have the device mode control (off/heating/hot-water) worked out. So I just don’t know about the “reduced” mode option (I can’t even set it directly on the boiler; I only have 3 options using the physical buttons on the boiler). But it is true that there is a “reduced temperature required” setting (in the boiler). I thought it was the temperature when the boiler is in “heating” mode but out of schedule (possibly holiday mode)…But maybe I’m wrong. Do you really have 4 operating modes?

But whatever - this was my main requirement why I started the integration in the first place (we have multiple heating systems and to allow automatic switching). I had a problem with this and struggled with it too. I could read the status of the boiler with no problem using it (I assume you could too):

<!-- Provozni mod kotle - to co je videt na ovladani   -->
    <command name="getBetriebArt" protocmd="getaddr">
      <addr>2301</addr>
      <len>1</len>
      <unit>BA</unit>
      <description>Betriebsart</description>
    </command>    

But I couldn’t write it down. After a lot of figuring, I found out that my boiler was not responding to a boiler mode change, but to a mode change of the first heating circuit. I write to this register as follows:

    <!-- SET - Nastaveni Provozni mod TO1 - to ovlivnuje mod celeho kotle -->
    <command name='setBetriebArtM1' protocmd='setaddr'>
        <addr>2323</addr>
        <len>1</len>
        <unit>BA</unit>
        <description>Setze Betriebsart M1</description>
    </command>

and read it by:

    <!-- Provozni mod TO1 -->
    <command name='getBetriebArtM1' protocmd='getaddr'>
        <addr>2323</addr>
        <len>1</len>
        <unit>BA</unit>
        <description>Betriebsart M1</description>
    </command>

My boiler behaves like this:


setBetriebArtM1 = NORM --> getBetriebArt = H+WW (heating and hot water)
setBetriebArtM1 = RED --> getBetriebArt = WW (hot water)
setBetriebArtM1 = WW --> getBetriebArt = ABSCHALT (probably antifrost mode).

of course getBetriebArtM1 returns the heating circuit status values (NORM, RED, WW).


Here is my temporary vito.xml:

<?xml version="1.0"?>
<vito>
  <devices>
    <device ID="2098" name="V200KW2" protocol="KW2"/>
    <device ID="2053" name="GWG_VBEM" protocol="GWG"/>
    <device ID="20CB" name="VScotHO1" protocol="P300"/> <!-- NAS KOTEL -->
    <device ID="2094" name="V200KW1" protocol="KW2"/>
  </devices>
  <commands>
  
<!-- ..... Kotel ..... -->
    <!-- Provozni mod kotle - to co je videt na ovladani   -->
    <command name="getBetriebArt" protocmd="getaddr">
      <addr>2301</addr>
      <len>1</len>
      <unit>BA</unit>
      <description>Betriebsart</description>
    </command>    
    <!-- Pozice ventilu -> TUV/Topeni   -->
    <command name="getUmschaltventil" protocmd="getaddr">
      <addr>0A10</addr>
      <len>1</len>
      <unit>USV</unit>
      <description>Ermittle den Status des Umschaltventils WW/Heizen</description>
    </command>

    <!-- INFO K HORAKU -->
    <!-- Aktualni vykon horaku -->
    <command name="getBrennerStatus" protocmd="getaddr">
      <addr>55D3</addr>
      <len>1</len>
      <unit>RT</unit>
      <description>Ermittle den Brennerstatus</description>
      <device ID="20CB">
        <addr>55D3</addr>
        <len>1</len>
        <unit>PR1</unit>
      </device>
    </command>
    <!-- Provozni hodiny horaku -->
    <command name="getBrennerStunden1" protocmd="getaddr">
      <addr>08A7</addr>
      <len>4</len>
      <unit>CS</unit>
      <description>Ermittle die Brennerstunden Stufe 1</description>
    </command>

<!-- ..... TO1 ..... -->
    <!-- Provozni mod TO1 -->
    <command name='getBetriebArtM1' protocmd='getaddr'>
        <addr>2323</addr>
        <len>1</len>
        <unit>BA</unit>
        <description>Betriebsart M1</description>
    </command>
    <!-- SET - Nastaveni Provozni mod TO1 - to ovlivnuje mod celeho kotle -->
    <command name='setBetriebArtM1' protocmd='setaddr'>
        <addr>2323</addr>
        <len>1</len>
        <unit>BA</unit>
        <description>Setze Betriebsart M1</description>
    </command>
    
<!-- ..... Tepla voda ..... -->
    <!-- Aktualni teplota teple vody  -->
    <command name="getTempWWist" protocmd="getaddr">
      <addr>0804</addr>
      <len>2</len>
      <unit>UT</unit>
      <description>A</description>
    </command>
    <!-- Pozadovana teplota teple vody  -->
    <command name="getTempWWsoll" protocmd="getaddr">
      <addr>6300</addr>
      <len>1</len>
      <unit>UTI</unit>
      <description>Ermittle die Warmwassersolltemperatur in Grad C</description>
    </command>
    <!-- SET - Nastaveni pozadovane teploty teple vody  -->
    <command name="setTempWWsoll" protocmd="setaddr">
      <addr>6300</addr>
      <len>1</len>
      <unit>UTI</unit>
      <description>Setze die Warmwassersolltemperatur in Grad C</description>
    </command>

<!-- .....SOLAR..... -->
    <!-- Teplota kolektoru  -->
    <command name="getTempKol" protocmd="getaddr">
      <addr>6564</addr>
      <len>2</len>
      <unit>UT</unit>
      <description>Ermittle die Kollektortemperatur in Grad C</description>
      <device ID="2053"/>
    </command>
    <!-- Provozni hodiny solaru  -->
    <command name="getSolarStunden" protocmd="getaddr">
      <addr>6568</addr>
      <len>2</len>
      <unit>CO</unit>
      <description>Solar Betriebsstunden</description>
      <device ID="2053"/>
    </command>
    <!-- Celkova dodana kumulativni energie  -->
    <command name="getSolarLeistung" protocmd="getaddr">
      <addr>6560</addr>
      <len>4</len>
      <unit>CO</unit>
      <description>Solar Leistung Gesamt</description>
      <device ID="2053"/>
    </command>

<!-- ..... Chyby..... -->
    <command name="getError0" protocmd="getaddr">
      <addr>7507</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 1</description>
      <device ID="2053">
        <addr>3F</addr>
        <len>1</len>
        <unit>ESG</unit>
      </device>
    </command>
    <command name="getError1" protocmd="getaddr">
      <addr>7510</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 2</description>
      <device ID="2053"/>
    </command>
    <command name="getError2" protocmd="getaddr">
      <addr>7519</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 3</description>
      <device ID="2053"/>
    </command>
    <command name="getError3" protocmd="getaddr">
      <addr>7522</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 4</description>
      <device ID="2053"/>
    </command>
    <command name="getError4" protocmd="getaddr">
      <addr>752B</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 5</description>
      <device ID="2053"/>
    </command>
    <command name="getError5" protocmd="getaddr">
      <addr>7534</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 6</description>
      <device ID="2053"/>
    </command>
    <command name="getError6" protocmd="getaddr">
      <addr>753D</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 7</description>
      <device ID="2053"/>
    </command>
    <command name="getError7" protocmd="getaddr">
      <addr>7546</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 8</description>
      <device ID="2053"/>
    </command>
    <command name="getError8" protocmd="getaddr">
      <addr>754F</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 9</description>
      <device ID="2053"/>
    </command>
    <command name="getError9" protocmd="getaddr">
      <addr>7558</addr>
      <len>9</len>
      <unit>ES</unit>
      <description>Ermittle Fehlerhistory Eintrag 10</description>
      <device ID="2053"/>
    </command>

<!--TMP SEKCE!!!!!!!TMPSEKCE! TMP -->
    
  <!-- SOLAR -->

    <command name="getSolarStatusWW" protocmd="getaddr">
      <addr>6551</addr>
      <len>1</len>
      <unit>RT</unit>
      <description>Ermittle den Status der Nachladeunterdrueckung</description>
      <device ID="2053"/>
    </command>
    
    <command name="getTempS4" protocmd="getaddr">
      <addr>0124</addr>
      <len>1</len>
      <unit>UT1</unit>
      <description>Ermittle die Temperatur S4 in Grad C</description>
      <device ID="2053"/>
    </command>


    <command name="getPumpeDrehzahlSolar" protocmd="getaddr">
      <addr>6552</addr>
      <len>1</len>
      <unit>RT</unit>
      <description>Ermittle die Drehzahl der Internen Pumpe</description>
      <device ID="2053"/>
      <device ID="20CB">
        <addr>6552</addr>
        <len>2</len>
        <unit>PR2</unit>
      </device>
    </command>
  </commands>

</vito>

And here is the yaml file for configuration to HA (a bit of “confusion” when controlling the boiler mode):

mqtt:
  select:
    #Ovládání pracovního módu kotel
    - name: "KOTEL Pracovní mód"
      #expire_after: 30
      unique_id: "vcontroldgetBetriebArt"
      state_topic: "openv/getBetriebArt"
      icon: mdi:source-fork
      device:
        identifiers: vcontrold
        name: Viessmann kotel
        manufacturer: Viessmann
        model: "Vitodens 200, Vitotronic 200 (HO1) - 20CB"
      command_topic: "openv/setBetriebArtM1"
      options:
        - "Topení + TUV"
        - "Jen TUV"
        - "Vypínací provoz"
      command_template: |-
        {% if value == "Topení + TUV" %}
          {{"NORM"}}
        {% elif value == "Jen TUV" %}
          {{"RED"}}
        {% elif value == "Vypínací provoz" %}
          {{"WW"}}
        {% endif %}
      value_template: >
        {% if value == 'H+WW' %}
          {{"Topení + TUV"}}
        {% elif value == 'WW' %}
          {{"Jen TUV"}}
        {% elif value == 'ABSCHALT' %}
          {{"Vypínací provoz"}}
        {% endif %}
        
  climate:
    - name: "Teplá voda"
      unique_id: "vcontroldWWclimate"
      object_id: "vcontroldWWclimate"
      current_temperature_topic: "openv/getTempWWist"
      temperature_command_topic: "openv/setTempWWsoll"
      temperature_state_topic: "openv/getTempWWsoll"
      action_topic: "openv/getBrennerStatus"
      action_template: |-
        {% if (is_state('sensor.vcontroldgetumschaltventil', 'TUV') and (value|float > 0)) %}
          heating
        {% else %}
          idle
        {% endif %}
      mode_state_topic: "openv/getBetriebArt"
      mode_state_template: |-
        {% if value == 'H+WW' %}
          heat
        {% elif value == 'WW' %}
          heat
        {% else %}
          off
        {% endif %}
      mode_command_topic: "openv/setBetriebArtM1"
      mode_command_template: |-
        {% if value == "off" %}
          {{"WW"}}
        {% elif value == "heat" %}
          {{"RED"}}
        {% endif %}
      min_temp: 35
      max_temp: 60
      modes:
        - "off"
        - "heat"
      device:
        identifiers: vcontrold

  sensor:
    #Sensory Kotel
    - name: "KOTEL Pracovní mód - sensor"
      expire_after: 30
      unique_id: "vcontroldgetBetriebArt"
      object_id: "vcontroldgetBetriebArt"
      state_topic: "openv/getBetriebArt"
      icon: mdi:source-fork
      value_template: |-
        {% if value == 'H+WW' %}
          Topení + TUV
        {% elif value == 'WW' %}
          Jen TUV
        {% elif value == 'ABSCHALT' %}
          Vypínací provoz
        {% else %}
          Jiný neznámý stav - kontrola!!!
        {% endif %}
      device:
        identifiers: vcontrold
        
    - name: "KOTEL Výkon hořáku"
      expire_after: 30
      unique_id: "vcontroldgetBrennerStatus"
      object_id: "vcontroldgetBrennerStatus"
      state_topic: "openv/getBrennerStatus"
      value_template: |-
        {{ value | round(0) }}
      device_class: power_factor
      unit_of_measurement: "%"
      icon: mdi:gas-burner
      device:
        identifiers: vcontrold

    - name: "KOTEL Ventil"
      expire_after: 30
      unique_id: "vcontroldgetUmschaltventil"
      object_id: "vcontroldgetUmschaltventil"
      state_topic: "openv/getUmschaltventil"
      value_template: |-
        {% if value == 'Heizen' %}
          Topení
        {% elif value == 'Warmwasser' %}
          TUV
        {% else %}
          Jiný neznámý stav - kontrola!!!
        {% endif %}
      icon: mdi:pipe-valve
      device:
        identifiers: vcontrold
    #Sensory TO1    
    - name: "TO1 Pracovní mód"
      expire_after: 30
      unique_id: "vcontroldgetBetriebArtM1"
      object_id: "vcontroldgetBetriebArtM1"
      state_topic: "openv/getBetriebArtM1"
      icon: mdi:heating-coil
      device:
        identifiers: vcontrold

    #Sensory Tepla voda
    - name: "TUV aktuální teplota (úr.3)"
      expire_after: 30
      unique_id: "vcontroldgetTempWWist"
      object_id: "vcontroldgetTempWWist"
      device_class: temperature
      state_topic: "openv/getTempWWist"
      force_update: true
      unit_of_measurement: "°C"
      icon: mdi:thermometer-chevron-up
      value_template: |-
        {{ value | round(2) }}
      device:
        identifiers: vcontrold
        
    - name: "TUV požadovaná teplota"
      expire_after: 30
      unique_id: "vcontroldgetTempWWsoll"
      object_id: "vcontroldgetTempWWsoll"
      device_class: temperature
      state_topic: "openv/getTempWWsoll"
      unit_of_measurement: "°C"
      icon: mdi:thermometer-check
      value_template: |-
        {{ value | round(2) }}
      device:
        identifiers: vcontrold

    #Sensory Solar
    - name: "SOLAR Teplota kolektorů"
      expire_after: 30
      unique_id: "vcontroldgetTempKol"
      object_id: "vcontroldgetTempKol"
      device_class: temperature
      state_topic: "openv/getTempKol"
      unit_of_measurement: "°C"
      icon: mdi:solar-panel
      value_template: |-
        {{ value | round(2) }}
      device:
        identifiers: vcontrold
    #TEMP: - Nevim, co toje?
    - name: "SOLAR ?Status?"
      expire_after: 30
      unique_id: "vcontroldgetSolarStatusWW"
      object_id: "vcontroldgetSolarStatusWW"
      state_topic: "openv/getSolarStatusWW"
      #icon: mdi:alert-circle
      device:
        identifiers: vcontrold
    
    - name: "SOLAR Celková vyrobená energie"
      expire_after: 30
      unique_id: "vcontroldgetSolarLeistung"
      object_id: "vcontroldgetSolarLeistung"
      device_class: energy
      state_topic: "openv/getSolarLeistung"
      unit_of_measurement: "kWh"
      value_template: |-
        {{ value | round(2) }}
      icon: mdi:solar-power
      device:
        identifiers: vcontrold
    - name: "SOLAR pokus - pumapa"
      expire_after: 30
      unique_id: "vcontroldgettestpumpa"
      object_id: "vcontroldgettestpumpa"
      state_topic: "openv/getPumpeDrehzahlSolar"
      #icon: mdi:alert-circle
      device:
        identifiers: vcontrold
    #Errors
    - name: "KOTEL Error0"
      expire_after: 30
      unique_id: "vcontroldgetError0"
      object_id: "vcontroldgetError0"
      state_topic: "openv/getError0"
      entity_category: diagnostic
      icon: mdi:alert-circle
      device:
        identifiers: vcontrold
    - name: "KOTEL Error1"
      expire_after: 30
      unique_id: "vcontroldgetError1"
      object_id: "vcontroldgetError1"
      state_topic: "openv/getError1"
      entity_category: diagnostic
      icon: mdi:alert-circle
      device:
        identifiers: vcontrold
    - name: "KOTEL Error2"
      expire_after: 30
      unique_id: "vcontroldgetError2"
      object_id: "vcontroldgetError2"
      state_topic: "openv/getError2"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error3"
      expire_after: 30
      unique_id: "vcontroldgetError3"
      object_id: "vcontroldgetError3"
      state_topic: "openv/getError3"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error4"
      expire_after: 30
      unique_id: "vcontroldgetError4"
      object_id: "vcontroldgetError4"
      state_topic: "openv/getError4"
      entity_category: diagnostic
      icon: mdi:alert-circle
      device:
        identifiers: vcontrold
    - name: "KOTEL Error5"
      expire_after: 30
      unique_id: "vcontroldgetError5"
      object_id: "vcontroldgetError5"
      state_topic: "openv/getError5"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error6"
      expire_after: 30
      unique_id: "vcontroldgetError6"
      object_id: "vcontroldgetError6"
      state_topic: "openv/getError6"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error7"
      expire_after: 30
      unique_id: "vcontroldgetError7"
      object_id: "vcontroldgetError7"
      state_topic: "openv/getError7"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error8"
      expire_after: 30
      unique_id: "vcontroldgetError8"
      object_id: "vcontroldgetError8"
      state_topic: "openv/getError8"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold
    - name: "KOTEL Error9"
      expire_after: 30
      unique_id: "vcontroldgetError9"
      object_id: "vcontroldgetError9"
      state_topic: "openv/getError9"
      icon: mdi:alert-circle
      entity_category: diagnostic
      device:
        identifiers: vcontrold


And I have a problem with party mode too, I didn’t get it right. It didn’t work. I read somewhere that when activating it, you need to set the party temperature first (different from “normal”) and then turn on the party mode. But that didn’t work either…I’m sorry and I’ll be glad if you can figure it out :wink:. If I do I’ll definitely let you know :wink:

Is this what you are looking for? I hope I’m doing it right, but nothing else worked for me…maybe it will work for you too :wink: .

1 Like

@nosektomas2004 You did brilliant job. Thank you. Now I can really switch the modes, according to the scheme you gave:

  • Normal is heating with hot water,
  • RED is hot water only
  • WW is off.

But (oh my God!) this is obviously illogical, as these names mean totally different states. Why they did it that way? We’ll never know.
I was given a service book along with the boiler, maybe this will clear something about party and saving modes.

I believe you are familiar with Vitogate datenpunktliste:
Vitogate 200 datenpunktliste

Edit:
I figured something out: I managed to run saving mode and partymode by console.
Some remarks:

  1. Saving mode works only when you have heating on,
  2. the address I managed to run it is 2331 (read/write)
  3. party mode is on address 2330 (read/write)
 <command name="setBetriebSparM1" protocmd="setaddr">
      <addr>2331</addr>
      <len>1</len>
      <unit>RT</unit>
      <description>Setze Betriebsart Spar M1</description>
      <device ID="2053"/>
      <device ID="20CB">
       <addr>2331</addr>
       <len>1</len>
       <unit>RT</unit>
      </device>
     </command>

1 Like

Hi,
I’m glad I could help you make it work.

Thank you so much for the PDF - I hadn’t seen it and it will come in handy. Thanks so much!
And thank you for Partymode and Saving Mode :wink:.

Thanks a lot

And for my info - do you end up setting 3 modes (OFF/HotWater/Heating+HotWater), or 4 as you wrote (including reduced)?

Because I’m reading through the PDF you sent now and the reduced operation is also mentioned there.But somehow it doesn’t make sense to me because it’s not mentioned in the user or service manual for the boiler :sweat_smile:

By the way - what does the “KNX-DPT” column mean?
Thanks!

Hi,
No, I ended up with three modes. I presume that reduced mode is the one with the moon (on the vitotrol screen) but I didn’t bother with it, as it is turned on automatically by the boiler.

Got no idea what KNX-DPT column mean. :thinking: Some of the values are marked as “non-DPT”, maybe it is a kind of resolution of the variables?

1 Like

KNX-DPT is a datapoint type for KNX protocol probably in case someone is integrating the boiler with KNX system.

1 Like

We already know :sunglasses::laughing: - I found out why there is an inconsistency between the modes.
If you look in your PDF at 0x2323 in the description, you can see a description of which number means which mode.

I’m using HomeAssistant and the vcontrold add-on, I don’t know about you; so maybe something is a bit different - there are two files in the add-on, vcontrold.xml and vito.xml. The vito.xml is where the commands for the boiler are defined. Each command has a variable type (for those modes, the variable type is “BA”) - these are defined in the vcontrold.xml file.

Unfortunately I don’t know how to change/replace this file yet (similar to how I do my own vito.xml), but if I look on the vcotrold project’s GitHub and find the source vcontrold.xml I can at least browse it. And on line 132 there is the definition of the variable type “BA”. And here you can see why this is the case:
Snímek obrazovky 2024-09-03 163253

The ending bits in the variable type definition are titled with different names than in the Viessmann PDF document. But when one looks at how it behaves, it is absolutely correct. It’s just the variable type is “misdefined”.

Interestingly though, I am reading the boiler status from a different address -2301. It is not listed in the PDF at all. And at that address the default definition fits and works. The boiler returns different bits to the corresponding states at this address, so it fits…

So it’s not a boiler but definition problem :saluting_face::sweat_smile:

I’m finally starting to understand a little bit :sweat_smile:

1 Like

Yes, unfortunately the Viessmann operating modes do not map too well to the Homeassistant Climate Modes and presets. :frowning:
I’m currently playing around with the Optolink Splitter and trying to create an MQTT Climate entity from it. The Optolink splitter is great, but the climate entity still feels a bit strange. Especially because there is no global target temperature state at Viessmann. The current target temperatur always depends on the operating mode. As a result, my MQTT Climate entity always displays the target temperature for normal operation mode, even if the reduced operating mode is currently active. :slightly_frowning_face:

This is the configuration for my Vitocrossal 300C

Poll Items

poll_items = [
    # VScotHO1_72
    # (Name, DpAddr, Len, Scale/Type, Signed)
    ("heizkreispumpe_m2", 0x3906, 1, 1, False),
    ("heizkreispumpe_m3", 0x4906, 1, 1, False),
    ("heizkreispumpe_drehzahl_m2", 0x7665, 2, 1, False),
    ("heizkreispumpe_drehzahl_m3", 0x7667, 2, 1, False),
    ("aktuelle_betriebsart_m2", 0x2500, 1, 1, False),
    ("aktuelle_betriebsart_m3", 0x3500, 1, 1, False),
    ("betriebsart_m2", 0x3323, 1, 1, False),
    ("betriebsart_m3", 0x4323, 1, 1, False),
    ("vorlauftemperatur_m2", 0x3900, 2, 1/10, False),
    ("vorlauftemperatur_m3", 0x4900, 2, 1/10, False),
    ("raumtemperatur_soll_normalbetrieb_m2", 0x3306, 1, 1, False),
    ("raumtemperatur_soll_normalbetrieb_m3", 0x4306, 1, 1, False),
    ("raumtemperatur_soll_eco_m2", 0x3307, 1, 1, False),
    ("raumtemperatur_soll_eco_m3", 0x4307, 1, 1, False),
    ("raumtemperatur_soll_party_m2", 0x3308, 1, 1, False),
    ("raumtemperatur_soll_party_m3", 0x4308, 1, 1, False),
    ("raumtemperatur_m2", 0x0898, 2, 1/10, False),
    ("raumtemperatur_m3", 0x089A, 2, 1/10, False),
]

And this is how one of my mqtt climate entities is currently configured:

        {
            "domain": "climate",
            "name": "M2 Thermostat",
            "optimistic": true,
            "mode_command_topic": "cmnd",
            "mode_state_topic": "betriebsart_m2",
            "modes": [
                "auto",
                "off",
                "heat"
            ],
            "mode_state_template": "{% if value==\"0\" %} off {% elif value==\"1\" %} off {% elif value==\"2\" %} auto {% elif value==\"3\" %} heat {% elif value==\"4\" %} heat {% endif %}",
            "mode_command_template": "{% if value==\"off\" %} w;0x3323;1;0 {% elif value==\"auto\" %} w;0x3323;1;2 {% elif value==\"heat\" %} w;0x3323;1;4 {% endif %}",
            "preset_mode_command_topic": "cmnd",
            "preset_mode_state_topic": "betriebsart_m2",
            "preset_modes": [
                "Nur Warmwasser",
                "eco",
                "comfort"
            ],
            "preset_mode_value_template": "{% if value==\"1\" %} Nur Warmwasser {% elif value==\"3\" %} eco {% elif value==\"4\" %} comfort {% else %} None {% endif %}",
            "preset_mode_command_template": "{% if value==\"Nur Warmwasser\" %} w;0x3323;1;1 {% elif value==\"eco\" %} w;0x3323;1;3 {% elif value==\"comfort\" %} w;0x3323;1;4 {% else %} w;0x3323;1;2 {% endif %}",
            "current_temperature_topic": "vorlauftemperatur_m2",
            "temperature_state_topic": "raumtemperatur_soll_normalbetrieb_m2",
            "temperature_command_topic": "raumtemperatur_soll_normalbetrieb_m2",
            "precision": 0.1,
            "temperature_unit": "C",
            "min_temp": 3,
            "max_temp": 37,
            "temp_step": 1
        },

Final result in Home Assistant:


The way I handle it is that I have a climate entity separately for hot water, standard heating, reduced heating, and party heating…But I guess I understand that it would be better to have it all in one.

One more thing about the vito.xml configuration - how do you get the value within the <len> tag? I don’t know how to find out how long it is? Sometimes it works with multiple numbers…

    <command name="getTempKol" protocmd="getaddr">
      <addr>6564</addr>
      <len>2</len>
      <unit>UT</unit>
      <description>Ermittle die Kollektortemperatur in Grad C</description>
      <device ID="2053"/>
    </command>

The scale thing is a bit of trial and error. Most of the time you just move the decimal place. The scaling is usually pretty obvious: If you get 234 degrees for the outside temperature, for example, the scaling is 1/10. There is hardly anything other than 1 and 1/10. For the burner runtime e.g., 1/3600 (seconds in hours). But mostly it is just a shift of the decimal point, with Int4 sometimes 1/100 or 1/1000.

Regading the length: “Int” means there are 2 bytes. There is almost only Int and Byte. Byte is then 1 byte. Sometimes there is also Int4, which is 4 bytes. With arrays (e.g. switching times), you need a deeper knowledge of the interpretation anyway.

Here is a fairly comprehensive collection of a Vitosoft export for various Viessmann systems. It also contains information on the data types ViessData21/DP_Listen_2.zip at master · philippoo66/ViessData21 (github.com)

But I don’t use vito.xml :wink: The Optolink splitter and its configuration is largely python based. Maybe we (I?) should start a new forum thread for this, if it doesn’t already exist?

Oh, so this is just wrong mapping in the vcontrold file. To be honest, I had not much interest in vcontrold.xml, I have seen it once, and since i found nothing interesting, I assumed, that vito.xml will be the right file to drive the boiler.
It looks like that vcontrold.xml is just a “translator” from the values taken from boiler to more understandable form. But - as we can see - that’s not always true :wink:
I believe, it could be possible to establish in vcontrold.xml new type of variable, that would map the mode variable correctly.
@nosektomas2004 - since you figured out the right way to drive the 20CB boilers, maybe you should establish new github repo, or modify the openv data?
These informations are wanted by some home assistant users and Vitodens-200 owners, but they are not present in openv repo, or they are reported wrong.

I don’t think I’m the right person for that - plus I don’t know how to work with GitHub :sweat_smile:. But when I finish all the work, I can definitely upload my configuration files here :saluting_face:

BTW - does anyone know a way to plot an equithermal heating curve in HA? The way the boiler renders it on the display?

It’s probably some function dependent on 3 variables (desired temperature, slope and displacement), all of which I am able to get into HA…I’d like to see the curve and calculate the point (based on outside temperature) that the boiler will heat the water to.

I wanted to ask you - @Qbunjo , did you manage to read the current operating status of the heating circuit? According to your PDF it should be address 0x2500, but it keeps returning NORM to me (I know the mapping may be wrong; but the value doesn’t change at all)…

It is shown on the boiler and control display (and is controlled by the timing; or the set mode):
FAILURE - not heating
MONTH - heating at reduced temperature
SUN - heats to standard temperature

I would like to get to this information, but I can’t…

Btw I found changed HA plugin, that allow to rewrite vcontrold.xml, so the mapping can be fixed. I’ll try it…

Hello,
I’m switching from IPSymcon to Home Assistant.
I can’t get my remote Rasperry to work. Under TTY I specify “OpenV/3002”. Even trying the IP address doesn’t work either.
Can someone tell me what I’m doing wrong?

Thanks in advance and thanks for creating the extension

Andy

Solved: it works with IP:Socket (192.168.1.127:3002)
Thanks for reading

Well, not yet. I still have my boiler in summer mode and until it’s going get colder outside I’m not using these settings, so I don’t even know how does it work.

My boiler is a 200-W Device ID: 20CB
and the mapping for the 0x2500 data point that works for me is:

- "2 -> off"           # when in standby or dhw modes
- "258 -> reduced"     # when in reduced (night) or forcedReduced modes or in Eco preset
- "514 -> comfort"     # when in day heating or in Comfort preset
- "770 -> normal"      # when in forcedNormal type

Hi all,

I just can no get the plugin to work :frowning:
I have a Proxmox server. There is a vcontrold running in docker and port 3002 is open accordingly.
HA is running as VM.

Access from my Mac via telnet to vcontrold also works:
telnet IP:3002
getBetriebArtHK2

I have installed the plugin and configured the IP, MQTT.
Unfortunately, I do not see any events in the MQTT broker and the following error message in the logs:

[11:03:19] INFO: vcontrold will be set to host: 192.168.178.83 and port: 3002
[11:03:19] INFO: Using configured MQTT Host: 192.168.178.186:1883
[11:03:19] INFO: Using default vito.xml file.
[11:03:19] INFO: Using default vcontrold.xml file.
[11:03:19] INFO: Configuring command 1: getRaumTempHK2 with type getRaumTempHK2
[11:03:19] INFO: vcontrold is not running locally. Keeping process alive.
[11:03:19] INFO: vcontrold will be set to host: 192.168.178.83 and port: 3002
[11:03:19] INFO: Using configured MQTT Host: 192.168.178.186:1883
[11:03:19] INFO: vcontrold will be set to host: 192.168.178.83 and port: 3002
[11:03:19] INFO: Starting MQTT subscription to topic: viessmann/#
[11:03:24] INFO: Executing vclient_pub command...
[11:03:49] ERROR: vclient_pub run failed with exit code 1.
[11:03:49] INFO: Looping vclient_pub. Sleeping for 30 seconds.

Config HA:

@Schm1tz1 any ideas what the problem could be?

After a reboot of the whole system it starts to work :slight_smile: