{# Wiederverwendbare Bausteine für SwimMonitor-Seiten (siehe docs/SWIMMONITOR-STYLE.md) #} {# Status aus ioBroker (success/warning/danger/secondary) auf SwimMonitor-Zustände abbilden #} {% macro state(status) -%} {{- {success: 'ok', warning: 'warn', danger: 'alarm'}[status|default('')|trim]|default('none') -}} {%- endmacro %} {% macro state_label(state) -%} {{- {ok: 'im Soll', warn: 'Warnung', alarm: 'Alarm'}[state]|default('keine Daten') -}} {%- endmacro %} {% macro is_number(value) -%} {{- value is not null and value is not iterable and (value ~ '') matches '/^\\s*-?[0-9]+([.,][0-9]+)?\\s*$/' ? '1' : '' -}} {%- endmacro %} {% macro num(value, digits) -%} {%- if _self.is_number(value) is not empty -%} {{- (value|replace({',': '.'})|trim + 0)|number_format(digits, ',', '.') -}} {%- else -%}—{%- endif -%} {%- endmacro %} {# Messwert mit Skala aus den API-Daten eines Containers. key: t1, chlor, redox oder ph #} {% macro metric(d, key, label, unit, digits, show_label) %} {% set state = _self.state(d[key ~ '_status'] ?? null) ~ '' %} {% set value = d[key] ?? null %} {% set lower = d[key ~ '_untere_grenze'] ?? null %} {% set upper = d[key ~ '_obere_grenze'] ?? null %} {% set has_value = _self.is_number(value) is not empty %} {% set has_range = _self.is_number(lower) is not empty and _self.is_number(upper) is not empty %} {% if has_range %} {% set lo = lower|replace({',': '.'}) + 0 %} {% set hi = upper|replace({',': '.'}) + 0 %} {% set pad = (hi - lo) > 0 ? (hi - lo) * 0.6 : 1 %} {% set smin = lo - pad %} {% set smax = hi + pad %} {% if has_value %} {% set v = value|replace({',': '.'}) + 0 %} {% set smin = min(smin, v) %} {% set smax = max(smax, v) %} {% endif %} {% endif %} {% endmacro %} {# Vier LTE-Balken. lte ist null oder {bars: 0–4, text: string, error?: string}. #} {% macro lte(lte) %} {% set bars = lte is iterable and lte.bars is defined ? lte.bars : null %} {% set caption = lte.error|default('') %} {% if caption is empty %} {% set caption = bars is same as(null) ? 'LTE' : lte.text|default('LTE') %} {% endif %} {% set tone = lte.error|default('') ? 'is-error' : (bars is same as(null) ? 'is-unknown' : (bars <= 1 ? 'is-weak' : (bars == 2 ? 'is-mid' : 'is-strong'))) %} {{ caption }} {% endmacro %} {# Dialog für die Messwert-Details; Befüllung über js/pages/metric-detail.js #} {% macro metric_modal() %} {% endmacro %}