Freigeben über


PowerGridForecast Klasse

Definition

Enthält Informationen zum Stromnetz, mit dem das Gerät verbunden ist. Die Daten sollen in einer Vorhersage verwendet werden, um die Zeit zu verschieben, zu der Workloads auftreten, oder den Energieverbrauch in intensiven Zeiten zu reduzieren.

public ref class PowerGridForecast sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Devices.Power.PowerGridApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class PowerGridForecast final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Devices.Power.PowerGridApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class PowerGridForecast
Public NotInheritable Class PowerGridForecast
Vererbung
Object Platform::Object IInspectable PowerGridForecast
Attribute

Windows-Anforderungen

Gerätefamilie
Windows Desktop Extension SDK (eingeführt in 10.0.26100.0)
API contract
Windows.Devices.Power.PowerGridApiContract (eingeführt in v1.0)

Beispiele

using Windows.Devices.Power;

void PrintBestTimes(PowerGridForecast forecast)
{
    double bestSeverity = double.MaxValue;
    double bestLowImpactSeverity = double.MaxValue;
    DateTime bestTime = DateTime.MaxValue;
    DateTime bestLowImpactTime = DateTime.MaxValue;
    TimeSpan blockDuration = forecast.BlockDuration;
    DateTime startTime = forecast.StartTime;
    IList<PowerGridData> forecastSignals = forecast.Forecast;

    if (forecastSignals.Count == 0)
    {
        Console.WriteLine("Error encountered with getting forecast; try again later.");
        return;
    }

    foreach (PowerGridData data in forecastSignals)
    {
        if (data.Severity < bestSeverity)
        {
            bestSeverity = data.Severity;
            bestTime = startTime;
        }

        if (data.IsLowUserExperienceImpact && data.Severity < bestLowImpactSeverity)
        {
            bestLowImpactSeverity = data.Severity;
            bestLowImpactTime = startTime;
        }

        startTime = startTime + blockDuration;
    }

    if (bestLowImpactTime != DateTime.MaxValue)
    {
        DateTime endBestLowImpactTime = bestLowImpactTime + blockDuration;
        Console.WriteLine($"Lowest severity during low impact is {bestLowImpactSeverity}, which starts at {bestLowImpactTime.ToString()}, and ends at {endBestLowImpactTime}.");
    }
    else
    {
        Console.WriteLine("There's no low-user-impact time in which to do work.");
    }

    if (bestTime != DateTime.MaxValue)
    {
        DateTime endBestSeverity = bestTime + blockDuration;
        Console.WriteLine($"Lowest severity is {bestSeverity}, which starts at {bestTime.ToString()}, and ends at {endBestSeverity.ToString()}.");
    }
}

PowerGridForecast forecast = PowerGridForecast.GetForecast();
PrintBestTimes(forecast);
#include "pch.h"
#include <iostream>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Devices.Power.h>

using namespace winrt::Windows::Devices::Power;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Windows::Foundation;

void PrintFullForecast(PowerGridForecast const& forecast)
{
    IVectorView<PowerGridData> forecastSignals = forecast.Forecast();
    DateTime forecastStartTime = forecast.StartTime();
    TimeSpan forecastBlockDuration = forecast.BlockDuration();
    DateTime blockStartTime = forecastStartTime;

    // On failure the forecast will be empty.
    if (forecastSignals.Size() == 0)
    {
        std::wcout << L"Error encountered while reading the forecast; try again later." << std::endl;
        return;
    }

    // Iterate through the forecast printing all the data.
    for (auto const& block : forecastSignals)
    {
        auto severity = block.Severity();
        auto isLowImpact = block.IsLowUserExperienceImpact();

        std::wcout << L"Start time - ";
        PrintDateTime(blockStartTime, true);
        std::wcout << L" | End time - ";
        PrintDateTime(blockStartTime + forecastBlockDuration, true);
        std::wcout << L" | Intensity - " << severity << L" | IsLowImpactTime - " << (isLowImpact ? L"TRUE" : L"FALSE") << std::endl;

        blockStartTime = blockStartTime + forecastBlockDuration;
    }
}

void PrintBestTimes(PowerGridForecast const& forecast)
{
    IVectorView<PowerGridData> forecastSignals = forecast.Forecast();
    DateTime forecastStartTime = forecast.StartTime();
    TimeSpan forecastBlockDuration = forecast.BlockDuration();
    DateTime blockStartTime = forecastStartTime;

    // On failure the forecast will be empty
    if (forecastSignals.Size() == 0)
    {
        std::wcout << L"Error encountered while reading the forecast; try again later." << std::endl;
        return;
    }

    DateTime bestSeverityTimeUTC = DateTime::max();
    DateTime bestSeverityTimeInLowUserImpactTimeUTC = DateTime::max();

    // 1.0 is maximum severity the API can return.
    double bestSeverity = 1.0;
    double bestSeverityInLowUserImpactTime = 1.0;

    // Iterate through the forecast looking for the best times.
    for (auto const& block : forecastSignals)
    {
        auto severity = block.Severity();
        auto isLowImpact = block.IsLowUserExperienceImpact();

        // Check if there is lower severity
        if (severity < bestSeverity)
        {
            bestSeverity = severity;
            bestSeverityTimeUTC = blockStartTime;
        }

        // Check whether there's a lower severity that's also at a time with low user impact.
        if (isLowImpact && severity < bestSeverityInLowUserImpactTime)
        {
            bestSeverityInLowUserImpactTime = severity;
            bestSeverityTimeInLowUserImpactTimeUTC = blockStartTime;
        }

        blockStartTime = blockStartTime + forecastBlockDuration;
    }

    // Print out the best times only if they've been set.
    if (bestSeverityTimeUTC != DateTime::max())
    {
        std::wcout << L"Best time to do work is ";
        PrintDateTime(bestSeverityTimeUTC, true);
        std::wcout << L" with a severity of " << bestSeverity;
        std::wcout << L" and ends at ";
        PrintDateTime(bestSeverityTimeUTC + forecastBlockDuration, true);
        std::wcout << std::endl;
    }

    if (bestSeverityTimeInLowUserImpactTimeUTC != DateTime::max())
    {
        std::wcout << L"Best time with low user impact is ";
        PrintDateTime(bestSeverityTimeInLowUserImpactTimeUTC, true);
        std::wcout << L" with a severity of " << bestSeverityInLowUserImpactTime;
        std::wcout << L" and ends at ";
        PrintDateTime(bestSeverityTimeInLowUserImpactTimeUTC + forecastBlockDuration, true);
        std::wcout << std::endl;
    }
    else
    {
        std::wcout << "There's no low-user-impact time in which to do work." << std::endl;
    }
}

