Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

  • TCr82
    antwortet
    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...

    Einen Kommentar schreiben:


  • Morg
    antwortet
    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... )

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • loeserman
    antwortet
    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.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    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?

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    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..

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Ob deine Heizung nur KW2 kann oder auch P300, weiß ich natürlich nicht. Ich habe mich auch mit KW2 nie wirklich beschäftigt; aber die Konfiguration in der vcontrold.xml sieht für mich seltsam aus; die Kommandosequenzen sind für KW2 und P300 identisch. Da hätte ich jetzt was anderes erwartet.
    Hallo,
    soweit ich weiß, kann die Vitotronic 200 nur das KW2 Protokoll. Die Sequenzen sind zwischen KW2 und P300 unterschiedlich. Das KW2 Protokoll ist hier beschrieben.
    Die Datentypen (zumindest ein Auszug) findest sich hier.

    Morg
    Nachdem das Plugin bei uns ja nun schon einige Zeit läuft, könnten wir es doch auch noch in den nächsten shNG Release bringen, oder?
    Auch die Timer setzten etc mit Anbindung an smartVISU klappt stabil.

    Beste Grüße

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Ich habe nicht all zu viel von der Konfig benutzt, kann also nicht sagen ob alles wirklich korrekt ist. Ich hatte damals mit vielen verschiedenen Konfigs herum probiert und bin letztlich bei der hängen geblieben.

    Ich weiss aber wie bereits schon erwähnt dass der Mischer von HK2 nicht die richtige % angezeigt hatte mit der Konfig (zeigte immer 100%).

    Benutzt habe ich folgendes:

    getTempA, getTempWWist, getTempWWsoll, getTempKist, getTempKsoll, getBrennerStufe, getTempVListM2, getTempVLsollM1, getTempVLsollM2, getPumpeStatusM2, getPumpeStatusSp, getMischerM2***, getBetriebArtM1, getBetriebArtM2

    edit:

    Code:
    [FONT=monospace][COLOR=#54ff54][B]root@heizung[/B][/COLOR][COLOR=#000000]:[/COLOR][COLOR=#5454ff][B]~[/B][/COLOR][COLOR=#000000]# vclient -c getTempA,getTempWWist,getTempWWsoll,getTempKist,ge tTempKsoll,getBrennerStufe,getTempVListM2,getTempV LsollM1,getTempVLsollM2,getPumpeStatusM2,getPumpeS tatusSp,getMischerM2,getBetriebAr[/COLOR]
    tM1,getBetriebArtM2
    getTempA:
    3.200000 Grad Celsius
    getTempWWist:
    37.099998 Grad Celsius
    getTempWWsoll:
    51.000000 Grad Celsius
    getTempKist:
    71.099998 Grad Celsius
    getTempKsoll:
    71.400002 Grad Celsius
    getBrennerStufe:
    0
    getTempVListM2:
    38.900002 Grad Celsius
    getTempVLsollM1:
    -0.100000 Grad Celsius
    getTempVLsollM2:
    -0.100000 Grad Celsius
    getPumpeStatusM2:
    1
    getPumpeStatusSp:
    0
    getMischerM2:
    100.000000 %
    getBetriebArtM1:
    H+WW
    getBetriebArtM2:
    H+WW[/FONT]
    Ich muss sagen, getTempVLsollM1 und getTempVLsollM2 sieht auch nicht richtig aus, bin mir aber nicht sicher ob das die ganze Zeit so war...
    Zuletzt geändert von TCr82; 10.12.2020, 23:01.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Also, die vito.xml ist ziemlich Kraut und Rüben, aber das sollte sich klären lassen.

    Ob deine Heizung nur KW2 kann oder auch P300, weiß ich natürlich nicht. Ich habe mich auch mit KW2 nie wirklich beschäftigt; aber die Konfiguration in der vcontrold.xml sieht für mich seltsam aus; die Kommandosequenzen sind für KW2 und P300 identisch. Da hätte ich jetzt was anderes erwartet.

    Ich kann es dir am Wochenende ja mal zusammenbasteln und lade eine neue Version ins develop hoch. Dann probierst du einfach mal, ob es mit P300 geht; und wenn nicht, dann setze ich mich nochmal an die Protokollspezifikation und schreibe das KW2-Protokoll eben auch noch ins Plugin.

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    voller Elan hab ich heute den Raspi2 im Keller von Ubuntu 18.04 auf 20.04 umformatiert und shNG drauf gespielt.
    Natürlich hab ich Idiot vergessen meine zwei Skripte weg zu sichern

    Aber was solls, das leben geht weiter

    Also das komplette /etc hab ich natürlich weg gesichert - inkl. der vcontrold.xml und vito.xml

    Ich hab das mal als Anhang ran gehängt.

    Ich hab schon gesehen, dass das Protokoll KW2 und die Heizung V200KW2 nicht unterstützt ist - oder irre ich mich?
    Angehängte Dateien
    Zuletzt geändert von TCr82; 10.12.2020, 22:14.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Die Konfiguration ist nicht weniger problematisch als bei vcontrold - du brauchst die Funktionen, die Adressen und den Datentyp.

    Wenn du mir deine vcontrold-Konfiguration schickst, kann ich das in das Plugin einbauen, dann musst du das nur noch richtig konfigurieren. Oder hast du ggf. sogar eine der Anlagen, die schon "drin" sind?

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Hey danke, das https://knx-user-forum.de/forum/supp...zu-smarthomeng hatte ich auch gerade gefunden. Da muss ich mich mal wieder erst mal einlesen und vor alle dem Zeit finden.

    Speziell muss ich erst mal testen wie dein Plugin mit meiner Vitotronic 200 Typ KW2 funktioniert. Das rum hantieren mit den Adressen und Protokollen fand ich leider schon beim vcontrold dermaßen .... deswegen habe ich da nur lesend zugegriffen... Aber habe es zb auch nie hinbekommen alles richtig auszulesen.

    Z.B. funktioniert alles, bis auf den % Wert des Mischers der in HK2 verbaut ist. Hatte ich das Protokoll gewechselt, dann hatte ich den Mischer aber was anders ging nicht mehr...

    Hoffentlich finde ich demnächst mal Zeit das zu testen

    Gruß und Danke nochmal.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von TCr82 Beitrag anzeigen
    Das Plugin ersetzt vcontrold, so wie ich es verstanden habe?!
    Genau so ist es realisiert.

    Zitat von TCr82 Beitrag anzeigen
    ch kann auf dem Raspi im Keller natürlich auch shNG drauf bauen mit dem Plugin.... aber die Daten müssen ja dann nach oben kommen auf den Haupt-shNG server...
    Da bist Du denke ich auf dem richtigen Weg. Während der Entwicklung des Plugins hatte ich das ähnlich. Mit Test-RPI hatte das Plugin und hat die Daten auf den Haupt-RPI übertragen. Beides natürlich mit shNG.
    Schau mal hier, hier und hier
    Der Austausch geht über network plugin pder mqtt.

    Beste Grüße
    Michael

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Hey, das ist ja GOIL.... sowas habe ich mir schon die ganze Zeit gewünscht...

    Das Plugin ersetzt vcontrold, so wie ich es verstanden habe?!

    Bleibt für mich nur ein kleines Problem..... Mein Raspi mit vcontrol ist im Keller mit dem Optolink an der Heizung und per WLAN am Netzwerk.
    Mein Smarthome-PC ist im EG im 19" Kasten eingebaut und Ruft die Daten von vcrontrol (lesend) momentan über ein von mir gebasteltes Skript über einenen Mini-HTTP Webserver vom Raspi per JSON ab.

    Hat wer ne Idee, wie man das umbauen könnte?

    Ich kann auf dem Raspi im Keller natürlich auch shNG drauf bauen mit dem Plugin.... aber die Daten müssen ja dann nach oben kommen auf den Haupt-shNG server...

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Mit dem item-Property bekommst du den letzten Lesezeitpunkt sogar für jedes Item einzeln

    Gut, wenns für dich passt!

    Einen Kommentar schreiben:

Lädt...
X