Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Ich habe nach verschiedenen Instabilitäten mal das Plugin deaktiviert - keine Änderung, zum Glück und weiß nun, dass der Raspi4 zwar schön flott, aber thermisch instabil ist (zumindest meiner). Zum Schluss 2-3 Reboots am Tag war dann doch nicht mehr gut.
    Den habe ich jetzt durch einen RPi 3 ersetzt und der läuft völlig klaglos, insofern habe ich auch keine Anhaltspunkte, dass das Plugin nicht sauber liefe.

    Ich würde dann noch das Commandset einbauen, das loeserman geschickt hat und auch dieses (zumindest in Teilen), und dann könnte das von mir aus auch gern ins Release.

    Vitotronic 200 ist anscheinend so eine Art Gattungsbegriff, so ein Teil habe ich bei mir nämlich auch an der Heizung, aber meine ist eine Wärmepumpe von 2014, und es spricht P300 einwandfrei ob die V200KW2 das auch kann, müsste TCr82 dann mal ausprobieren. Wenn wir KW2 noch mit aufnehmen, müsste das natürlich erst noch getestet werden; ich sehe aber keine Notwendigkeit, das Plugin nach der bisherigen Wartezeit jetzt "sofort" reinzubekommen; so lange können wir dann auch noch warten...

    Am Wochenende mache ich das mal fertig, dann kann er testen, und dann schauen wir weiter. Ok?

    Kommentar


      Zitat von Onkelandy Beitrag anzeigen
      loeserman Blöde Frage, woher hast du denn das Widget aus Post 140 https://knx-user-forum.de/forum/supp...53#post1573653
      Soweit ich mich erinnere gab es mal eine Featureanfrage zu nem Table Widget..
      Mit einem universellen Table Widget kann ich leider nicht dienen. Das Widget habe ich mir mal selbst geschrieben (speziell für die Heizung). Ist sicherlich nicht optimal gelöst aber es funktioniert prima und hat für mich gepasst.
      In meinem pages Verzeichnis habe ich eine html Datei für eigene Widgets ("widget_my.html"). In dieser ist dann der folgende Code.
      Code:
      /**
       * Anzeigen der genauen Heizungsinformationen
       * @param       unique id for this widget
       * @param       text for headline (like: Heizung Viessmann)
       */
      {% macro icon_and_popup_heizungviessmann(uid, headline) %}
          {% import "basic.html" as basic %}
      
          <!-- Internal tags -->
          {% set gad = 'ZAEHLER.HEIZUNG' %}
          
          <a href="#{{ uid }}-popup_heizungviessmann" data-rel="popup" style="text-decoration: none; font-weight: normal;">
              {{ basic.symbol('',  gad~'.ICON_STATUS', '', ['sani_boiler_temp.svg', 'sani_boiler_temp.svg', 'sani_solar.svg', 'control_x.svg'], [3,2,1,0], '', ['icon0', 'icon0', 'icon0', '#ff0000']) }}
              <br>
              {{ basic.symbol('',  gad~'.ICON_STATUS', ['Standby', 'An', 'An', 'Fehler'], '', [3,2,1,0], '', ['icon0', 'icon0', 'icon0', 'icon0']) }}
              <br>
              Heizung
          </a>
          <div id="{{ uid }}-popup_heizungviessmann" data-role="popup">
              <div class="lPopupHeader">
                  {% if headline %}
                      &nbsp;&nbsp;&nbsp;{{ headline }}&nbsp;&nbsp;&nbsp;
                  {% else %}
                      &nbsp;&nbsp;&nbsp;{{ headline|default('### Überschrift noch nicht definiert ###') }}&nbsp;&nbsp;&nbsp;
                  {% endif %}
              </div>
              <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a>
              <table>
                  <!-- Zustand -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Zustand
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="6" align="center">
                          {{ basic.symbol('', gad~'.SAMMELSTOERUNG', ['STÖRUNG', 'OK'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Allgemein / Brenner -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Allgemein / Brenner
                      </td>
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="2" align="center" width="100px">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                      <td colspan="2" align="center" width="100px">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.ANLAGEN_LEISTUNG', 'float1') }}
                      </td>
                      <td align="left">
                          %
                      </td>
                      <td align="left">
                          Anlagenleistung
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNERSTARTS', 'int') }}
                      </td>
                      <td align="left">
                          mal
                      </td>
                      <td align="left">
                          Brennerstarts gesamt
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNER_LEISTUNG', 'float1') }}
                      </td>
                      <td align="left">
                          %
                      </td>
                      <td align="left">
                          Brennerleistung
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNERSTARTS.LETZTE_STUNDE', 'int') }}
                      </td>
                      <td align="left">
                          mal
                      </td>
                      <td align="left">
                          Brennerstarts letzte Stunde
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.ABGASTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Abgas Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNERSTARTS.LETZTER_TAG', 'int') }}
                      </td>
                      <td align="left">
                          mal
                      </td>
                      <td align="left">
                          Brennerstarts letzter Tag
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.KESSELSOLLTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Soll Kessel Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEBSSTUNDEN', 'float') }}
                      </td>
                      <td align="left">
                          h
                      </td>
                      <td align="left">
                          Betriebsstunden gesamt
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.KESSELTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Ist Kessel Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEBSSTUNDEN.LETZTE_STUNDE', 'float') }}
                      </td>
                      <td align="left">
                          h
                      </td>
                      <td align="left">
                          Betriebsstunden letzte Stunde
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.INTERN', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Interne Pumpe
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEBSSTUNDEN.LETZTER_TAG', 'float') }}
                      </td>
                      <td align="left">
                          h
                      </td>
                      <td align="left">
                          Betriebsstunden letzter Tag
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.BRENNERSTATUS', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Brennerstatus
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEB_ZU_STARTS', 'float1') }}
                      </td>
                      <td align="left">
                          mal/h
                      </td>
                      <td align="left">
                          Starts/Betrieb gesamt
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNERSTATUS.ALTER', 'int') }}
                      </td>
                      <td align="left">
                          min
                      </td>
                      <td align="left">
                          Letzte Statusänderung
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEB_ZU_STARTS.LETZTE_STUNDE', 'float1') }}
                      </td>
                      <td align="left">
                          mal/h
                      </td>
                      <td align="left">
                          Starts/Betrieb letzte Stunde
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.BRENNERSTATUS.PREV_ALTER', 'int') }}
                      </td>
                      <td align="left">
                          min
                      </td>
                      <td align="left">
                          Vorletzte Statusänderung
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.BETRIEB_ZU_STARTS.LETZTER_TAG', 'float1') }}
                      </td>
                      <td align="left">
                          mal/h
                      </td>
                      <td align="left">
                          Starts/Betrieb letzter Tag
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Außen -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Außen
                      </td>
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.AUSSENTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Außen Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.AUSSENTEMPERATUR_GEDAEMPFT', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Außen Temperatur gedämpft
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Solar -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Solar
                      </td>
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.SOLARKOLLEKTORTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Solarkollektor Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.SOLARSPEICHERTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Solarspeicher Temperatur
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.SOLARWAERMEMENGE', 'int') }}
                      </td>
                      <td align="left">
                          kWh
                      </td>
                      <td align="left">
                          Wärmemenge
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.SOLARAUSBEUTE', 'int') }}
                      </td>
                      <td align="left">
                          Wh
                      </td>
                      <td align="left">
                          Ausbeute heute
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.SOLAR', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Solar Pumpe
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.SOLARBETRIEBSSTUNDEN', 'int') }}
                      </td>
                      <td align="left">
                          h
                      </td>
                      <td align="left">
                          Betriebsstunden
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Heizkreise -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Heizkreise
                      </td>
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="3" align="center">
                          HK1 - Heizkörper KG,DG,DS
                      </td>
                      <td colspan="3" align="center">
                          HK2 - Fußboden EG
                      </td>
      
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.VORLAUFSOLLTEMPERATUR.HK1', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Soll Vorlauf Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.VORLAUFSOLLTEMPERATUR.HK2', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Soll Vorlauf Temperatur
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.VORLAUFISTTEMPERATUR.HK1', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Ist Vorlauf Temperatur
                      </td>
                      <td align="right">
                          {{ basic.print('', gad~'.VORLAUFISTTEMPERATUR.HK2', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Ist Vorlauf Temperatur
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.HK1', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Heizkreis Pumpe
                      </td>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.HK2', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Heizkreis Pumpe
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="3" align="center">
                          {{ basic.symbol('', gad~'.BETRIEBSART.HK1', ['Normalbetrieb (Dauernd)', 'Normalbetrieb (Schaltuhr)', 'Red. Betrieb (Schaltuhr)', 'Abschaltbetrieb'], '', [3,2,1,0], '', ['icon0', 'icon0', 'icon0', 'icon0']) }}
                      </td>
                      <td colspan="3" align="center">
                          {{ basic.symbol('', gad~'.BETRIEBSART.HK2', ['Normalbetrieb (Dauernd)', 'Normalbetrieb (Schaltuhr)', 'Red. Betrieb (Schaltuhr)', 'Abschaltbetrieb'], '', [3,2,1,0], '', ['icon0', 'icon0', 'icon0', 'icon0']) }}
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td colspan="3" align="center">
                          {{ basic.symbol('', gad~'.HEIZART.HK1', ['Normalbetrieb (Dauernd)', 'Heizen und Warmwasser', 'Nur Warmwasser', 'Abschaltbetrieb'], '', [3,2,1,0], '', ['icon0', 'icon0', 'icon0', 'icon0']) }}
                      </td>
                      <td colspan="3" align="center">
                          {{ basic.symbol('', gad~'.HEIZART.HK2', ['Normalbetrieb (Dauernd)', 'Heizen und Warmwasser', 'Nur Warmwasser', 'Abschaltbetrieb'], '', [3,2,1,0], '', ['icon0', 'icon0', 'icon0', 'icon0']) }}
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Warmwasser -->
                  <tr bgcolor=#252525>
                      <td colspan="6" align="center">
                          Warmwasser
                      </td>
                  </tr>
                  <tr bgcolor=#252525>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                      <td colspan="2" align="center">
                          Wert
                      </td>
                      <td>
                          Bezeichnung
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.WARMWASSERSOLLTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Soll Warmwasser Temperatur
                      </td>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.WARMWASSER', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Speicherlade Pumpe
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.WARMWASSERISTTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Ist Warmwasser Temperatur
                      </td>
                      <td colspan="2" align="center">
                          {{ basic.symbol('', gad~'.PUMPE.ZIRKULATION', ['An', 'Aus'], '', [1,0], '', ['icon0', 'icon0']) }}
                      </td>
                      <td align="left">
                          Zirkulations Pumpe
                      </td>
                  </tr>
                  <tr bgcolor=#303030>
                      <td align="right">
                          {{ basic.print('', gad~'.WARMWASSERAUSTRITTSTEMPERATUR', 'float1') }}
                      </td>
                      <td align="left">
                          °C
                      </td>
                      <td align="left">
                          Austritt Warmwasser Temperatur
                      </td>
                      <td colspan="2" align="center">
                          
                      </td>
                      <td align="left">
                          
                      </td>
                  </tr>
                  <!-- Leerzeile -->
                  <tr>
                      <td colspan="6">
                          &nbsp;
                      </td>
                  </tr>
                  <!-- Lesestatus -->
                  <tr>
                      <td colspan="6">
                          {{ basic.stateswitch('', gad~'.UPDATE', 'mini', 1, 'refresh', '', '', 'blink') }}
                          &nbsp;&nbsp;Letzte Aktualisierung {{ basic.print('', gad~'.LAST_READ') }}
                      </td>
                  </tr>
              </table>
          </div>
      
      {% endmacro %}
      Aufgerufen wird es dann entsprechend auf seinen Seiten mit folgendem Befehl:
      Code:
      {% import "widget_my.html" as widget_my %}
      {{ widget_my.icon_and_popup_heizungviessmann('VIESSMANN', 'Heizung Viessmann') }}
      Dazu gehört dann noch die folgende Konfiguration

      Code:
      ZAEHLER:
          HEIZUNG:
              LAST_READ:
                  remark: Wann wurde zuletzt die Schnittstelle genutzt. Dieses Item wird über das Item ANLAGEN_LEISTUNG bei einem Update neu getriggert und geschrieben.
                  name: Letztes Update von
                  type: str
              UPDATE:
                  name: Update aller Items mit 'viess_read'
                  type: bool
                  visu_acl: rw
                  viess_update: 1
                  autotimer: 1 = 0
              ALARMMESSAGE:
                  name: Heizung Alarmmeldung
                  type: bool
                  visu_acl: rw
                  value: false
                  cache: true
              ANLAGEN_LEISTUNG:
                  name: Anlagenleistung
                  type: num
                  viess_read: Anlagenleistung
                  viess_read_cycle: 60
                  viess_init: true
                  database: init
                  on_update: ZAEHLER.HEIZUNG.LAST_READ = sh.ZAEHLER.HEIZUNG.ANLAGEN_LEISTUNG.last_update().strftime('%a %d.%m.%Y %H:%M:%S')
              BRENNER_LEISTUNG:
                  name: Brennerleistung
                  type: num
                  viess_read: Brennerleistung
                  viess_read_cycle: 60
                  viess_init: true
                  database: init
              AUSSENTEMPERATUR:
                  name: Aussentemperatur_TP
                  type: num
                  viess_read: Aussentemperatur_TP
                  viess_read_cycle: 300
                  viess_init: true
                  database: init
              AUSSENTEMPERATUR_GEDAEMPFT:
                  name: Aussentemperatur_Dp
                  type: num
                  viess_read: Aussentemperatur_Dp
                  viess_read_cycle: 300
                  viess_init: true
                  database: init
              BRENNERSTATUS:
                  name: Brennerstatus
                  type: bool
                  cache: true
                  eval: True if (sh.ZAEHLER.HEIZUNG.BRENNER_LEISTUNG() > 0.0) else False
                  eval_trigger:
                    - ZAEHLER.HEIZUNG.BRENNER_LEISTUNG
                  ALTER:
                      # Brenner eingesachaltet
                      name: Dauer des aktuellen Brennerstatus
                      type: num
                      # Berechnung minütlich
                      crontab:
                        - '* * * * = 1'  # crontab Minütlich - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: true    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: (sh.ZAEHLER.HEIZUNG.BRENNERSTATUS.age() / 60)
                  PREV_ALTER:
                      # Brenner eingesachaltet
                      name: Dauer des Brennerstatus zuvor
                      type: num
                      # Berechnung minütlich
                      crontab:
                        - '* * * * = 1'  # crontab Minütlich - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: (sh.ZAEHLER.HEIZUNG.BRENNERSTATUS.prev_age() / 60)
              BRENNERSTARTS:
                  name: Brennerstarts
                  type: num
                  viess_read: Brennerstarts
                  viess_read_cycle: 300
                  viess_init: true
                  database: init
                  LETZTE_STUNDE:
                      name: Brennertstarts innerhalb der letzten Stunde
                      type: num
                      cache: True
                      # Berechnung stündlich
                      crontab:
                        - '0 * * * = 1'  # crontab Stündlich - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: round((sh.ZAEHLER.HEIZUNG.BRENNERSTARTS() - sh.ZAEHLER.HEIZUNG.BRENNERSTARTS.db('min', '1h')), 1)
                  LETZTER_TAG:
                      name: Brennertstarts innerhalb des letzten Tages
                      type: num
                      cache: True
                      database: init
                      # Berechnung täglich
                      crontab:
                        - '0 0 * * = 1'     # crontab Täglich 0 Uhr - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: round((sh.ZAEHLER.HEIZUNG.BRENNERSTARTS() - sh.ZAEHLER.HEIZUNG.BRENNERSTARTS.db('min', '1d')), 1)
              BETRIEBSSTUNDEN:
                  name: Brenner_Betriebsstunden
                  type: num
                  viess_read: Brenner_Betriebsstunden
                  viess_read_cycle: 300
                  viess_init: true
                  database: init
                  LETZTE_STUNDE:
                      name: Betriebsstunden innerhalb der letzten Stunde
                      type: num
                      cache: True
                      # Berechnung stündlich
                      crontab:
                        - '0 * * * = 1'  # crontab Stündlich - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: round((sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1h')), 1)
                  LETZTER_TAG:
                      name: Betriebsstunden innerhalb des letzten Tages
                      type: num
                      cache: True
                      database: init
                      # Berechnung täglich
                      crontab:
                        - '0 0 * * = 1'     # crontab Täglich 0 Uhr - Aufbau: mm(0..59) hh day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: round((sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1d')), 1)
              BETRIEB_ZU_STARTS:
                  name: Betriebsstunden / Brennertstarts
                  type: num
                  eval: round(sh...Brennerstarts() / sh...Brenner_Betriebsstunden(), 2)
                  eval_trigger:
                    - ..Brenner_Betriebsstunden
                    - ..Brennerstarts
                  database: init
                  LETZTE_STUNDE:
                      name: Brennertstarts / Betriebsstunden innerhalb der letzten Stunde
                      type: num
                      cache: True
                      # Berechnung stündlich
                      crontab:
                        - '0 * * * = 1'  # crontab Stündlich - Aufbau: mm(0..59) hh (0..23) day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: (round(((sh.ZAEHLER.HEIZUNG.BRENNERSTARTS() - sh.ZAEHLER.HEIZUNG.BRENNERSTARTS.db('min', '1h')) / (sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1h'))), 1)) if ((sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1h')) > 0) else 0
                  LETZTER_TAG:
                      name: Brennertstarts / Betriebsstunden innerhalb des letzten Tages
                      type: num
                      cache: True
                      database: init
                      # Berechnung täglich
                      crontab:
                        - '0 0 * * = 1'     # crontab Täglich 0 Uhr - Aufbau: mm(0..59) hh (0..23) day(0..28) wday(0=Mo, 1=Di, 2=Mi, 3=Do, 4=Fr, 5=Sa, 6=So)
                      enforce_updates: True    # Updates True, da der Crontab immer mit 1 ausführt und die Berechnung durchgeführt werden soll.
                      eval: (round(((sh.ZAEHLER.HEIZUNG.BRENNERSTARTS() - sh.ZAEHLER.HEIZUNG.BRENNERSTARTS.db('min', '1d')) / (sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1d'))), 1)) if ((sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN() - sh.ZAEHLER.HEIZUNG.BETRIEBSSTUNDEN.db('min', '1d')) > 0) else 0
              KESSELTEMPERATUR:
                  name: Kesseltemperatur_TP
                  type: num
                  viess_read: Kesseltemperatur_TP
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              KESSELSOLLTEMPERATUR:
                  name: Kesselsolltemperatur
                  type: num
                  viess_read: Kesselsolltemperatur
                  viess_read_cycle: 180
                  viess_init: true
              ABGASTEMPERATUR:
                  name: Abgastemperatur
                  type: num
                  viess_read: Abgastemperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              WARMWASSERSOLLTEMPERATUR:
                  name: Abgastemperatur
                  type: num
                  viess_read: Warmwasser_Solltemperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              WARMWASSERISTTEMPERATUR:
                  name: Abgastemperatur
                  type: num
                  viess_read: Warmwasser_Temperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              WARMWASSERAUSTRITTSTEMPERATUR:
                  name: Abgastemperatur
                  type: num
                  viess_read: Warmwasser_Austrittstemperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              BETRIEBSART:
                  HK1:
                      name: Betriebasart 0..3
                      type: num
                      viess_read: Betriebsart_HK1
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
                  HK2:
                      name: Betriebasart 0..3
                      type: num
                      viess_read: Betriebsart_HK2
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
              HEIZART:
                  HK1:
                      name: Heizart 0..4
                      type: num
                      viess_read: Heizart_HK1
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
                  HK2:
                      name: Heizart 0..4
                      type: num
                      viess_read: Heizart_HK2
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
              VORLAUFSOLLTEMPERATUR:
                  HK1:
                      name: Heizart 0..4
                      type: num
                      viess_read: Vorlauftemperatur_Soll_HK1
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
                  HK2:
                      name: Heizart 0..4
                      type: num
                      viess_read: Vorlauftemperatur_Soll_HK2
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
              VORLAUFISTTEMPERATUR:
                  HK1:
                      name: Heizart 0..4
                      type: num
                      viess_read: Vorlauftemperatur_HK1
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
                  HK2:
                      name: Heizart 0..4
                      type: num
                      viess_read: Vorlauftemperatur_HK2
                      viess_read_cycle: 180
                      viess_init: true
                      database: init
              PUMPE:
                  HK1:
                      name: Umwälzpumpe HK1
                      type: bool
                      viess_read: Heizkreispumpe_HK1
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
                  HK2:
                      name: Umwälzpumpe HK2
                      type: bool
                      viess_read: Heizkreispumpe_HK2
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
                  WARMWASSER:
                      name: Umwälzpumpe HK2
                      type: bool
                      viess_read: Speicherladepumpe
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
                  ZIRKULATION:
                      name: Zirkulations Pumpe
                      type: bool
                      viess_read: Zirkulationspumpe
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
                  SOLAR:
                      name: Solar Pumpe
                      type: bool
                      viess_read: SolarPumpe
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
                  INTERN:
                      name: Interne Pumpe
                      type: bool
                      viess_read: Interne_Pumpe
                      viess_read_cycle: 60
                      viess_init: true
                      database: init
              SOLARKOLLEKTORTEMPERATUR:
                  name: Solarkollektor Temperatur [°C]
                  type: num
                  viess_read: Kollektortemperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              SOLARSPEICHERTEMPERATUR:
                  name: Solarspeicher Temperatur [°C]
                  type: num
                  viess_read: Speichertemperatur
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              SOLARBETRIEBSSTUNDEN:
                  name: Solar Betriebsstunden [h]
                  type: num
                  viess_read: Solar_Betriebsstunden
                  viess_read_cycle: 3600
                  viess_init: true
                  database: init
              SOLARWAERMEMENGE:
                  name: Solar Wärmemenge [kWh]
                  type: num
                  viess_read: Solar_Waermemenge
                  viess_read_cycle: 3600
                  viess_init: true
                  database: init
              SOLARAUSBEUTE:
                  name: Solar Ausbeute heute [Wh]
                  type: num
                  viess_read: Solar_Ausbeute
                  viess_read_cycle: 3600
                  viess_init: true
                  database: init
              SAMMELSTOERUNG:
                  name: Sammelstoerung
                  type: num
                  viess_read: Sammelstoerung
                  viess_read_cycle: 180
                  viess_init: true
                  database: init
              ERROR_1:
                  name: Fehlerhistory Eintrag 1
                  type: foo
                  viess_read: Error0
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_2:
                  name: Fehlerhistory Eintrag 2
                  type: foo
                  viess_read: Error1
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_3:
                  name: Fehlerhistory Eintrag 3
                  type: foo
                  viess_read: Error2
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_4:
                  name: Fehlerhistory Eintrag 4
                  type: foo
                  viess_read: Error3
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_5:
                  name: Fehlerhistory Eintrag 5
                  type: foo
                  viess_read: Error4
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_6:
                  name: Fehlerhistory Eintrag 6
                  type: foo
                  viess_read: Error5
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_7:
                  name: Fehlerhistory Eintrag 7
                  type: foo
                  viess_read: Error6
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_8:
                  name: Fehlerhistory Eintrag 8
                  type: foo
                  viess_read: Error7
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_9:
                  name: Fehlerhistory Eintrag 9
                  type: foo
                  viess_read: Error8
                  viess_read_cycle: 3600
                  viess_init: true
              ERROR_10:
                  name: Fehlerhistory Eintrag 10
                  type: foo
                  viess_read: Error9
                  viess_read_cycle: 3600
                  viess_init: true
              ICON_STATUS:
                  # 0 = Störung      Icon = control_x.svg        (rot)
                  # 1 = Solarpumpe   Icon = sani_solar.svg       (weiss)
                  # 2 = Brenner      Icon = sani_boiler_temp.svg (weiss)
                  # 3 = Brenner aus  Icon = sani_boiler_temp.svg (weiss)
                  name: Iconstatus für die Heizung
                  type: num
                  cache: True
                  eval: 0 if (sh.ZAEHLER.HEIZUNG.SAMMELSTOERUNG() == True) else 1 if (sh.ZAEHLER.HEIZUNG.PUMPE.SOLAR() == True) else 2 if (sh.ZAEHLER.HEIZUNG.BRENNER_LEISTUNG() > 0.0) else 3
                  eval_trigger:
                    - ZAEHLER.HEIZUNG.SAMMELSTOERUNG
                    - ZAEHLER.HEIZUNG.PUMPE.SOLAR
                    - ZAEHLER.HEIZUNG.BRENNER_LEISTUNG
      Vielleicht hilft es ja einem und man kann sich etwas rauskopieren und für sich anpassen.

      Gruß
      loeserman
      Zuletzt geändert von loeserman; 11.12.2020, 11:05.

      Kommentar


        Danke. Das könnte super als Widget mit ins Plugin. Und items als Struct.

        Kommentar


          Ich mag da jetzt nicht der Spielverderber sein, aber so unterschiedlich die Heizungen, so unterschiedlich sind auch die verfügbaren und sinnvoll nutzbaren Datenpunkte. Selbst andere Brennerheizungen haben möglicherweise nur die Hälfte der hier "vorgeschlagenen" Items; und von Wärmepumpen oder Soleanlagen brauchen wir gar nicht zu reden.

          Will sagen: das ist bestimmt eine super Lösung, die auf die jeweilige Anlage abgestimmt ist. Und so, wie loeserman das geschrieben hat, ist es als Grundlage für eigene Basteleien sicher nutzbar. Insofern würde ich es meinetwegen in einem Ordner "additional_content" oder "examples" oder so mit reinpacken.

          Als generelle Lösung taugt das leider nicht - das liegt aber nicht an loeserman, sondern an Viessmann und der Art, wie sie die Datenpunkte in den Heizungssteuerungen "einbauen" bzw. freigeben.

          Über Structs habe ich schonmal nachgedacht. Man könnte kleine "Funktionseinheiten" - Fehler, Brenner_HK[123], WP_HK[12], Warmwasser oder so basteln, aber selbst da fängt es schon an. Das eine Gerät hat umfangreiche Fehlerspeicher, das andere fast gar nicht. Bei mir kann man für Warmwasser nur eine Temperatur auslesen, mehr nicht (und manuelles Aufheizen triggern, manchmal). Der gemeinsame Nenner wäre wahrscheinlich bei Außentemperatur, Vorlauftemperatur, Rücklauftemperatur, WW-Temperatur gegeben. Da fehlt den Meisten dann die Hälfte, die der andere jeweils nicht braucht

          Wenn jemand dazu noch ne gute Idee hat, versuche ich gern, das umzusetzen. Aber für ein "generelles" Plugin wäre mir die Widget-Lösung zu speziell, um sie als "das" Widget mitzugeben.

          (OT: bei Kodi wär das was anderes, weil die Mediensteuerung und -anzeige fast überall verwendbar ist... )

          Kommentar


            wenn du das mit dem Protokoll hinbekommst und mal ein / zwei definitionen "vorbaust" bzw aus der xml überträgst, kann ich versuchen den Rest der funktionierenden Adressen raus zu bekommen...

            Kommentar


              Also ich probiere gerade selbst mal da durchzublicken.

              Was mir hier gleich auffällt, dass so vieles Doppelt vorkommt - an Kommandos, die bei mehreren Anlagen gleich sind.

              Ich will damit sagen, dass evtl. die Struktur nicht optimal gewählt wurde. Ich überlege aber gerade selbst, wie das besser aussehen könnte.
              Was mir da gerade in den Sinn kommt ist eine kleine sqllite db. Aber evtl. wäre das auch in der aktuellen Form brauchbar umsetzbar..

              Und was jetzt schon nach dem 2. Device begonnen hat, dass die Namen der Objekte unterschiedlich genannt werden.

              Wäre es nicht sinnvoll eine Struktur vorzugeben?

              Ich meine damit zB.: Einmal heist es DevType - einmal Anlagentyp

              Code:
              [FONT=monospace][COLOR=#000000]commandset = { [/COLOR]
                 [COLOR=#54ff54][B]'V200KO1B'[/B][/COLOR][COLOR=#000000]: {[/COLOR][/FONT]
              [FONT=monospace][COLOR=#54ff54][B]'DevType'[/B][/COLOR][COLOR=#000000]:                  {[/COLOR][COLOR=#54ff54][B]'addr'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#54ff54][B]'00F8'[/B][/COLOR][COLOR=#000000], [/COLOR][COLOR=#54ff54][B]'len'[/B][/COLOR][COLOR=#000000]: 8, [/COLOR][COLOR=#54ff54][B]'unit'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#54ff54][B]'DT'[/B][/COLOR][COLOR=#000000],      [/COLOR][COLOR=#54ff54][B]'set'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#ff54ff][B]False[/B][/COLOR][COLOR=#000000]},   [/COLOR][COLOR=#ff5454][B] # Heizungstyp[/B][/COLOR][/FONT]
              [FONT=monospace][COLOR=#000000]  },[/COLOR][/FONT]
              [FONT=monospace][COLOR=#54ff54][B]'V200WO1C'[/B][/COLOR][COLOR=#000000]: {[/COLOR][/FONT]
              [FONT=monospace][COLOR=#54ff54][B]'Anlagentyp'[/B][/COLOR][COLOR=#000000]:               {[/COLOR][COLOR=#54ff54][B]'addr'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#54ff54][B]'00F8'[/B][/COLOR][COLOR=#000000], [/COLOR][COLOR=#54ff54][B]'len'[/B][/COLOR][COLOR=#000000]: 2, [/COLOR][COLOR=#54ff54][B]'unit'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#54ff54][B]'DT'[/B][/COLOR][COLOR=#000000],      [/COLOR][COLOR=#54ff54][B]'set'[/B][/COLOR][COLOR=#000000]: [/COLOR][COLOR=#ff54ff][B]False[/B][/COLOR][COLOR=#000000]},     [/COLOR][COLOR=#ff5454][B] # getAnlTyp -- Information - Allgemein: Anlagentyp (204D)[/B][/COLOR][/FONT]
              [FONT=monospace][COLOR=#000000]  },[/COLOR][/FONT]
              }
              Dann wird es auch einfacher sowas wie Templates zu erstellen, die für alle gehen. Die könnte man dynamisch Auswerten ala: (If TempA) print TempA bzw If DevTyp = X usw

              Zuletzt geändert von TCr82; 11.12.2020, 20:59.

              Kommentar


                Die uneinheitliche Struktur und Benennung liegt einfach daran, dass da viele Leute zu beigetragen haben, es aber niemand zentral verwaltet hat. Der eine nimmt die Originalbezeichnungen von Viessmann, der andere welche, die ihm passen (und ggf. kürzer sind), wieder andere nehmen die Beispielbezeichnungen von vcontrold. Dann gibts auch noch englische Namen dazwischen, damit es auch schön bunt wird

                Im Prinzip ist aber auch egal, wie es heißt, da ja kaum zwei Heizungstypen die gleichen Funktionssätze haben, insofern muss man ja eh jedes Mal neu alle Daten zusammensuchen. Ich versuche natürlich, in der commands.py alle Kommandos so weit wie möglich einheitlich zu benennen...

                Kommentar


                  Ich versuche gerade, mich durch die möglichen und "sinnvollen" Befehle für die V200KW2 zu kämpfen.

                  Kann mir einer von euch sagen, was die "Heizkreise" (?) A1 und M1 sind bzw. bedeuten? In den neueren Heizungen gibt es ja meist HK1/HK2/HK3...

                  Kommentar


                    Zitat von Morg Beitrag anzeigen
                    Kann mir einer von euch sagen
                    HK1, 2, 3, sind allgemeine Bezeichnungen für die Heizkreise (durchnummeriert).
                    Bei Viessmann wird es wohl spezifischer angegeben. A1 etc sind Heizkreise ohne Mischer (für was das A genau steht, weiß ich auch nicht); M1 etc sind Heizkreise mit Mischer, daher das M.

                    Bei mit ist HK1 = A1 also Heizkreis ohne Mischer, die VL-Temp entspricht der des Heizkessels. Deshalb gibt es den Datenpunkte VL-Temp A1 auch nicht, da es gleich der Temp des Heizkessels ist. HK2 ist bei mir M2, also Heizkreis mit Mischer.

                    Allgemein wird er HK1 auch A1M1 genannt, da dieser Kreis ohne Mischer (dann A1) oder mit Mischer (dann M1) betrieben werden kann. Die Mischeransteuerung ist ein zusätzliches Gerät, dass an den internen Bus der Vitotronic angeschlossen ist.

                    Reicht Dir das?

                    BTW: Das KW2 Protokoll sollten wir auch testen können, dann die Steuerungen die P300 können, können auch KW2.

                    Kommentar


                      Ja, danke, das bringt mir etwas Licht ins Dunkel

                      (Ich glaube, ich habe noch nie irgendwo gewohnt, wo es zwei Heizkreise gab... komisch eigentlich. Sind die für verschiedene Räume?)

                      Zum Protokoll: soweit ich das jetzt verstanden habe, ist KW2 (oder KW?) wohl vergleichbar mit P300, nur ohne Status (initialized) und ohne Prüfsummen. Ich hoffe, dass das einigermaßen problemlos umzusetzen ist Ja, testen werde ich es hier auf jeden Fall mal, und wenn es - erstmal - fehlerfrei läuft, "dürft" ihr nochmal test, insbesondere dann TCr82, damit wir seine Datenpunkte überprüfen können, bevor das "online" geht.

                      Updates checke ich in mein Repo erst ein, wenn es hier fehlerfrei läuft, insofern ist das vielleicht nicht immer ganz aktuell ich melde mich, sobald ich was habe.

                      Kommentar


                        Zitat von Morg Beitrag anzeigen
                        (Ich glaube, ich habe noch nie irgendwo gewohnt, wo es zwei Heizkreise gab... komisch eigentlich. Sind die für verschiedene Räume?)
                        Die typische Anwendung ist der Mischbetrieb von normalen Heizkörpern an A1 (die eine höhere Vorlauftemp brauchen) und Fußbodenheizung mit niedriger Vorlauftemp (so ist es bei mir) oder Heizung im Haus mit 2 Wohneinheiten, und jede hat einen HKL.

                        Zitat von Morg Beitrag anzeigen
                        Zum Protokoll: soweit ich das jetzt verstanden habe, ist KW2 (oder KW?) wohl vergleichbar mit P300, nur ohne Status (initialized) und ohne
                        So schein es zu sein, zumindest steht es so auf der vcontrold Seite (hatte ich oben verlinkt)
                        Zitat von Morg Beitrag anzeigen
                        damit wir seine Datenpunkte überprüfen
                        Die Datenpunkte stehen auch auf der vcontrold Seite in einer Tabelle. Hab hier auch noch was dazu gefunden

                        Kommentar


                          So, KW ist implementiert und die beiden Heizungen habe ich aufgenommen.

                          Bei mir (aktuelle V200WO1C) geht alles mit P300 genauso wie mit KW, ich kann keine funktionalen Unterschiede feststellen.

                          Aber:

                          Da KW einen Schreibvorgang am Interface immer nur nach dem 0x05 akzeptiert, dauern umfangreiche Zugriffe etwas länger. Meine cycle umfasst 21 Items. Mit P300 dauert das 4,6 Sekunden, mit KW 14 Sekunden. Immer noch handlebar, aber deutlich länger.

                          Die Möglichkeit, weitere Kommandos direkt anzuhängen, ist mir bekannt. Dafür muss ich aber das ganze Sende-/Empfangsteil _komplett_ umschreiben, weil ich dann eine Queue für mehrere Kommandos einrichten müsste (sonst wüsste das Plugin ja nicht, dass mehrere Befehle unmittelbar aufeinander folgen), und um konkurrierende Zugriffe zu vermeiden, müsste der IO-Thread ausgelagert werden.

                          Das ist prinzipiell kein Problem (machen kodi und yamahayxc im Prinzip genauso), aber das Umschreiben der bisherigen Routinen wird dann etwas aufwändiger. Wenn Bedarf dafür da ist, müsste der bitte geäußert werden, dann würde ich das machen, ansonsten erst mal nicht.

                          Bitte testet das Plugin wie gehabt
                          - in eurer Standardkonfiguration (keine neuen Fehler)
                          - in eurer Standardkonfiguration, aber mit Protokoll 'KW' (neuen Code)
                          - mit euren Heizungen, die bisher nicht drin waren (Protokollcode und Adressen!)

                          Insbesondere für TCr82: bitte probiere mal alle Datenpunkte aus, die in eingebaut habe, und gib mir ein Feedback, ob die ok sind oder ob es Fehler oder (bei KW) unplausible Daten gibt (das könnten dann Fehler sein). Wenn dir noch Punkte fehlen, kannst du die gern selbst ergänzen oder mir mitteilen, welche ich an welchen Adressen zufügen soll.

                          https://github.com/Morg42/viessmann

                          Kommentar


                            Super, mache ich gleich mal Danke!

                            EDIT:

                            ok, scheinbar bin ich zu doof

                            2020-12-12 21:06:22 ERROR plugins.viessmann Sets s, y, s, t, e, m, , s, c, h, e, m, e, s for heating type V200KW2 could not be found!
                            Parameter in der plugin.yaml
                            Code:
                            viessmann:
                               plugin_name: viessmann
                               serialport: /dev/ttyOptolink
                               heating_type: V200KW2
                               protocol: KW
                            Hab auch als type 2098 versucht, annähernd selbes Ergebnis.

                            2020-12-12 21:10:00 ERROR plugins.viessmann Sets c, o, m, m, a, n, d, o, p, e, r, a, t, i, n, g, , m, o, d, e, s, s, y, s, t, e, m, , s, c, h, e, m, e, s for heating type 2098 could not be found!
                            EDIT2:
                            Ok, ich sehe gerade was fehlt, versuche das erstmal selbst rein zu bauen. - bzw hab jetzt erstmal die systemschemes von V200KO1B für V200KW2 kopiert
                            Zuletzt geändert von TCr82; 12.12.2020, 22:16.

                            Kommentar


                              Ok, hab jetzt mal ne minimale item konfig gemacht:

                              Code:
                              technik:
                                  heizung:
                                      Aussentemperatur:
                                          name: Aussentemperatur
                                          type: num
                                          viess_read: Aussentemperatur
                                          viess_read_cycle: 300
                                          viess_init: true
                                      Kesseltemperatur:
                                          name: Kesseltemperatur
                                          type: num
                                          viess_read: Kesseltemperatur
                                          viess_read_cycle: 180
                                          viess_init: true
                                      Kesselsolltemperatur:
                                          name: Kesselsolltemperatur
                                          type: num
                                          viess_read: Kesselsolltemperatur
                                          viess_read_cycle: 180
                                          viess_init: true
                                      WarmwasserSolltemperatur:
                                          name: Warmwasser_Solltemperatur
                                          type: num
                                          viess_read: Warmwasser_Solltemperatur
                                          viess_read_cycle: 180
                                          viess_init: true
                                      Warmwassertemperatur:
                                          name: Warmwassertemperatur
                                          type: num
                                          viess_read: Warmwasser_Temperatur
                                          viess_read_cycle: 180
                                          viess_init: true
                              Bekomme leider diese Fehler:
                              2020-12-12 21:38:21 WARNING lib.smarthome -------------------- Init SmartHomeNG 1.7.2c.b9936a87.develop --------------------
                              2020-12-12 21:38:21 WARNING lib.smarthome Running in Python interpreter 'v3.8.5 final' on Linux-5.4.0-1022-raspi-armv7l-with-glibc2.29 (pid=11643)
                              2020-12-12 21:38:22 WARNING lib.shtime Nutze Feiertage für Land 'DE', Provinz 'None', State 'None', 1 benutzerdefinierte Feiertagsdefinition(en) definiert
                              2020-12-12 21:38:28 WARNING lib.smarthome SmartHomeNG initialization finished
                              2020-12-12 21:38:28 WARNING plugins.viessmann Communication no longer initialized, trying to reestablish.
                              2020-12-12 21:38:30 ERROR plugins.viessmann Received 0 bytes chunk - ignoring response_packet! chunk was: b''
                              2020-12-12 21:38:33 ERROR plugins.viessmann Received 0 bytes chunk - ignoring response_packet! chunk was: b''
                              2020-12-12 21:38:33 ERROR plugins.viessmann send_command failed with error: Error receiving response: 'ISNON'.
                              2020-12-12 21:38:36 ERROR plugins.viessmann Received 0 bytes chunk - ignoring response_packet! chunk was: b''
                              Und das einzige was er eingesammelt hat, ist die Kesseltemperatur, alles andere steht auf 0

                              Hab mal das Debug Logfile als Anlage angehängt.
                              Angehängte Dateien
                              Zuletzt geändert von TCr82; 12.12.2020, 23:12.

                              Kommentar


                                Hm...

                                vorweg: die ganzen Meldungen zu "communication initialized" bzw. nicht initialisiert: das gibts bei KW nicht, habe ich jetzt rausgeschmissen. Auch einige andere Meldungen habe ich noch angepasst.

                                Erstmal zu den Punkten, wo er was empfangen hat. Beim zweiten Wert fehlte eine Einheitendefinition in der commands.py, das sollte jetzt gehen.

                                Kesseltemperatur = 73.4, das scheint mir plausibel?
                                Warmwasser_Solltemperatur = 0x33 = 48 - passt das bei dir?

                                Dann wären das zwei Werte, auf die die Heizung schonmal (richtig) reagiert hat.

                                Es gibt zwei Möglichkeiten für die weiteren "Fehler", die mir spontan einfallen:

                                a) ich habe etwas fundamental verkehrt gemacht bei der Implementierung, ggf. beim Timing;
                                b) deine Anlage kennt die abgefragten Adressen nicht, und KW antwortet nicht mit "Fehler", sondern gar nicht (b'', leeres Byte, nichts gelesen)

                                a) wäre mir unsympathisch aber ich wüsste jetzt auch nicht, wo es haken sollte. Mit meiner Anlage hat er fast ne Stunde alle 30 Sekunden in KW geredet, und alle Daten bekommen, nach denen ich gefragt habe (und die er sonst über P300 abfragt).

                                b) scheint mir die wahrscheinlichere Ursache. Leider ist eine vermeintliche Systematik bei Viessmann über die Geräte hinweg nicht erkennbar. Da wäre die einzige Möglichkeit, herumzuprobieren.
                                Ich habe ursprünglich versucht, aus deiner vcontrold-Konfiguration Adressen zu extrahieren; es war aber nicht immer eindeutig, ob die auch für deine Anlage zutreffen. Michael hatte oben noch ein PDF mit Adressen verlinkt, die habe ich mal probeweise eingetragen.

                                Ich meine, vcontrold hätte auch die Testkonfiguration, wo du auch die Adresse als Argument übergeben kannst und die vorher nicht erst definieren musst - gettestaddr heißt das. Das sollte bei openV beschrieben sein, vielleicht kannst du damit mal ein paar Adressen aus der Konfig testen.

                                Ich habe das Logging mal noch etwas an KW angepasst. Meine Vermutung ist, dass KW entweder mit einem Wert antwortet oder gar nicht, "Fehler" ist nicht definiert, es gibt ja keine Statusbytes in der Antwort. Beim Schreiben gibt es "0x00" als Antwort "OK"; ich vermute, wenn das Schreiben fehlschlägt, dass die Anlage dann auch einfach nicht antwortet. Das würde auch das Verhalten erklären und uns auf die Suche nach gültigen Datenpunkten für deine Heizung schicken.

                                Probier es bitte nochmal aus; da ich tatsächlich noch Fehlerbehebungen und generelle Änderungen am Logging vorgenommen habe, habe ich die neue Version auf Github hochgeladen.

                                Kommentar

                                Lädt...
                                X