int main() 
{
    std::wcout << L"Power Grid Forecast WinRT API sample app." << std::endl;

    // Register for the forecast notification.
    auto revoker = PowerGridForecast::ForecastUpdated(winrt::auto_revoke, [&](auto, winrt::Windows::Foundation::IInspectable const&) {
        std::wcout << L"Forecast updated..." << std::endl;

        // Forecast has been updated; find the next best times.
        PowerGridForecast forecast = PowerGridForecast::GetForecast();
        PrintBestTimes(forecast);
    });

    // Print out the full forecast.
    PowerGridForecast forecast = PowerGridForecast::GetForecast();
    PrintFullForecast(forecast);

    // Wait until the user presses a key to exit.
    std::cout << "Listening to the signal: a new forecast has been created."
                    "Leave this program open to see when a new forecast is created, otherwise press any key to exit this program..." << std::endl;
    std::cin.get();

    return 0;
}

Hinweise

Windows macht Vorhersagen der Co2-Emissionen des Stromnetzes basierend auf dem Stromnetz verfügbar, mit dem das Gerät verbunden ist. Diese Daten werden bereits von Windows Update verwendet, z. B. zur Zeitverschiebung bei Aktualisierungen, um die CO2-Emissionen zu verringern. Diese API macht dieselben Vorhersagen für Sie verfügbar, sodass Sie die CO2-Emissionen einiger Ihrer Workloads reduzieren können. Beispielsweise könnten Sie zeitverlagern, wenn Updates Ihrer Apps/Spiele erfolgen. oder die Bitrate der Audiowiedergabe oder eine andere Renderinggenauigkeitsstufe zu drosseln; oder aktivieren Sie einen Effizienzmodus, falls Vorhanden.

Die API für die Vorhersage des Stromnetzes stellt Ihnen zwei Signale zur Verfügung (zur Aufforderung zur Zeitverschiebung). Ein Signal enthält einen normalisierten Schweregrad (zwischen 0,0 und 1,0) der Gitterbedingungen, für die (Kohlenstoffintensität) optimiert werden soll. Das andere Signal , IsLowUserExperienceImpact, ist ein boolescher Wert, der darstellt, wenn Windows glaubt, dass der Benutzer nicht vom Gerät entfernt ist. Sie können nur ein Signal anstelle von beiden verwenden. die Signale sind sowohl einzeln als auch zusammen wert.

Zeitverschiebung bedeutet, die gleiche Energie zu verwenden, um Arbeit zu erledigen, aber dies zu einer anderen Zeit basierend auf einem Signal.

Der Schweregrad ist ein normalisierter Wert zwischen 0,0 und 1,0, wobei 0 als am besten und 1 als am schlechtesten angesehen wird. Dies entspricht dem Co2-Schweregrad des Stromnetzes basierend auf dem Standort des Geräts.

Geringe Auswirkungen auf die Benutzerfreundlichkeit. Ein boolescher Wert, der darstellt, wann Windows glaubt, dass der Benutzer nicht mehr vorhanden ist oder nicht viele Ressourcen verwendet. Dies kann als inverse Aktive Stunden betrachtet werden. Wenn der Wert ist true, wird dies als guter Zeitpunkt für die Zeitverschiebung von Workloads angesehen. Wenn dies der Fall ist false, wird dies in Bezug auf die Benutzerfreundlichkeit als schlechter Zeitpunkt für die Zeitverschiebung von Workloads angesehen.

Eigenschaften

BlockDuration

Die Dauer jedes Elements im Prognosevektor .

Forecast

Ruft einen Vektor ab, der die Vorhersagedaten enthält. Die Vorhersage ist zusammenhängend und beginnt bei StartTime. Die Startzeit jedes Elements kann mit StartTime + (index * BlockDuration)berechnet werden.

StartTime

Ruft die Startzeit des ersten Elements in Forecast ab.

Methoden

GetForecast()

Statische Methode zum Abrufen der Prognose. Bei einem Fehler wird eine leere Prognose zurückgegeben.

Ereignisse

ForecastUpdated

Ereignis, um Abonnenten zu benachrichtigen, wenn eine neue Vorhersagenutzlast bereit ist. Es wird erwartet, dass Sie GetForecast aufrufen, wenn Ihre App diese Benachrichtigung empfängt.

Gilt für: