Weiter zum Inhalt

NEWS

  • News and Announcements for ioBroker and around the forum

    91 200
    91 Themen
    200 Beiträge
    HomoranH
    🚨 Dringendes Update: js-controller 7.2.2 Der js-controller 7.2.2 ist jetzt im STABLE-Repository verfügbar. Nutzer der Versionen 7.1.x, 7.2.0 und 7.2.1 sollten bitte schnellstmöglich aktualisieren. Die älteren Versionen erzeugen aktuell sehr viele zentrale Fehlerprotokolle. Dadurch werden die ioBroker-Server stark belastet und die Funktionalität kann für alle Nutzer beeinträchtigt werden. Das Update enthält außerdem wichtige Anpassungen für zukünftige Adapter-Versionen. ⚠️ Bitte wundert euch nicht, wenn ihr die Admin-Information auch nach einem bereits durchgeführten Update angezeigt bekommt. Die Nachricht kann technisch nicht auf bestimmte js-controller-Versionen begrenzt werden und wird daher an alle Nutzer verteilt. Bitte prüft eure Version und aktualisiert euer System bei Bedarf zeitnah. Vielen Dank! 🙏
  • 82k Themen
    1m Beiträge
    M
    @WG25 Das kann man nur mit flexCharts machen. flexCharts installieren Skript in javascript einfügen, HISTORY und DATA_POINT anpassen, Skript starten Aufruf im Browser mit der unteren Adresse (Protocoll und IP anpassen) Beispiel Skript in javascript einfügen Skript für javascript // --------------------------------------------------------- // Einstellungen // --------------------------------------------------------- const HISTORY_INSTANCE = 'history.0'; // Hier den festen Datenpunkt eintragen const DATA_POINT = 'DEIN DATENPUNKT MIT HISTORY'; // Name für den Flexcharts-Aufruf const MESSAGE_NAME = 'verbrauchHistory'; // Anzahl der angezeigten Kalendertage const DAYS = 14; // Ein aggregierter History-Wert pro Tag const STEP_MS = 24 * 60 * 60 * 1000; // Anzahl der Nachkommastellen const DECIMALS = 2; // Diagrammüberschrift const TITLE = `Verbrauch der letzten ${DAYS} Tage`; // --------------------------------------------------------- // Einheit sicher aus common.unit lesen // --------------------------------------------------------- function getDataPointUnit(id) { const object = getObject(id); if (!object) { console.warn(`Das Objekt ${id} wurde nicht gefunden.`); return ''; } if (object.type !== 'state') { console.warn( `${id} ist kein State, sondern vom Typ "${object.type}".` ); return ''; } /* * Reflect.get vermeidet den Typfehler des Editors. * Es wird damit object.common.unit gelesen. */ const unit = Reflect.get(object.common, 'unit'); return typeof unit === 'string' ? unit.trim() : ''; } const UNIT = getDataPointUnit(DATA_POINT); if (UNIT) { console.info( `Einheit von ${DATA_POINT}: ${UNIT}` ); } else { console.warn( `Für ${DATA_POINT} wurde keine Einheit gefunden.` ); } // --------------------------------------------------------- // Zahlenwert deutsch formatieren // --------------------------------------------------------- function formatNumber(value) { const number = Number(value); if (!Number.isFinite(number)) { return ''; } return number.toLocaleString('de-DE', { minimumFractionDigits: DECIMALS, maximumFractionDigits: DECIMALS }); } // --------------------------------------------------------- // Zahlenwert mit Einheit formatieren // --------------------------------------------------------- function formatValue(value) { const formattedNumber = formatNumber(value); if (!formattedNumber) { return ''; } return UNIT ? `${formattedNumber} ${UNIT}` : formattedNumber; } // --------------------------------------------------------- // Flexcharts-Anfrage empfangen // --------------------------------------------------------- onMessage(MESSAGE_NAME, (_httpParams, callback) => { const end = Date.now(); /* * Beginn des ersten angezeigten Tages auf * 00:00 Uhr setzen. */ const startDate = new Date(); startDate.setHours(0, 0, 0, 0); startDate.setDate( startDate.getDate() - (DAYS - 1) ); const start = startDate.getTime(); getHistory( HISTORY_INSTANCE, { id: DATA_POINT, start: start, end: end, /* * Tagesmaximum: * * Geeignet für einen Tageszähler, der während * des Tages hochzählt und nachts zurückgesetzt wird. */ aggregate: 'max', // Ein Wert pro Tag step: STEP_MS, timeout: 10000, // Keine zusätzlichen Werte außerhalb des Zeitraums removeBorderValues: true, // Fehlende Werte nicht künstlich auffüllen ignoreNull: false }, (error, result) => { if (error) { console.error( `History-Fehler bei ${DATA_POINT}: ` + JSON.stringify(error) ); callback( createErrorChart( 'Die History-Daten konnten nicht geladen werden.' ) ); return; } if (!Array.isArray(result) || result.length === 0) { callback( createErrorChart( 'Für den gewählten Zeitraum wurden keine Daten gefunden.' ) ); return; } const historyData = result .filter(item => { const timestamp = Number(item?.ts); return ( Number.isFinite(timestamp) && timestamp >= start && timestamp <= end ); }) .sort((a, b) => { return Number(a.ts) - Number(b.ts); }); if (historyData.length === 0) { callback( createErrorChart( 'Es wurden keine gültigen History-Einträge gefunden.' ) ); return; } const labels = []; const seriesData = []; for (const item of historyData) { const timestamp = Number(item.ts); const date = new Date(timestamp); labels.push( date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' }) ); if ( item.val === null || item.val === undefined || item.val === '' ) { seriesData.push({ value: null, label: { show: false } }); continue; } const value = Number(item.val); if (!Number.isFinite(value)) { seriesData.push({ value: null, label: { show: false } }); continue; } const roundedValue = Number( value.toFixed(DECIMALS) ); /* * Der fertige Beschriftungstext wird direkt * am jeweiligen Datenwert gespeichert. * * Dadurch ist keine JavaScript-Formatterfunktion * innerhalb des ECharts-Objekts erforderlich. */ seriesData.push({ value: roundedValue, label: { formatter: formatValue(roundedValue) } }); } const hasValidValues = seriesData.some(item => { return item.value !== null; }); if (!hasValidValues) { callback( createErrorChart( 'Für die ausgewählten Tage wurden keine Zahlenwerte gefunden.' ) ); return; } const seriesName = UNIT ? `Verbrauch (${UNIT})` : 'Verbrauch'; const option = { backgroundColor: 'transparent', textStyle: { fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal' }, title: { text: TITLE, left: 'center', textStyle: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'bold', fontSize: 16, textBorderWidth: 0, textShadowBlur: 0 } }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' }, textStyle: { fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal' } }, grid: { left: 60, right: 30, // Platz für die senkrechten Beschriftungen top: 120, bottom: 70, containLabel: true }, xAxis: { type: 'category', data: labels, axisLabel: { interval: 0, rotate: 0, hideOverlap: true, color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontSize: 11, textBorderWidth: 0, textShadowBlur: 0 }, axisLine: { lineStyle: { color: '#000000' } }, axisTick: { alignWithLabel: true, lineStyle: { color: '#000000' } } }, yAxis: { type: 'value', // Einheit automatisch aus dem Datenpunkt name: UNIT, min: 0, nameTextStyle: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontSize: 12, textBorderWidth: 0, textShadowBlur: 0 }, axisLabel: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontSize: 11, textBorderWidth: 0, textShadowBlur: 0 }, axisLine: { show: true, lineStyle: { color: '#000000' } }, splitLine: { lineStyle: { opacity: 0.25 } } }, dataZoom: [ { type: 'inside', start: 0, end: 100 } ], series: [ { name: seriesName, type: 'bar', data: seriesData, barMaxWidth: 35, label: { show: true, // Wert um 90 Grad drehen rotate: 90, // Wert oberhalb des Balkens anzeigen position: 'top', distance: 8, align: 'left', verticalAlign: 'middle', // Schwarze Schrift color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'bold', fontSize: 12, // Keine Textumrandung textBorderWidth: 0, textBorderColor: 'transparent', // Kein Texthintergrund backgroundColor: 'transparent', borderWidth: 0, // Kein Textschatten textShadowBlur: 0, textShadowColor: 'transparent', textShadowOffsetX: 0, textShadowOffsetY: 0 }, itemStyle: { borderRadius: [4, 4, 0, 0] }, emphasis: { label: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'bold', textBorderWidth: 0, textBorderColor: 'transparent', backgroundColor: 'transparent', borderWidth: 0, textShadowBlur: 0, textShadowColor: 'transparent' } } } ] }; callback(option); } ); }); // --------------------------------------------------------- // Fehlerdiagramm erzeugen // --------------------------------------------------------- function createErrorChart(message) { return { backgroundColor: 'transparent', textStyle: { fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal' }, title: { text: 'Flexcharts-Fehler', subtext: message, left: 'center', top: 'middle', textStyle: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'bold', textBorderWidth: 0, textShadowBlur: 0 }, subtextStyle: { color: '#000000', fontFamily: 'Arial, sans-serif', fontStyle: 'normal', fontWeight: 'normal', textBorderWidth: 0, textShadowBlur: 0 } }, xAxis: { show: false }, yAxis: { show: false }, series: [] }; } Eintrag im Browser https://192.168.178.150:8082/flexcharts/echarts.html?source=script&message=verbrauchHistory&darkmode=auto
  • 354 Themen
    2k Beiträge
    boriswernerB
    Hi @backfisch88 first of all you have a german nickname, dont you speak german? Cause I guess you would reach more people in the german channel for adapter tests (see test thread for solaris adapter here in the english dev-channel). Then: I also have a T03 and will test the adapter as soon as I find the time. I already thought about making an adapter based on https://github.com/markoceri/leapmotor-api Do you know that project (based on the home assistant integration) and did you align your adapter with that implementation as it is already tested? I dont see that your adapter supports setting of the "charge limit". I currently load to 80% by default but would like to control dynamically when it should load to 100% (either when I need the extended range or when I have excess PV energy / I want to support the grid). Would be great to have the option. Looking forward to testing it.
  • 633 Themen
    8k Beiträge
    mcm1957M
    @hawkeye Thanks for clearification. I already assumed that goggle translation did not get the conplete context. As I cannot read rusky language, I'll write in english and hope translation is correct. For the technical facts: The maintainer of the adapter did not grant access to npm although request for a long time. So its technical impossible to move the adapter to iobroker-community-adapters. As no maintainance has been done for a long time the adapter has been removed from repositories. It ist still possible to install it directly from nom using url iobroker.megadd. BUT there is some news too. I just detected that there is an adapter iobroker.megadd2. This adapter has been archived too and is not published at repositories. But it has been written by @Bluefox which ist one ofe the active core developers. So maybe he can held - ans as far as I know he can communicate using rusky languge very well. @Bluefox Please respond if you have time to do so. Спасибо за разъяснения. Я уже предполагал, что перевод Google не передал весь контекст. Поскольку я не могу читать на русском языке, напишу на английском и надеюсь, что перевод будет верным. Технические факты: Разработчик адаптера долгое время не предоставлял доступ к npm, несмотря на запрос. Поэтому технически невозможно перенести адаптер в iobroker-community-adapters. Поскольку поддержка не производилась в течение длительного времени, адаптер был удалён из репозиториев. Его всё ещё можно установить напрямую из nom, используя URL iobroker.megadd. НО есть и новости. Я только что обнаружил, что существует адаптер iobroker.megadd2. Этот адаптер тоже заархивирован и не опубликован в репозиториях. Но его написал @Bluefox, один из активных разработчиков ядра. Так что, возможно, он сможет помочь — и, насколько мне известно, он очень хорошо умеет общаться на русском языке. @Bluefox Пожалуйста, ответьте, если у вас есть время.
  • 19 Themen
    111 Beiträge
    Henk-Jan van EsterikH
    @tanelkoth Ik zie dat je deze vraag hebt. Mocht je vraag nog actueel zijn, laat het even weten. Met behulp van een Blockly script kan je eenvoudig dit regelen.
  • Português Fórum de suporte

    4 20
    4 Themen
    20 Beiträge
    ldittmarL
    @polegato Estou devolta aqui :-) ... O exemplo do lobomau é perfeito. Vc tem que instalar o ioBroker.javascript para isso e fazer um Blockly. Com esse Blockly vc pode montar automacao como um quebra cabeca. Muito legal e depois de algums, ja fica bem mais fácil.

247

Online

33.0k

Benutzer

83.3k

Themen

1.3m

Beiträge