Ankündigung

Einklappen
Keine Ankündigung bisher.

Temperatur Sollwertverschiebung B.IQ

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

    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

    #2
    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>
    Gruß
    Tobias

    Kommentar


      #3
      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.
      TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

      Kommentar


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

        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-&gt;{proxyGA}}{$plugname} = 1;
        $plugin_subscribe{$berker-&gt;{sollTempGA}}{$plugname} = 1;
        #$plugin_subscribe{$berker-&gt;{verschiebungIstGA}}{$plugname} = 1;

        plugin_log($plugname,'INIT Subscribed to B.IQ in room '.$berker-&gt;{room}.':');
        plugin_log($plugname,'- Proxy GA : '.$berker-&gt;{proxyGA});
        plugin_log($plugname,'- Soll temperature GA : '.$berker-&gt;{sollTempGA});
        #plugin_log($plugname,'- Verschiebung IST GA: '.$berker-&gt;{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-&gt;{varTimeVerschiebungEnabled}} &gt;= ($berker-&gt;{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-&gt;{proxyGA}.'|');
        }

        # proxy GA
        if ($msg{'apci'eq 'A_GroupValue_Write' &amp;&amp$msg{'dst'eq $berker-&gt;{proxyGA}) {
        my $sollBiq knx_read($berker-&gt;{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-&gt;{verschiebungIstGA},0,'6.010');
        $verschiebung $verschiebungIST + ($verschiebung $berker-&gt;{temperatureStep});
        if (
        $debugBerker) {
        plugin_log($plugname,'Verschiebung IST : '.$verschiebungIST);
        plugin_log($plugname,'Updating time and sending value to GA '.$berker-&gt;{verschiebungSollGA}.': '.$verschiebung);
        }

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

        $plugin_info{$berker-&gt;{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' &amp;&amp; $msg{'dst'} eq $berker-&gt;{verschiebungIstGA}) {
        # my $currentSoll = knx_read($berker-&gt;{sollTempGA},0,'9.001');
        # knx_write($berker-&gt;{proxyGA},$currentSoll,'9.001');
        #
        # if ($debugBerker) {
        # plugin_log($plugname,'Writing SOLL temperature to proxy GA '.$berker-&gt;{proxyGA}.': '.$currentSoll);
        # }
        # }

        # B.IQ SOLL temperature
        if ($msg{'apci'eq 'A_GroupValue_Write' &amp;&amp$msg{'dst'eq $berker-&gt;{sollTempGA}) {
        knx_write($berker-&gt;{proxyGA},decode_dpt9($msg{'data'}),'9.001');
        if (
        $debugBerker) {
        plugin_log($plugname,'Writing SOLL temperature for B.IQ in room '.$berker-&gt;{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-&gt;{varTimeVerschiebungEnabled}};

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

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

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

        $plugin_info{$berker-&gt;{varTimeVerschiebungEnabled}} = '';

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

        Kommentar

        Lädt...
        X