2025.11.30 20:20:38 1: PERL WARNING: Attempt to call undefined import method with arguments (":all") via package "TcpServerUtils" (Perhaps you forgot to load the package?) at ./FHEM/98_Modbus.pm line 185, <$fh> line 1934.
2025.11.30 20:28:35 1: PERL WARNING: Smartmatch is deprecated at FHEM/TimeSeries.pm line 113.
2025.11.30 20:34:55 1: PERL WARNING: Attempt to call undefined import method with arguments (":all") via package "SetExtensions" (Perhaps you forgot to load the package?) at ./FHEM/98_Modbus.pm line 180, <$fh> line 1934.
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 %}