Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Ostrom Api auslesen

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Ostrom Api auslesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jpakusch last edited by jpakusch

      Hallo,

      da ich nirgends was passendes gefunden habe bin ich gerade dabei, mir ein Skript zum Auslesen der Verbrauchsdaten von meinem dynamischen Tarif meines Stromanbieters Ostrom abzufragen. Das ganze ist noch eine sehr frühe Version und ich arbeite noch dran, vermutlich werde ich das skript hier auch noch aktualisieren.

      Was aktuell geht:

      • Monatliche Verbräche abfragen des aktuellen Jahres
      • Tägliche Verbrauchsdaten des aktuellen Monats

      nur eine kleiner Schritt den ich noch gehen möchte: Stündliche Verbrauchsdaten des aktuellen Tages (bzw des gestrigen, der heutige geht noch nicht)

      Bin gespannt ob das hier noch jemanden interessiert, kann dann auch gern bei der Einrichtung helfen, auch wenn es mein erstes Skript mit Javaskript ist (ja ich hatte Hilfe von CHatGPT um mir ein Grundgerüst hinzustellen), verwende sonst eher Blockly oder außerhalb von iobroker Python.
      Bin auch gespannt auf Verbesserungsvorschläge

      const axios = require('axios');
      
      const clientId = getState('javascript.0.ostrom.client_id').val;
      const clientSecret = getState('javascript.0.ostrom.client_secret').val;
      const contractNumber = getState('javascript.0.ostrom.contract_number').val;
      
      async function getToken() {
          try {
              const authHeader = 'Basic ' + Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
              const response = await axios.post(
                  'https://auth.production.ostrom-api.io/oauth2/token',
                  'grant_type=client_credentials',
                  {
                      headers: {
                          'Authorization': authHeader,
                          'Content-Type': 'application/x-www-form-urlencoded',
                          'Accept': 'application/json'
                      }
                  }
              );
      
              return response.data.access_token;
          } catch (err) {
              console.error('❌ Fehler bei getToken: ' + 
                            (err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message));
              return null;
          }
      }
      
      async function getConsumption(token) {
          try {
              const response = await axios.get(`https://api.ostrom.de/contracts/${contractNumber}/consumption`, {
                  headers: { Authorization: `Bearer ${token}` }
              });
              return response.data;
          } catch (err) {
              console.error('❌ Fehler bei getConsumption:');
              return [];
          }
      }
      async function updateConsumption_monthly() {
          try {
              const token = await getToken();
              if (!token) {
                  console.error('❌ Zugriffstoken konnte nicht abgerufen werden');
                  return;
              }
      
              const contractId = contractNumber
              const startDate = new Date(Date.UTC(new Date().getFullYear(), 0, 1)).toISOString();
              const endDate = new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth() + 1, 0)).toISOString();
      
              const response = await axios.get(
                  `https://production.ostrom-api.io/contracts/${contractId}/energy-consumption`,
                  {
                      headers: {
                          Authorization: `Bearer ${token}`,
                          Accept: 'application/json'
                      },
                      params: {
                          startDate,
                          endDate,
                          resolution: 'MONTH'
                      }
                  }
              );
      
              const consumptionData = response.data.data;
      
              if (!consumptionData || consumptionData.length === 0) {
                  console.warn('⚠️ Keine Verbrauchsdaten verfügbar');
                  return;
              }
      
              for (const item of consumptionData) {
                  const date = new Date(item.date);
                  const year = date.getFullYear();
                  const month = (date.getMonth() + 1).toString().padStart(2, '0');
                  const key = `javascript.0.ostrom.consumption_monthly.${year}_${month}`;
                  const value = item.kWh || 0;
      
                  await createStateAsync(key, value, { type: 'number', read: true, write: false });
                  await setStateAsync(key, value, true);
              }
      
              console.log('✅ monthly Verbrauchsdaten erfolgreich aktualisiert');
      
          } catch (err) {
              console.error('❌ Fehler bei updateConsumption:' +(err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message));
          }
      }
      
      async function updateConsumption_daily() {
          try {
              const token = await getToken();
              if (!token) {
                  console.error('❌ Zugriffstoken konnte nicht abgerufen werden');
                  return;
              }
      
              const contractId = contractNumber
              const jetzt = new Date();
              //const startDate = new Date(Date.UTC(jetzt.getUTCFullYear(), jetzt.getUTCMonth(), jetzt.getUTCDate()));
              //const endDate =   new Date(Date.UTC(jetzt.getUTCFullYear(), jetzt.getUTCMonth(), jetzt.getUTCDate()+1));
              const startDate = new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth(), 1)).toISOString();
              const endDate =   new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth(), jetzt.getUTCDate())).toISOString();
      
              const response = await axios.get(
                  `https://production.ostrom-api.io/contracts/${contractId}/energy-consumption`,
                  {
                      headers: {
                          Authorization: `Bearer ${token}`,
                          Accept: 'application/json'
                      },
                      params: {
                          startDate,
                          endDate,
                          resolution: 'DAY'
                      }
                  }
              );
      
              const consumptionData = response.data.data;
      
              if (!consumptionData || consumptionData.length === 0) {
                  console.warn('⚠️ Keine Verbrauchsdaten verfügbar');
                  return;
              }
      
              for (const item of consumptionData) {
                  const date = new Date(item.date);
                  const year = date.getFullYear();
                  const month = (date.getMonth() + 1).toString().padStart(2, '0');
                  const day = date.getDate().toString().padStart(2, '0');
                  const key = `javascript.0.ostrom.consumption_daily.${year}.${month}.${day}`;
                  const value = item.kWh || 0;
      
                  await createStateAsync(key, value, { type: 'number', read: true, write: false });
                  await setStateAsync(key, value, true);
              }
      
              console.log('✅ daily Verbrauchsdaten erfolgreich aktualisiert');
      
          } catch (err) {
              console.error('❌ Fehler bei updateConsumption:' +(err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message));
          }
      }
      
      // Hilfsfunktion für async createState
      function createStateAsync(id, value, options) {
          return new Promise(resolve => {
              if (!existsState(id)) {
                  createState(id, value, options, () => resolve());
              } else {
                  resolve();
              }
          });
      }
      
      updateConsumption_monthly();
      updateConsumption_daily();
      
      // Manueller Trigger
      on({ id: 'javascript.0.ostrom.update', val: true, ack: false }, async () => {
          await updateConsumption_monthly();
          await updateConsumption_daily();
          // Reset Trigger
          setState('javascript.0.ostrom.update', false, true);
      });
      //Monthly täglich updaten
      setInterval(updateConsumption_monthly, 24 * 60 * 60 * 1000);
      setInterval(updateConsumption_daily, 24 * 60 * 60 * 1000);
      
      1 Reply Last reply Reply Quote 0
      • J
        jpakusch last edited by

        Screenshot 2025-08-20 123708.png

        1 Reply Last reply Reply Quote 0
        • First post
          Last post

        Support us

        ioBroker
        Community Adapters
        Donate

        827
        Online

        32.0k
        Users

        80.5k
        Topics

        1.3m
        Posts

        1
        2
        38
        Loading More Posts
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes
        Reply
        • Reply as topic
        Log in to reply
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
        The ioBroker Community 2014-2023
        logo