Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. TibberLink Adapter

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

TibberLink Adapter

Scheduled Pinned Locked Moved ioBroker Allgemein
631 Posts 85 Posters 197.8k Views 78 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Michi_Pi

    Ich sehe den normalen Preis, und bei der Monatsabrechnung wird dann die Netzentgeltreduzierung abgezogen.

    H Offline
    H Offline
    HansJochen
    wrote on last edited by
    #621

    @Michi_Pi sagte in TibberLink Adapter:

    Ich sehe den normalen Preis, und bei der Monatsabrechnung wird dann die Netzentgeltreduzierung abgezogen.

    Schade, ich hätte eigentlich gehofft, dass Tibber das schlauer übermittelt. Das ist ja nicht nur ein Anzeige-Thema, sondern auch relevant für die Berechnung des Zeitfensters. Ich fände es cool, wenn der Tibberlink Adapter eine Korrekturmöglichkeit integriert. Die Netzgebühren sind ja sehr statisch, dann müssten die Betroffenen halt einmal im Jahr die Gebührenstaffel von Hand eintragen.

    Das nur als Anregung. Mein Netzbetreiber bietet keine für mich attraktiven 14a Zeitfenster, so dass ich Modul 3 gar nicht erst beauftragt habe.

    1 Reply Last reply
    0
    • N Offline
      N Offline
      nkoebe
      wrote on last edited by
      #622

      Das wäre natürlich elegant, wenn es im Adapter für 14a eine Config gäbe.
      Man könnte die Tarife mit den Zeitfenstern angeben und das normale Entgelt und das würde dann die Preise entsprechend berechnen...

      1 Reply Last reply
      0
      • M Michi_Pi

        Ich sehe den normalen Preis, und bei der Monatsabrechnung wird dann die Netzentgeltreduzierung abgezogen.

        A Offline
        A Offline
        ArnoD
        wrote on last edited by
        #623

        @Michi_Pi
        Das bedeutet, dass Tibber falsche Bruttopreise über die API übermittelt?
        Das erstaunt mich doch sehr, da die regionalen Unterschiede im Netzentgelt ja im Bruttopreis aktuell berücksichtigt werden.
        Ich könnte mir sogar vorstellen, dass es hier mit den Verbraucherzentralen Ärger geben könnte, die sehen das nicht so locker, wenn falsche Preise angegeben werden.
        Ich hoffe das Tibber das dann noch ändert.

        1 Reply Last reply
        0
        • S Online
          S Online
          Schimi
          wrote on last edited by
          #624

          nach meinen Infos... wird bei Modul1 der betrag mit der Gesamtrechnung abgezogen (ist auch richtig, ist ja keine kWh Reduzierung)...
          Bei Modul 3 soll es direkt in der anzeige richtig angezeigt werden (und auch abgerechnet), zumindest hört man es von den wenigen die Modul 3 bereits haben (youtube)

          1 Reply Last reply
          0
          • H Offline
            H Offline
            HansJochen
            wrote on last edited by
            #625

            @Michi_Pi habe ich Dich falsch verstanden oder ist das bei Dir anders? Ich dachte, Du hast Modul 3 und bekommst die für Deine Region "normalen" Netzentgelte im Brutto Preis übermittelt und erst am Monatsende wird das dann über die Abrechnung korrigiert?

            M 1 Reply Last reply
            0
            • M Offline
              M Offline
              Michi_Pi
              wrote on last edited by
              #626

              Hi, nein ich hab nur Modul 1. Modul 3 ist in meiner Region leider auch nicht attraktiv. Da der dieses Zeitfenster nur für die Sommermonate anwendet.

              1 Reply Last reply
              0
              • H HansJochen

                @Michi_Pi habe ich Dich falsch verstanden oder ist das bei Dir anders? Ich dachte, Du hast Modul 3 und bekommst die für Deine Region "normalen" Netzentgelte im Brutto Preis übermittelt und erst am Monatsende wird das dann über die Abrechnung korrigiert?

                M Offline
                M Offline
                Michi_Pi
                wrote on last edited by
                #627

                @HansJochen sagte in TibberLink Adapter:

                @Michi_Pi habe ich Dich falsch verstanden oder ist das bei Dir anders? Ich dachte, Du hast Modul 3 und bekommst die für Deine Region "normalen" Netzentgelte im Brutto Preis übermittelt und erst am Monatsende wird das dann über die Abrechnung korrigiert?

                Ja genau, so ist es.

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  HansJochen
                  wrote on last edited by
                  #628

                  @Michi_Pi

                  Okay, aber Du hast ja Modul 1, nicht Modul 3. Dann sind die Netzentgelte für die Aussteuerung ja auch einigermaßen egal, weil sie zu jeder Zeit gleich sind und Du trotzdem zum günstigsten Zeitfenster gelenkt wirst. Bisschen überraschend, dass Tibber anscheinend bei Modul 3 die echten Brutto Preise übermittelt und bei Modul 1 nicht. Vielleicht ist das aber auch nur für Einzelne und nur für eine Übergangszeit anders, abhängig vom Netzbetreiber o.ä. Falls Tibber das bei Dir mal ändert, schreib es doch gerne hier.

                  Mit Modul 3 ist hier keiner, oder? Das ist ja noch einigermaßen neu.

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    ReblausGT
                    Developer
                    wrote on last edited by
                    #629

                    Ich warte auf meine Modul 3 Schaltung.... dann kann ich das auch testen. Nur leider zeiht sich die Bearbeitung beim Netzbetreiber extrem.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Michi_Pi
                      wrote on last edited by
                      #630

                      glaub Tibber bastelt da eh noch ständig rum. Am Anfang des Jahres bin ich noch auf Tibber zugegangen und hab ihnen meine Vergünstigungen mitgeteilt damit ich das überhaupt monatlich abgezogen bekommen hatte. Zudem ist es ja auch nicht ganz einfach, da ja auch jeder Netzbetreiber andere Tarife hat. Dieses Jahr hätte bei mir Modul 3 noch Sinn gemacht, nächstes Jahr nicht mehr. Zu dem Rollout hat mein Netzbetreiben auch nicht wirklich Ambitionen. Mit dem Gateway standen die schon bei mir, aber wegen schlechtem Empfang gingen Sie wieder und seither auch keine Rückmeldung. Auch nicht das mir eine externe Antenne oder dergleichen Angeboten wurde damit das funktionieren würde.

                      1 Reply Last reply
                      0
                      • L Offline
                        L Offline
                        lesiflo
                        Most Active
                        wrote last edited by lesiflo
                        #631

                        Hi, falls jemand Interesse hat hier mal zwei Diagramme zum Nachbauen für flexcharts

                        Jahr:

                        // ============================================================================
                        // Tibber Jahresübersicht + eCharts VIS-Widget
                        // ----------------------------------------------------------------------------
                        // - Erstellt 12 Datenpunkte für Kosten, Verbrauch, Preis
                        // - Liest tibber Monthly JSON aus
                        // - Ergänzt/überschreibt aktuellen Monat aus 0_userdata-Datenpunkten
                        // - Erstellt eCharts-Konfiguration für VIS
                        // - Tooltip mit 2 Nachkommastellen
                        // ============================================================================
                        
                        // =================== KONFIG ===================
                        const jsonMonthlyDP = 'tibberlink.0.Homes.xxxxxxxxxxxxx.Consumption.jsonMonthly';
                        const rootDP        = '0_userdata.0.Tibber.Jahreswerte';
                        const visDP         = `${rootDP}.eCharts_Monatsbalken`;
                        
                        // Userdata aktuelle Monatswerte
                        const dpPriceThisMonth = '0_userdata.0.Tibber.AvgUnitPriceThisMonth';
                        const dpConsThisMonth  = '0_userdata.0.Tibber.SumConsumptionThisMonth';
                        const dpCostThisMonth  = '0_userdata.0.Tibber.SumUnitCostThisMonth';
                        
                        // =================== 12 Monats-Datenpunkte erzeugen ===================
                        function createMonthDPs() {
                            for (let m = 1; m <= 12; m++) {
                                createState(`${rootDP}.Cost.M${m}`, 0,  { name: `Kosten Monat ${m}`,       type: 'number', unit: '€',     role: 'value' });
                                createState(`${rootDP}.Cons.M${m}`, 0,  { name: `Verbrauch Monat ${m}`,    type: 'number', unit: 'kWh',   role: 'value' });
                                createState(`${rootDP}.Price.M${m}`,0,  { name: `Durchschnittspreis M${m}`, type: 'number', unit: '€/kWh', role: 'value' });
                            }
                            createState(visDP, '', { name: 'eCharts Config Monatsbalken', type: 'string', role: 'text' });
                        }
                        createMonthDPs();
                        
                        
                        // =================== Hauptfunktion ===================
                        function updateYearValues() {
                            try {
                                const raw = getState(jsonMonthlyDP).val;
                                if (!raw) return log("Keine Monatsdaten vorhanden", "warn");
                        
                                const data = JSON.parse(raw);
                                const currentYear  = new Date().getFullYear();
                                const currentMonth = new Date().getMonth() + 1;
                        
                                let arrCost  = Array(12).fill(0);
                                let arrCons  = Array(12).fill(0);
                                let arrPrice = Array(12).fill(0);
                        
                                // ========== JSON durchlaufen ==========
                                data.forEach(entry => {
                                    if (!entry.from) return;
                        
                                    const d = new Date(entry.from);
                                    const year  = d.getFullYear();
                                    const month = d.getMonth() + 1;
                        
                                    if (year !== currentYear) return;
                        
                                    const cost  = parseFloat(entry.totalCost)   || 0;
                                    const cons  = parseFloat(entry.consumption) || 0;
                                    const price = parseFloat(entry.unitPrice)   || 0;
                        
                                    arrCost[month - 1]  = parseFloat(cost.toFixed(2));
                                    arrCons[month - 1]  = parseFloat(cons.toFixed(2));
                                    arrPrice[month - 1] = parseFloat(price.toFixed(2));
                        
                                    setState(`${rootDP}.Cost.M${month}`,  cost,  true);
                                    setState(`${rootDP}.Cons.M${month}`,  cons,  true);
                                    setState(`${rootDP}.Price.M${month}`, price, true);
                                });
                        
                                // =============================================================
                                //  **AKTUELLEN MONAT MIT USERDATA ÜBERSCHREIBEN**
                                // =============================================================
                                const uPrice = parseFloat(getState(dpPriceThisMonth).val) || 0;
                                const uCons  = parseFloat(getState(dpConsThisMonth).val)  || 0;
                                const uCost  = parseFloat(getState(dpCostThisMonth).val)  || 0;
                        
                                arrCost[currentMonth - 1]  = parseFloat(uCost.toFixed(2));
                                arrCons[currentMonth - 1]  = parseFloat(uCons.toFixed(2));
                                arrPrice[currentMonth - 1] = parseFloat(uPrice.toFixed(2));
                        
                                setState(`${rootDP}.Cost.M${currentMonth}`,  uCost,  true);
                                setState(`${rootDP}.Cons.M${currentMonth}`,  uCons,  true);
                                setState(`${rootDP}.Price.M${currentMonth}`, uPrice, true);
                        
                                // =====================================================================
                                // eCharts VIS-Konfiguration
                                // =====================================================================
                                const option = {
                                    textStyle: { color: '#FFFFFF' },
                                    tooltip: {
                                        trigger: 'axis',
                                        textStyle: { color: '#525252' },
                                        formatter: function(params) {
                                            return params.map(p => {
                                                let unit = '€/kWh';
                                                if (p.seriesName.includes('€')) unit = '€';
                                                else if (p.seriesName.includes('kWh')) unit = 'kWh';
                                                return `${p.seriesName}: ${p.value.toFixed(2)} ${unit}`;
                                            }).join('<br/>');
                                        }
                                    },
                                    legend: {
                                        textStyle: { color: '#FFFFFF' }
                                    },
                                    xAxis: {
                                        type: 'category',
                                        data: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
                                        axisLabel: { color: '#FFFFFF' }
                                    },
                                    yAxis: [
                                        {
                                            type: 'value',
                                            name: 'Kosten / Verbrauch',
                                            axisLabel: { color: '#FFFFFF' },
                                            nameTextStyle: { color: '#FFFFFF' },
                                            splitLine: { show: true, lineStyle: { color: '#525252' } },
                                            axisLine: { lineStyle: { color: '#ccc' } }
                                        },
                                        {
                                            type: 'value',
                                            name: 'Preis',
                                            position: 'right',
                                            axisLabel: { color: '#FFFFFF' },
                                            nameTextStyle: { color: '#FFFFFF' },
                                            splitLine: { show: true, lineStyle: { color: '#525252' } },
                                            axisLine: { lineStyle: { color: '#ccc' } }
                                        }
                                    ],
                                    series: [
                                        { name: 'Kosten (€)', type: 'bar', data: arrCost },
                                        { name: 'Verbrauch (kWh)', type: 'bar', data: arrCons },
                                        { name: 'Preis (€/kWh)', type: 'line', yAxisIndex: 1, data: arrPrice }
                                    ]
                                };
                        
                                setState(visDP, JSON.stringify(option), true);
                                log("Jahreswerte + aktueller Monat + eCharts VIS aktualisiert", "info");
                        
                            } catch (e) {
                                log("Fehler JSON: " + e, "error");
                            }
                        }
                        
                        // =================== TRIGGER ===================
                        updateYearValues();
                        on({ id: jsonMonthlyDP, change: 'any' }, () => updateYearValues());
                        on({ id: [dpPriceThisMonth, dpConsThisMonth, dpCostThisMonth], change: 'ne' }, () => updateYearValues());
                        

                        Monat:

                        // ============================================================================
                        // Tibber Daily Übersicht für VIS eCharts
                        // ----------------------------------------------------------------------------
                        // - ALLE Daten aus Tibbers jsonDaily
                        // - Linke Achse: Kosten (€) + Verbrauch (kWh)
                        // - Rechte Achse: Preis (€/kWh)
                        // - Schriftfarbe X/Y weiß, Y-Hilfslinien #525252
                        // - Rechte Y-Achse Maximalwert auf 3 Nachkommastellen
                        // - Preislinie nicht geglättet
                        // ============================================================================
                        
                        const jsonDailyDP = 'tibberlink.0.Homes.xxxxxxxxxxx.Consumption.jsonDaily';
                        const dpBase = '0_userdata.0.Tibber.Daily.';
                        const dpDates     = dpBase + 'Dates';
                        const dpCost      = dpBase + 'Cost';
                        const dpUsage     = dpBase + 'Usage';
                        const dpUnitPrice = dpBase + 'UnitPrice';
                        const dpEchart    = dpBase + 'EchartConfig';
                        
                        // =================== Hilfsfunktion ===================
                        function ensureDP(id) {
                            if (!existsState(id)) createState(id, '', { type: 'string', read: true, write: true });
                        }
                        [dpDates, dpCost, dpUsage, dpUnitPrice, dpEchart].forEach(ensureDP);
                        
                        // =================== Datum formatieren TT.MM. ===================
                        function formatDateTTMM(fromStr) {
                            const d = new Date(fromStr);
                            if (isNaN(d)) return '';
                            const day = ('0' + d.getDate()).slice(-2);
                            const month = ('0' + (d.getMonth() + 1)).slice(-2);
                            return `${day}.${month}`;
                        }
                        
                        // =================== Hauptfunktion ===================
                        async function buildTibberDailyChart() {
                            const raw = await getStateAsync(jsonDailyDP);
                            if (!raw || !raw.val) {
                                log('⚠ jsonDaily leer oder nicht verfügbar', 'warn');
                                return;
                            }
                        
                            let daily;
                            try {
                                daily = JSON.parse(raw.val);
                                if (!Array.isArray(daily)) {
                                    log('❌ JSON ist kein Array', 'error');
                                    return;
                                }
                            } catch (e) {
                                log('❌ Fehler beim Parsen von jsonDaily: ' + e, 'error');
                                return;
                            }
                        
                            const dates = [];
                            const cost = [];
                            const usage = [];
                            const price = [];
                        
                            daily.forEach(entry => {
                                dates.push(formatDateTTMM(entry.from));
                                cost.push(Number(entry.totalCost || 0).toFixed(2));
                                usage.push(Number(entry.consumption || 0).toFixed(2));
                                price.push(Number(entry.unitPrice || 0).toFixed(3));
                            });
                        
                            // Datenpunkte aktualisieren
                            setState(dpDates, JSON.stringify(dates), true);
                            setState(dpCost, JSON.stringify(cost), true);
                            setState(dpUsage, JSON.stringify(usage), true);
                            setState(dpUnitPrice, JSON.stringify(price), true);
                        
                            // Rechte Y-Achse Maximalwert für Preis berechnen (3 Nachkommastellen)
                            let maxPrice = Math.max(...price.map(p => Number(p))) * 1.1; // 10% Puffer
                            maxPrice = Number(maxPrice.toFixed(3));
                        
                            // Linke Achse: Maximalwert für Kosten und Verbrauch
                            const maxLeft = Math.max(
                                ...cost.map(c => Number(c)),
                                ...usage.map(u => Number(u))
                            ) * 1.1;
                        
                            const echartConfig = {
                                textStyle: { color: '#FFFFFF' },
                                tooltip: {
                                    trigger: 'axis',
                                    textStyle: { color: '#525252' },
                                    formatter: function(params) {
                                        const day = params[0].axisValue;
                                        const kosten = params.find(p => p.seriesName === 'Kosten (€)')?.value || 0;
                                        const verbrauch = params.find(p => p.seriesName === 'Verbrauch (kWh)')?.value || 0;
                                        const preis = params.find(p => p.seriesName === 'Preis (€/kWh)')?.value || 0;
                                        return `${day} → Kosten: ${Number(kosten).toFixed(2)} € | Verbrauch: ${Number(verbrauch).toFixed(2)} kWh | Preis: ${Number(preis).toFixed(3)} €/kWh`;
                                    }
                                },
                                legend: { textStyle: { color: '#FFFFFF' }, data: ['Kosten (€)', 'Verbrauch (kWh)', 'Preis (€/kWh)'] },
                                xAxis: { type: 'category', data: dates, axisLabel: { color: '#FFFFFF' } },
                                yAxis: [
                                    {
                                        type: 'value',
                                        name: 'Kosten / Verbrauch',
                                        min: 0,
                                        max: maxLeft,
                                        axisLabel: { color: '#FFFFFF' },
                                        nameTextStyle: { color: '#FFFFFF', align: 'center' }, // linksbündig
                                        splitLine: { show: true, lineStyle: { color: '#525252' } }
                                    },
                                    {
                                        type: 'value',
                                        name: 'Preis',
                                        position: 'right',
                                        min: 0,
                                        max: maxPrice,
                                        axisLabel: { 
                                            color: '#FFFFFF', 
                                            formatter: function(value) { return Number(value).toFixed(3) + ' €/kWh'; } 
                                        },
                                        nameTextStyle: { color: '#FFFFFF' },
                                        splitLine: { show: true, lineStyle: { color: '#525252' } }
                                    }
                                ],
                                series: [
                                    { name: 'Kosten (€)', type: 'bar', data: cost, yAxisIndex: 0 },
                                    { name: 'Verbrauch (kWh)', type: 'bar', data: usage, yAxisIndex: 0 },
                                    { name: 'Preis (€/kWh)', type: 'line', data: price, yAxisIndex: 1 } // nicht geglättet
                                ]
                            };
                        
                            setState(dpEchart, JSON.stringify(echartConfig), true);
                            log('✔ Tibber Daily für VIS aktualisiert – ' + daily.length + ' Einträge');
                        }
                        
                        // =================== Trigger ===================
                        on({ id: jsonDailyDP, change: 'any' }, () => buildTibberDailyChart());
                        buildTibberDailyChart();
                        

                        image.png

                        image.png

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate
                        FAQ Cloud / IOT
                        HowTo: Node.js-Update
                        HowTo: Backup/Restore
                        Downloads
                        BLOG

                        506

                        Online

                        32.4k

                        Users

                        81.5k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Home
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe