the parameters to peform an HTTP request by the HTTP(S)+JSON power meter have been generalized by introducing a new config struct. this is now used for all values which the HTTP(S)+JSON power meter can retrieve, and also used by the HTTP+SML power meter implementation. we anticipate that other feature will use this config as well. generalizing also allows to share serialization and deserialization methods in the configuration handler and the web API handler, leading to de-duplication of code and reduced flash memory usage. a new web UI component is implemented to manage a set of HTTP request settings.
44 lines
1.7 KiB
C++
44 lines
1.7 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <stdint.h>
|
|
#include <Arduino.h>
|
|
#include <HTTPClient.h>
|
|
#include "Configuration.h"
|
|
#include "PowerMeterProvider.h"
|
|
|
|
using Auth_t = HttpRequestConfig::Auth;
|
|
using Unit_t = PowerMeterHttpJsonConfig::Unit;
|
|
|
|
class PowerMeterHttpJson : public PowerMeterProvider {
|
|
public:
|
|
~PowerMeterHttpJson();
|
|
|
|
bool init() final { return true; }
|
|
void loop() final;
|
|
float getPowerTotal() const final;
|
|
void doMqttPublish() const final;
|
|
|
|
bool queryValue(int phase, PowerMeterHttpJsonConfig const& config);
|
|
char httpPowerMeterError[256];
|
|
float getCached(size_t idx) { return _cache[idx]; }
|
|
|
|
private:
|
|
uint32_t _lastPoll;
|
|
std::array<float, POWERMETER_HTTP_JSON_MAX_VALUES> _cache;
|
|
std::array<float, POWERMETER_HTTP_JSON_MAX_VALUES> _powerValues;
|
|
std::unique_ptr<WiFiClient> wifiClient;
|
|
std::unique_ptr<HTTPClient> httpClient;
|
|
String httpResponse;
|
|
|
|
bool httpRequest(int phase, const String& host, uint16_t port, const String& uri, bool https, PowerMeterHttpJsonConfig const& config);
|
|
bool extractUrlComponents(String url, String& _protocol, String& _hostname, String& _uri, uint16_t& uint16_t, String& _base64Authorization);
|
|
String extractParam(String& authReq, const String& param, const char delimit);
|
|
String getcNonce(const int len);
|
|
String getDigestAuth(String& authReq, const String& username, const String& password, const String& method, const String& uri, unsigned int counter);
|
|
bool tryGetFloatValueForPhase(int phase, String jsonPath, Unit_t unit, bool signInverted);
|
|
void prepareRequest(uint32_t timeout, const char* httpHeader, const char* httpValue);
|
|
String sha256(const String& data);
|
|
};
|