PowerGridForecast Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
- 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 |
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. |