Ankündigung

Einklappen
Keine Ankündigung bisher.

Temperatur Sollwertverschiebung B.IQ

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

  • koend
    antwortet
    Hallo,

    vielen Dank euch beiden. In der Zeit zwischen euren Beiträgen war ich schon mit dem Schreiben eines "wiregate"-Skripts begonnen, siehe unten.
    Die out-of-the-box Lösung von Chris kriege ich nicht zum Laufen: bei Änderungen der Solltemperatur in der Visu springt die Solltemperatur vom B.IQ nach zwei Klicks auf den Wert des Frostschutzes... keine Lust mich damit rumzuschlagen weil das Hilfsskript funktioniert (und ich keinen Lösungsansatz habe für dieses komisches Verhalten).

    Das Skript wertet eine Proxy-GA aus, die von der Visu beschrieben und gelesen wird. Das Skript liest Werte vom B.IQ aus (Soll Temp, Ist-Verschiebung), errechnet und sendet einen Verschiebungswert.

    HTML-Code:
    <infoformat="%.1f °C">
    <layoutcolspan="2"/>
    <label><iconname="temp_temperature"/>Ist</label>
    <addresstransform="DPT:9.001"mode="read">9/1/3</address>
    </info>
    <infotriggerupvalue="0.5"shortupvalue="0.5"downvalue="-0.5"shortdownvalue="-0.5"uplabel="+"downlabel="-"change="absolute"format="%.1f °C"align="left"infoposition="middle">
    <layoutcolspan="4"/>
    <label><iconname="temp_control"/>Soll</label>
    <addresstransform="DPT:9.001"mode="readwrite">9/2/201</address>
    </infotrigger>
    <triggervalue="0"shortvalue="0"bind_click_to_widget="true">
    <layoutcolspan="2"/>
    <label>reset Soll-Verschiebung</label>
    <addresstransform="DPT:6.010"mode="write"variant="absolute">9/2/19</address>
    </trigger>

    Skript:
    PHP-Code:
    no warnings 'redefine';
    ################################################## ##################################################
    # actorBerkerSollTemperature
    # v0.1, 2021-04-19
    # (c) 2021 kg, GPL (v3)
    #
    # Acts as a proxy between cometvisu and a Berker B.IQ RTR:
    # - Enables cometvisu infotrigger to display temperature (proxy group address) but sends Sollwertverschiebung in absolute steps to B.IQ
    # - Receives SOLL temperature from Berker B.IQ and passes through to cometvisu
    # - Periodically resets Sollwertverschiebung to 0
    #
    # Thanks to many, e.g.
    # - https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/code-schnipsel/10198-taupunkt
    # - https://knx-user-forum.de/forum/supportforen/cometvisu/1643343-temperatur-sollwertverschiebung-b-iq
    ################################################## ##################################################


    ### CONFIGURATION

    # debugging on/off
    my $debugBerker '0';

    my @berkers;
    push @berkers, {
    sollTempGA =&gt'9/2/12'# ETS object 50
    verschiebungIstGA =&gt'9/2/17'# ETS object 52
    verschiebungSollGA =&gt'9/2/19'# ETS object 53
    proxyGA =&gt'9/2/201',
    # as defined in ETS
    temperatureStep =&gt'0.5',
    room =&gt'Eßzimmer',
    roomIdent =&gt'EK',
    # in minutes
    maxVerschiebungTime =&gt'120',
    varTimeVerschiebungEnabled =&gt'EK_biqEnabledAt',
    };

    push @berkers, {
    sollTempGA =&gt'9/2/22',
    verschiebungIstGA =&gt'9/2/27',
    verschiebungSollGA =&gt'9/2/29',
    proxyGA =&gt'9/2/202',
    # as defined in ETS
    temperatureStep =&gt'0.5',
    room =&gt'Wohnzimmer',
    roomIdent =&gt'WK',
    # in minutes
    maxVerschiebungTime =&gt'120',
    varTimeVerschiebungEnabled =&gt'WK_biqEnabledAt',
    };

    ### end CONFIGURATION

    my $berker;
    my $checkCycleTime 602;

    # http://knx-user-forum.de/wiregate/17791-pruefung-ob-plugin-durch-codeaenderung-ausgefuehrt.html
    if (!$plugin_initflag || ($plugin_info{$plugname.'_lastsaved'} &gt$plugin_info{$plugname.'_last'})) {

    # subscribe to GA
    foreach $berker (@berkers) {
    $plugin_subscribe{$berker->{proxyGA}}{$plugname} = 1;
    $plugin_subscribe{$berker->{sollTempGA}}{$plugname} = 1;
    #$plugin_subscribe{$berker->{verschiebungIstGA}}{$plugname} = 1;

    plugin_log($plugname,'INIT Subscribed to B.IQ in room '.$berker->{room}.':');
    plugin_log($plugname,'- Proxy GA : '.$berker->{proxyGA});
    plugin_log($plugname,'- Soll temperature GA : '.$berker->{sollTempGA});
    #plugin_log($plugname,'- Verschiebung IST GA: '.$berker->{verschiebungIstGA});


    # Wiregate performs reload of all scripts from time to time.
    # When this script is running in periodic check modus, that _cycle gets reset to 0, meaning
    # that heating modus is never reset.
    if (time() - $plugin_info{$berker->{varTimeVerschiebungEnabled}} >= ($berker->{maxVerschiebungTime} * 60)) {
    # disable update cycle for now, react to GA only
    plugin_log($plugname,'- No cyclic calling during initialisation');
    $plugin_info{$plugname.'_cycle'} = 0;
    }
    # go into cyclic checking
    else {
    plugin_log($plugname,'- Enabling cyclic calling during initialisation');

    $plugin_info{$plugname.'_cycle'} = $checkCycleTime;
    }
    }
    }

    # Aufruf durch Telegramm
    elsif (%msg) {
    CHECKING: foreach $berker (@berkers) {
    if (
    $debugBerker) {
    plugin_log($plugname,'Telegram --------------------------------------------------------------');
    plugin_log($plugname,'msg{dst} :'.$msg{'dst'}.'|');
    plugin_log($plugname,'msg{data}:'.$msg{'data'}.'|' );
    plugin_log($plugname,'B.IQ proxy GA:'.$berker->{proxyGA}.'|');
    }

    # proxy GA
    if ($msg{'apci'eq 'A_GroupValue_Write' &&amp$msg{'dst'eq $berker->{proxyGA}) {
    my $sollBiq knx_read($berker->{sollTempGA},0,'9.001');
    my $sollVisu decode_dpt9($msg{'data'});
    my $verschiebung $sollVisu $sollBiq;

    if (
    $debugBerker) {
    plugin_log($plugname,'cometvisu SOLL: '.$sollVisu);
    plugin_log($plugname,'B.IQ Basis : '.$sollBiq);
    plugin_log($plugname,'Verschiebung : '.$verschiebung);
    }

    if (
    $verschiebung != 0) {
    my $verschiebungIST knx_read($berker->{verschiebungIstGA},0,'6.010');
    $verschiebung $verschiebungIST + ($verschiebung $berker->{temperatureStep});
    if (
    $debugBerker) {
    plugin_log($plugname,'Verschiebung IST : '.$verschiebungIST);
    plugin_log($plugname,'Updating time and sending value to GA '.$berker->{verschiebungSollGA}.': '.$verschiebung);
    }

    knx_write($berker->{verschiebungSollGA},$verschiebung,'6.010');

    $plugin_info{$berker->{varTimeVerschiebungEnabled}} = time();
    $plugin_info{$plugname.'_cycle'} = $checkCycleTime;
    }
    last CHECKING;
    }

    # Not required: if soll temperature is changed elsewhere, B.IQ sends new value
    # # verschiebungIST
    # if ($msg{'apci'} eq 'A_GroupValue_Write' && $msg{'dst'} eq $berker->{verschiebungIstGA}) {
    # my $currentSoll = knx_read($berker->{sollTempGA},0,'9.001');
    # knx_write($berker->{proxyGA},$currentSoll,'9.001');
    #
    # if ($debugBerker) {
    # plugin_log($plugname,'Writing SOLL temperature to proxy GA '.$berker->{proxyGA}.': '.$currentSoll);
    # }
    # }

    # B.IQ SOLL temperature
    if ($msg{'apci'eq 'A_GroupValue_Write' &&amp$msg{'dst'eq $berker->{sollTempGA}) {
    knx_write($berker->{proxyGA},decode_dpt9($msg{'data'}),'9.001');
    if (
    $debugBerker) {
    plugin_log($plugname,'Writing SOLL temperature for B.IQ in room '.$berker->{room}.': '.decode_dpt9($msg{'data'}));
    }
    last CHECKING;
    }
    }
    if (
    $debugBerker) {plugin_log($plugname,'END TG --------------------------------------------------------------');}
    }
    # Aufruf durch Daten am Socket
    elsif ($fh) {
    }
    # Aufruf durch Zyklus
    else {
    if (
    $debugBerker) {
    plugin_log($plugname,'Cycle check --------------------------------------------------------------');
    }

    # time's up, switch back to basic soll temperature
    # only if enabled by script
    my $cyclicCallingRequired 0;
    foreach 
    $berker (@berkers) {

    my $duration time() - $plugin_info{$berker->{varTimeVerschiebungEnabled}};

    if (
    $debugBerker) {
    plugin_log($plugname,'B.IQ :'.$berker->{room});
    plugin_log($plugname,'max time in sec:'.$berker->{maxVerschiebungTime} * 60);
    plugin_log($plugname,'Timestamp :'.$plugin_info{$berker->{varTimeVerschiebungEnabled}});
    plugin_log($plugname,'Duration in seconds since Verschiebung was done: '.$duration);
    }

    if (
    $plugin_info{$berker->{varTimeVerschiebungEnabled}} &gt0) {
    if (
    $duration >= ($berker->{maxVerschiebungTime} * 60)) {

    knx_write($berker->{verschiebungSollGA},0,'6.010');

    $plugin_info{$berker->{varTimeVerschiebungEnabled}} = '';

    if (
    $debugBerker) {
    plugin_log($plugname,'Removing time stamp from: '.$berker->{varTimeVerschiebungEnabled})
    }
    }
    # keep verschiebung
    else {
    $cyclicCallingRequired 1;
    if (
    $debugBerker) {
    plugin_log($plugname,'Keeping Verschiebung active for B.IQ in room: '.$berker->{room});
    }
    }
    }
    }

    if (
    $cyclicCallingRequired == 0) {
    plugin_log($plugname,'Disable cyclic calling');
    $plugin_info{$plugname.'_cycle'} = 0;
    }
    if (
    $debugBerker) {plugin_log($plugname,'END cycle --------------------------------------------------------------');}
    }

    undef(@berkers);
    undef($berker);
    return 
    0

    Einen Kommentar schreiben:


  • Chris M.
    antwortet
    Ich habe auch einen B.IQ (genau einen einzigen der Temperatur regelt, den Rest macht eine Logik auf dem Wiregate bzw. inzwischen Timberwolf Server).
    Die Visu-Seite mit allen Temperaturen sieht dann z.B. so aus:
    Screenshot_20210415_222653.png
    Die Konfig dafür ist:
    HTML-Code:
    <info format="%.2f°C">
      <label>Wohnzimmer</label>
      <address transform="DPT:9.001" mode="read">4/0/50</address>
    </info>
    <infotrigger uplabel="wärmer" upvalue="0.5" downlabel="kälter" downvalue="-0.5" align="center" infoposition="middle" format="%.1f°C" change="absolute">
      <address transform="DPT:9.001" mode="read">3/3/50</address>
      <address transform="DPT:9.001" mode="write">3/3/51</address>
    </infotrigger>
    Und in der ETS ist die Konfig:
    Screenshot_20210415_223212.png Das ganze läuft so nun schon seit 10 Jahren so zuverlässig, dass ich mich nie mehr damit beschäftigt habe.

    Einen Kommentar schreiben:


  • peuter
    antwortet
    Mir fällt da so recht kein Weg ein, außer Du könntest a selbst berechnen in einem Mapping. Wenn die Basis bekannt und fix ist, sollte das ja gehen. Also etwa so:

    Code:
     <meta>
        <mappings>
          <mapping name="berkeriq">
            <formula>y = 14 + x / 2</formula>
          </mapping>
        </mappings>
      </meta>
      <page name="Test">
        <infotrigger upvalue="1" shortupvalue="1" downvalue="-1" shortdownvalue="-1" uplabel="+" downlabel="-" change="absolute" format="%.1f °C" align="left" infoposition="middle" mapping="berkeriq">
          <layout colspan="4"/>
          <label><icon name="temp_control"/>Soll</label>
          <address transform="DPT:6.010" mode="readwrite" variant="relative">9/2/19</address>
        </infotrigger>
      </page>

    Einen Kommentar schreiben:


  • koend
    hat ein Thema erstellt Temperatur Sollwertverschiebung B.IQ

    Temperatur Sollwertverschiebung B.IQ

    Hallo,

    Auf den rechten Weg gebracht durch https://knx-user-forum.de/forum/supp...rtverschiebung kriege ich die folgende Nuss leider nicht geknackt:
    - Anzeige des Infotriggers in °C
    - Infotrigger soll aber relative Werte 1,2,3,4,5 bzw. 5,4,3 etc. senden

    Hintergrund (hoffentlich halbwegs deutlich)
    Berker B.IQs beherrschen die folgenden Objekte (u.a.):
    a) Senden aktuelle Solltemperatur in °C
    b) Senden eines absoluten Wertes (-x bis -x) der die aktuellen Abweichungsschritte zur Basis-Solltemperatur angibt (z.B. Basis 14°C, Schrittlänge ist 0,5°C, zwei Abweichungsschritte = Solltemperatur 15°C)
    c) Vorgabe Abweichungsschritte

    Der Infotrigger soll also jeweils Werte 0,1,2,3,4 etc. auf c) senden, wobei für den nächsten Wert die Rückmeldung von b) benutzt wird, aber a) auf der Visu angezeigt wird.

    Dies funktioniert beim ersten Aufruf, nach dem ersten Klick wird aber das Resultat von a) für die Neuberechung von c) benutzt.
    <infotrigger upvalue="1"shortupvalue="1"downvalue="-1"shortdownvalue="-1"uplabel="+"downlabel="-"change="absolute"format="%.1f °C"align="left"infoposition="middle">
    <layoutcolspan="4"/>
    <label><iconname="temp_control"/>Soll</label>
    <addresstransform="DPT:6.010"mode="readwrite"variant="relative">9/2/19</address> (entspricht c))
    <addresstransform="DPT:9.001"mode="read">9/2/12</address> (entspricht a))
    </infotrigger>
    Workaround wäre um den Infotrigger nur b) und c) benutzen zu lassen (also die zweite adddress transform Zeile b) lesen lassen) und ein info-Element den Temperatursollwert in °C anzeigen zu lassen.
    Hübsch ist aber anders...

    Gibt es hier eine Möglichkeit um das sauber darzustellen?

    Vielen Dank und viele Grüße
Lädt...
X