heating.power.consumption.heating.day 0.3,17.3,19.4,24.7,30.1,36.6,36.7,44.9 2025-12-01 09:51:15
heating.power.consumption.heating.day.asSingleValue 8.8 2025-11-29 23:59:59
heating.power.consumption.heating.dayValueReadAt 2025-11-30T22:58:29.954Z 2025-12-01 09:51:15
heating.power.consumption.heating.month 623.4,287.6,75.9,3.7,0,0,22,160.3,819.5,1392.2,1345.5,690.6,565.1 2025-12-01 09:51:15
heating.power.consumption.heating.monthValueReadAt 2025-11-28T15:49:54.623Z 2025-12-01 09:51:15
heating.power.consumption.heating.week 0.3,209.7,262.6,91.4,80.8 2025-12-01 09:51:15
heating.power.consumption.heating.weekValueReadAt 2025-11-30T22:58:29.954Z 2025-12-01 09:51:15
heating.power.consumption.heating.year 4777,1373.1 2025-12-01 09:54:53
heating.power.consumption.heating.yearValueReadAt 2025-11-30T22:58:29.954Z 2025-12-01 09:51:15
Zitat von: Rampler am 30 November 2025, 20:44:32vermutlich bin ich einfach zu früh dran mit Trixie...

/**
* -----------------------------------------------------------------------------
* @package smartVISU
* @author Martin Gleiß
* @copyright 2012 - 2024
* @license GPL [http://www.gnu.de]
* -----------------------------------------------------------------------------
*/
/**
* the smartVISU-logo
*/
{% macro smartvisu(mode) %}
{% if mode == 'app' %}
<div class="app">
<div class="image">
<div class="smartvisu"><span class="smart"></span><br /><span class="visu">rHM</span></div>
</div>
</div>
{% else %}
<span class="smartvisu"><span class="smart"></span><span class="visu">rHM</span></span>
{% endif %}
{% endmacro %}
/**
* Check for new updates of smartVISU
*/
{% macro updatecheck( ) %}
{% if config_updatecheck %}
<script>
$('#index').on('pagecreate', function (event, ui) {
$.ajax({
dataType: 'json',
url: 'lib/base/check_update.php?local={{ config_version_full }}',
beforeSend: function(jqXHR, settings) { jqXHR.svProcess = 'Update Check'; },
success: function (data) {
if (data.update) {
notify.message('update', data.text, sv_lang['update']['local'] +': <b>' + data.local + '</b><br>' +
sv_lang['update']['remote'] +': <b>' + data.remote + '</b><br><br>' +
sv_lang['update']['visit'] + ' <a target="_blank" href="http://smartvisu.de">smartVISU.de</a> '+ sv_lang['templatechecker']['or'] +
' <a target="_blank" href="http://github.com/martin-gleiss/smartvisu">github</a> ' + sv_lang['update']['latest'] + '!<br><br>'+
'<a target="_blank" href="http://github.com/martin-gleiss/smartvisu/blob/master/changelog.md">' + sv_lang['update']['view'] + '</a><br><br>'+
sv_lang['update']['recheck'] + '. <br />');
}
}
})
.fail(notify.json);
});
</script>
{% else %}
<!-- Check for updates disabled in configuration -->
{% endif %}
{% endmacro %}
/**
* Widget to place an app-symbol
* If you write an app yourself, place a @title, @icon, @color tag in your
* header. These tags are used to display the symbol
*
* @param the name of the app (located in pages/apps)
* @param title of the app
*/
{% macro app(name, title) %}
{% set app = docu('apps/'~name~'.html') %}
<div class="app">
<a href="index.php?page={{ name }}">
<div class="image" style="background-color: #{{ app.color }};"><img src="{{ app.icon }}" alt="{{ app.name }}"></div>
<div>{{ title|default(app.title|e) }}</div>
</a>
</div>
{% endmacro %}
/**
* Widget to show websocket connection
*
*/
{% macro connection( ) %}
{% import "@widgets/basic.html" as basic %}
<span id="{{ page }}-connection"></span>
<script>
$('#{{ page }}-connection').html(io.socket.url);
if (io.server != undefined) {
if (io.server != '') { // if io.server already set write it directly
var connectString = 'smarthomeNG Websocket Server: '+ io.server + ', '+ sv_lang['system']['connected']+': '+ io.opentime.transUnit('short') +
'<br>Websocket URL: ' + io.socket.url;
$('#{{ page }}-connection').html(connectString);
} else {
$(document).on('ioAlive', function(){ //else wait for ioAlive event and write then
if (io.server != '' ) {
var connectString = 'smarthomeNG Websocket Server: '+ io.server + ', '+ sv_lang['system']['connected'] + ': '+ io.opentime.transUnit('short') +
'<br>Websocket URL: ' + io.socket.url;
$('#{{ page }}-connection').html(connectString);
}
})
}
}
</script>
{% endmacro %}
/**
* Button to send a timestamp to an item (for countdown docu page)
*
* @param {id} unique id for the widget. Mandatory in order to identify the button in a page with more than one button
* @param {item(num)} the item
*
* @Author: Wolfram v. Hülsen
*/
{% macro timestamp (id, item) %}
<button type="button" data-theme="a" data-inline="true" id="send_timestamp_{{ uid(page, id) }}" class="ui-midi">Trigger</button> Click to start
<script>
$('#send_timestamp_{{ uid(page, id) }} ').click(function() {
var now = +new Date();
io.write('{{ item }}', now );
});
</script>
{% endmacro %}
/**
* Extend a single block to full screen width
*
* @param {id=} unique id for the widget.
*
* @Author: bonze (plot resize and icon management by Wolfram v. Hülsen)
*/
{% macro supersize ( id ) %}
{% set uid = uid(page, id) %}
{% import _self as lib %}
<span{% if not id is empty %} id="{{ uid(page, id) }}"{% endif %} >
<a>{{ lib.svgimg ('', 'control_centr_arrow_up_right.svg', 'supersize icon0 sizesmall') }}</a>
<a>{{ lib.svgimg ('', 'jquery_minus.svg', 'supersize icon0 sizebig', 'display:none;') }}</a>
</span>
<script>
$(".supersize").closest("div").on("collapsiblecreate", function (event, ui){
var element = $(this);
if (element.parent().attr("data-iconpos") == "right")
element.collapsible({iconpos: "none"});
});
$(".supersize").click(function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var element = $(this).closest("div");
var previousWidth = parseFloat(element.css('width').replace('px',''));
var previousHeight = parseFloat(element.find('.ui-collapsible-content').css('height').replace('px',''));
if (!element.hasClass('overlay')){
$(".mask").css('display','block');
element.addClass("overlay").show();
element.collapsible('expand');
element.find("h3").addClass("ui-corner-all");
element.find(".supersize.sizesmall").hide();
element.find(".supersize.sizebig").show();
element.find(".supersize").attr("data-ypos", Math.round(window.scrollY));
element.find('.highcharts-root').addClass('supersized');
$.mobile.silentScroll(0);
}else{
$(".mask").css('display','none');
element.removeClass("overlay");
element.find("h3").removeClass("ui-corner-all");
element.find(".supersize.sizebig").hide();
element.find(".supersize.sizesmall").show();
element.find('.highcharts-root').removeClass('supersized');
var previousPosition = element.find(".supersize").attr("data-ypos")*1;
$.mobile.silentScroll(previousPosition);
}
var actualWidth = parseInt(element.css('width').replace('px',''));
var sizeFactor = actualWidth / previousWidth;
element.find('.ui-collapsible-content').css('height', previousHeight * sizeFactor)
.find('.plot').each(function() {
var actualPlotHeight = parseFloat($(this).css('height').replace('px',''));
$(this).css('height', actualPlotHeight * sizeFactor);
$(this).highcharts().setSize(null, null);
}).end()
.find('[data-widget="device.uzsutable"] .highcharts-root').css('max-height', sizeFactor < 1 ? '' : 400*sizeFactor+"px");
});
</script>
{% endmacro %}
/**
* Embed an svg icon into html DOM in order to make it styleable.
icon must be available in ./icons/ws or ./dropins/icons/ws. Otherwise use <img src=... with icon path and name
*
* @param {text=} optional id for the icon
* @param {text} icon name e.g. 'myicon' or 'myicon.svg'
* @param {text=} CSS classes for the icon (optional, default='')
* @param {text=} styling options in CSS notation (optional, default='')
*
* @Author: Wolfram v. Hülsen
*/
{% macro svgimg ( id, pic, iconclass, styleoptions ) %}
{% set pic = localize_svg(pic) %}
<svg class="icon {{ iconclass }}" {% if not id is empty %} id="{{ uid(page, id) }}"{% endif %} {{ (styleoptions is not empty ? 'style ="' ~ styleoptions ~'"' : '')|raw }} role="img" aria-label="{{ pic|split('/')|last|split('.')[0:-1]|join('.') }}"
{{ source( pic )|split('<svg')[1]|replace( {'stroke="#fff"':'', 'fill="#fff"':'', 'stroke="#FFF"':'', 'fill="#FFF"':''} )|raw }}
{% endmacro %}
Zitat von: passibe am 30 November 2025, 21:34:36In Version 5 des Containers gibt es kein nodejs/npm mehr. Du brauchst Version 4. Oder du erstellst ein custom image auf Basis von v5, wo nodejs/npm nachinstalliert ist.Ich hatte einfach angenommen, dass das schon jemand im Laufe des Jahres umgesetzt hat. Für mich wäre es ein völlig neues Themenfeld. Es wirft aber die Frage auf, bin ich der Einzige?
Zitat von: passibe am 30 November 2025, 21:34:36Nach wie vor ghcr.io/fhem/fhem-docker:4-bullseye?Da bin ich wieder hin zurück.
ZitatDas alexa-cookie Modul wurde nicht gefunden.bei NPM-login
ZitatInstallation wird angestartetbei NPM-install
up to date, audited 104 packages in 2s
17 packages are looking for funding
run `npm fund` for details
2 low severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
!!Installation fehlgeschlagen!!
ZitatAttributes:
npm_proxy_ip 192.168.31.60
npm_proxy_listen_ip 172.31.31.60
npm_proxy_port 3002