Ankündigung

Einklappen
Keine Ankündigung bisher.

Raumtemperaturregler - Werte eines Items auswerten

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

    Raumtemperaturregler - Werte eines Items auswerten

    Hallo,

    ich versuche den smallrtr um ein Popup zur Betriebsart zu erweitern.

    Wie kann ich den Wert des Items auswerten um je nach Wert ein Symbol anzuzeigen?
    Die Zeile scheint so nicht zu gehen:

    Code:
    {% if [item_comfort] == '1' %}
    Code:
                 <a href="#{{ uid }}-popup" data-rel="popup">
                        {% if [item_comfort] == '1' %}
                            <img class="icon icon1" src="icons/ws/user_available.svg" alt="{{ uid }}-popup" />
                        {% elseif [item_comfort] == 2 %}
                            <img class="icon icon1" src="icons/ws/user_away.svg" alt="{{ uid }}-popup" />
                        {% else %}
                            <img class="icon icon1" src="icons/ws/user_away.svg" alt="{{ uid }}-popup" />
                        {% endif %}
                </a>

    Gesamt Widget

    Code:
    /**
    * Extended Small RTR (Room Temperatur Regulator)
    *
    * @param {id=} unique id for this widget
    * @param {text=}     name of the rtr
    * @param {item(num)} a gad/item for the actual temperature
    * @param {item(num)} a gad/item for the set temperature
    * @param {item(bool)} a gad/item for the current state of the actor
    * @param {value=0.5} step for plus/minus buttons (optional, default 0.5°)
    */
    {% macro ext(id, txt, gad_actual, gad_set, gad_state, step, item_comfort, item_night, item_frost, supplements) %}
    {% import "@widgets/basic.html" as basic %}
    {% set uid = uid(page, id) %}
    /** Design */
    <div id="{{ uid }}" class="rtr">
        <table style="width:100%; text-align: left;">
            <tr>
                <th width="20%">{% if txt %} {{ txt }} {% endif %}</th>
                <td width="10%"><div class="temp">{{ basic.print(id~'actual', gad_actual, '°C' ) }}</div></td>
                <td width="10%">
                    {% if gad_set %}
                        {{ basic.offset(id~'minus', 'gad_set', -(step|default(0.5)), 'minus', '', 'micro') }}
                    {% endif %}
                </td>
                <td width="10%"><div class="temp">{{ basic.print(id~'set', gad_set, '°C' ) }}</div></td>
                <td width="10%">
                    {% if gad_set %}
                        {{ basic.offset(id~'plus', 'gad_set', (step|default(0.5)), 'plus', '', 'micro') }}
                    {% endif %}
                </td>
                <td width="10%">
                    {% if gad_state %}
                        {{ basic.print(id~'state', gad_state, '%' ) }}
                    {% endif %}
                </td>
                <td width="15%">
                    {% for supplement in supplements %}
                        {{ supplement|raw }}
                    {% endfor %}
                </td>
                <td width="15%">
              
                    {% if item_comfort is not empty %}
                        <a href="#{{ uid }}-popup" data-rel="popup">
                        {% if [item_comfort] == '1' %}
                            <img class="icon icon1" src="icons/ws/user_available.svg" alt="{{ uid }}-popup" />
                        {% elseif [item_comfort] == 2 %}
                            <img class="icon icon1" src="icons/ws/user_away.svg" alt="{{ uid }}-popup" />
                        {% else %}
                            <img class="icon icon1" src="icons/ws/user_away.svg" alt="{{ uid }}-popup" />
                        {% endif %}
                        </a>
                  
                        <div id="{{ uid }}-popup" data-role="popup">
                        <div>
                        {% if item_comfort is not empty and (item_comfort == item_night or item_night is empty) and (item_comfort == item_frost or item_frost is empty) %}
                            {{ basic.stateswitch(id~'sw_comfort', item_comfort, 'icon', [1, 2], ['user_available.svg', 'user_away.svg'], '', ['icon1', 'icon0']) }}
                            {{ basic.stateswitch(id~'sw_night', item_comfort, 'icon', [3, 2], ['scene_night.svg', 'scene_night.svg'], '', ['icon1', 'icon0']) }}
                            {{ basic.stateswitch(id~'sw_frost', item_comfort, 'icon', [4, 2], ['weather_frost.svg', 'weather_frost.svg'], '', ['icon1', 'icon0']) }}
                        {% else %}
                            {% if item_comfort is not empty %}
                                {{ basic.stateswitch(id~'sw_comfort', item_comfort, 'icon', '', ['user_away.svg', 'user_available.svg']) }}
                            {% endif %}
                            {% if item_night is not empty %}
                                {{ basic.stateswitch(id~'sw_night', item_night, 'icon', '', ['scene_night.svg', 'scene_night.svg']) }}
                            {% endif %}
                            {% if item_frost is not empty %}
                                {{ basic.stateswitch(id~'sw_frost', item_frost, 'icon', '', ['weather_frost.svg', 'weather_frost.svg']) }}
                            {% endif %}
                        {% endif %}
                    {% endif %}
                    </div>
                    </div>
                </td>
            </tr>
        </table>
        {% if gad_set %}
            /** Events */
            <script type="text/javascript">
                // plus / minus
                $("#{{ uid~'minus' }}").unbind('click').bind('click', function(){
                    var temp = (Math.round((parseFloat($("#{{ uid~'set' }}").html().replace(',','.')) - {{ step|default(0.5) }}) * 10) / 10).toFixed(1);
                $("#{{ uid~'set' }}").html(temp + ' °C');
                io.write("{{ gad_set }}", temp);
                });
                $("#{{ uid~'plus' }}").unbind('click').bind('click', function(){
                    var temp = (Math.round((parseFloat($("#{{ uid~'set' }}").html().replace(',','.')) + {{ step|default(0.5) }}) * 10) / 10).toFixed(1);
                $("#{{ uid~'set' }}").html(temp + ' °C');
                io.write("{{ gad_set }}", temp);
                });
            </script>
        {% endif %}
    </div>
    {% endmacro %}​
    Danke für eure Hilfe.

    #2
    Moin android ,

    Twig setzt als Macrosprache nur die statischen Teile der Visu-Seiten zusammen, bevor diese als html-Seiten ausgeliefert werden. Da hast Du keinen Zugiff auf die item-Werte.

    Du kannst mit basic.symbol werteabhängig Symbole anzeigen und auch Popups öffnen.
    Code:
    {{ basic.symbol('', item_comfort, '', ['user_away', 'user_available', 'user_away'], [1,2], '>', '', uid~'-popup', 'popup' ) }}
    sollte als Ersatz für die if-Statements funktionieren.

    Wozu benötigst Du die eigenen Event-Handler für basic.offset?

    Gruß
    Wolfram
    Zuletzt geändert von wvhn; 04.05.2025, 11:07.

    Kommentar


      #3
      Moin android,

      ich habe das Widget jetzt mal getestet. Der Code in basic.symbol muss noch um ein Hashtag für den korrekten Popup-Link erweitert werden:

      Code:
      {{ basic.symbol('', item_comfort, '', ['user_away', 'user_available', 'user_away'], [1,2], '>', '', '#'~uid~'-popup', 'popup' ) }}
      Auf die eigenen Eventhandler für basic.offset kannst Du verzichten, wenn Du in den Widget-Aufrufen "gad_set" nicht in Anführungszeichen setzt. Mit Anführungszeichen wird dies als Name interpretiert und nicht als Variable.

      Gruß
      Wolfram

      Kommentar


        #4
        Danke für die Tipps. Funktioniert jetzt so und ich habe twig ein bisschen besser verstanden. Das mit dem eigenen handler müsste aus dem orignal smallrtr widget stammen, weiß gar nicht mehr wo ich das her hatte...

        Kommentar


          #5
          android,

          die ursprüngliche Quelle habe ich gefunden: ./pages/example2.knxd/smallrtr.one. Dort habe ich die Fehler korrigiert und die dann überflüssigen Eventhandler entfernt. Die Version kommt in Kürze in den develop branch.

          Allerdings existiert noch eine weitere Version, in der für "gad_state" bzw. "item_state" nicht der Status des Aktors (an/aus), sondern ein %-Wert angezeigt wird. Diese Version verwendest Du auch. Ich finde aber keinerlei Doku dazu und habe selbst keine Heizungsaktoren im Einsatz. Weißt Du, wozu diese Darstellung gut ist?

          Ich würde die existierenden Varianten dann mal zusammenfassen und allgemein zur Verfügung stellen, z.B. auf github/smartvisu-newstuff.

          Gruß
          Wolfram
          Zuletzt geändert von wvhn; 08.05.2025, 16:47.

          Kommentar


            #6
            Hallo,

            die typischen KNX Heizungsaktorenanwendungen arbeiten zwar mit Ventilen die nur Ein/Aus können, die werden vom Aktor aber mit einer PWM angesteuert. Da ist dann der vom Regler berechnete Stellwert in % interessanter als ob das Ventil gerade ein oder aus ist.

            Danke für das Aufnehmen und Aufräumen mit den rtr devices.

            Kommentar


              #7
              Moin android ,

              im develop branch ist jetzt eine geänderte Version der device.html mit dem neuen Widget "device.smallrtr" für Darstellungen in Tabellenform. Das Widget hat dieselben Parameter wie device.rtr (außer item_text und item_offset) und zusätzlich den Parameter "statetype", der bool oder num sein kann. Bei num wird der PWM-Wert angezeigt, während bool das Heizsymbol an/aus darstellt. Der PWM-Wert wird eingefärbt, sobald der Wert 0,1% oder höher ist. Beispiele (bool = oben, num = unten):

              grafik.png

              Kannst Du das mal testen? Ich frage mich auch, ob bei Nacht- und Frostbetrieb immer der abwesende Bewohner angezeigt werden soll, oder ob man direkt die icons für Nacht und Frost anzeigt.

              Mit der Tabelle bin ich noch nicht ganz zufrieden, weil die nicht wirklich responsive ist. Vielleicht hast Du dazu noch eine Idee?

              Gruß
              Wolfram
              Zuletzt geändert von wvhn; 10.06.2025, 20:33.

              Kommentar

              Lädt...
              X