PowerGridForecast Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Contient des informations sur le réseau électrique auquel l’appareil est connecté. Les données sont destinées à être utilisées dans une prévision pour le décalage du temps auquel les charges de travail se produisent ou la réduction de la consommation d’énergie pendant les périodes intenses.
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
- Héritage
- Attributs
Configuration requise pour Windows
Famille d’appareils |
Windows Desktop Extension SDK (introduit dans 10.0.26100.0)
|
API contract |
Windows.Devices.Power.PowerGridApiContract (introduit dans v1.0)
|
Exemples
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;
}
Remarques
Windows expose les prévisions d’émissions de carbone du réseau électrique en fonction du réseau électrique auquel l’appareil est connecté. Ces données sont déjà utilisées par Windows Update, par exemple, pour décaler le temps lorsque des mises à jour se produisent afin de réduire les émissions de carbone. Cette API vous expose ces mêmes prévisions afin de réduire les émissions de carbone de certaines de vos charges de travail. Par exemple, vous pouvez changer d’heure lorsque des mises à jour de vos applications/jeux se produisent ; ou limitez le débit binaire de la lecture audio ou un autre niveau de fidélité de rendu ; ou activez un mode d’efficacité, si vous en avez un.
L’API de prévision du réseau d’alimentation vous fournit deux signaux (pour vous inviter à changer d’heure). Un signal contient une valeur de gravité normalisée (entre 0,0 et 1,0) des conditions de grille à optimiser pour (intensité carbone). L’autre signal, IsLowUserExperienceImpact, est une valeur booléenne qui représente quand Windows pense que l’utilisateur sera éloigné de l’appareil. Vous pouvez choisir d’utiliser un seul signal au lieu des deux ; les signaux ont une valeur individuellement et ensemble.
Le décalage du temps signifie utiliser la même énergie pour accomplir le travail, mais à un autre moment en fonction d’un signal.
La gravité est une valeur normalisée comprise entre 0,0 et 1,0, où 0 est considéré comme le meilleur et 1 est le pire. Cela correspond à la gravité du carbone du réseau électrique en fonction de l’emplacement de l’appareil.
Faible impact sur l’expérience utilisateur. Valeur booléenne qui représente quand Windows pense que l’utilisateur sera absent ou n’utilisera pas beaucoup de ressources. Cela peut être considéré comme des heures d’activité inverses. Lorsque la valeur est true
, il est considéré comme un bon moment pour déplacer les charges de travail dans le temps. Quand il s’agit false
de , il est considéré comme un mauvais moment pour déplacer les charges de travail dans le temps, en termes d’expérience utilisateur.
Propriétés
BlockDuration |
Durée de chaque élément dans le vecteur Forecast . |
Forecast |
Obtient un vecteur qui contient les données de prévision. La prévision est contiguë et commence à StartTime. L’heure de début de chaque élément peut être calculée avec |
StartTime |
Obtient l’heure de début du premier élément dans Forecast. |
Méthodes
GetForecast() |
Méthode statique pour récupérer les prévisions. En cas d’échec, une prévision vide est retournée. |
Événements
ForecastUpdated |
Événement pour avertir les abonnés lorsqu’une nouvelle charge utile de prévision est prête. Lorsque votre application reçoit cette notification, vous devez appeler GetForecast. |