Hier mal ein kleines Projekt von meinem Bruder und mir.
Ziel war es, möglichst simpel den aktuellen Leistungswert und den Tagesertrag eines Balkonkraftwerks darzustellen.
Dazu haben wir dann einfach die API eines Shelly 1 PM genutzt, die über einen NodeMCU angesprochen wird.
Der verwendete NodeMCU hat direkt ein OLED Display verbaut, auf dem die beiden Werte dargestellt werden.
Derzeit wird die aktuelle Leistung zentral mittig dargestellt, in kleinerer Schriftgröße darunter dann der Tagesertrag.
Das Ganze läuft extrem zuverlässig und durch den NodeMCU auch sparsam.
Für den NodeMCU habe ich ein Gehäuse konstruiert, bei dem die Rückseite einfach eingeclipst wird. Der Programmcode wurde von meinem Bruder geschrieben und kann simpel per Arduino IDE übertragen werden. Die entsprechenden Bibliotheken können dem Script entnommen werden und müssen noch installiert werden. Das setze ich einfach mal voraus =)
Als Board muss das NodeMCU 1.0 (ESP-12E Module)“ gewählt werden, wenn der NodeMCU aus dem Link verwendet wird.
Das Script kann gerne genommen und verändert / an eigene Bedürfnisse angepasst werden.
Hier noch ein paar Impressionen (Ja, bei dem weißen Gehäuse ist etwas schwarz drin )
_DSC4998.JPGsignal-2022-11-18-10-44-13-464.jpg
#include <Wire.h>
#include "SSD1306Wire.h"
#include "OLEDDisplayUi.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <Arduino_JSON.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// -------------------------------
const char* ssid = "Hier WLAN eintragen";
const char* password = "Hier WLAN Passwort eintragen";
const String shelly_server = "Hier Shelly Server eintragen";
const String shelly_auth_key = "Hier Shelly Auth Key eintragen";
const String shelly_device_id = "Hier Shelly ID eintragen";
// -------------------------------
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
SSD1306Wire display(0x3c, D1, D2);
OLEDDisplayUi ui ( &display );
void setup() {
Serial.begin(115200);
delay(4000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { //Check for the connection
delay(1000);
Serial.print(".");
}
Serial.println("Connected to the WiFi network");
timeClient.begin();
display.init();
}
void loop() {
if(WiFi.status()== WL_CONNECTED){
display.clear();
display.setFont(ArialMT_Plain_24);
display.drawString(20, 10, currentConsumption() + " W");
display.setFont(ArialMT_Plain_10);
display.drawString(20, 40, "Heute: " + dayConsumption());
display.display();
}
delay(10000);
}
String dayConsumption() {
JSONVar response = request("/statistics/relay/consumption");
String unit = JSON.stringify(response["data"]["units"]["consumption"]);
unit.remove(0, 1);
unit.remove(unit.length() -1, 1);
const String consumption = JSON.stringify(response["data"]["total"]) + unit;
return consumption;
}
String currentConsumption() {
JSONVar response = request("/device/status");
const String consumption = JSON.stringify(response["data"]["device_status"]["meters"][0]["power"]);
return consumption;
}
JSONVar request(String path) {
WiFiClientSecure client;
HTTPClient http;
client.setInsecure();
http.begin(client, shelly_server + path);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpResponseCode = http.POST("id=" + shelly_device_id + "&auth_key=" + shelly_auth_key + "&channel=0&date_range=day&date_from=" + currenDate());
const JSONVar responseObject = JSON.parse(http.getString());
http.end();
return responseObject;
}
String currenDate() {
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
int currentMonth = ptm->tm_mon+1;
int currentYear = ptm->tm_year+1900;
return String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
}
Alles anzeigen
Die STL Dateien zum Drucken gibt es auch
Hier der verwendete NodeMCU
Bei Verbesserungsvorschlägen einfach melden =)