Um anderen Hilfesuchenden abschließend einen Tip zu hinterlassen:
Hab das jetzt alles mit ESP_NOW realisiert (ohne Router!).
Gruß
Helle
Um anderen Hilfesuchenden abschließend einen Tip zu hinterlassen:
Hab das jetzt alles mit ESP_NOW realisiert (ohne Router!).
Gruß
Helle
Vermutlich nie,
(never change a winning team )
In den Einsteigertipps z. B. ist eine Liste der bisher als inkompatibel bekannten Router verlinkt.
Mag sein, daß mein Router (20 Jahre alt) sogar geeignet wäre, nur ich krieg das wieder mal nicht hin.
Aber bei der Diskussion darüber wurde mir zum Schluß geraten, einen neuen modernen Router zu kaufen.
Dann hätte ich aber tagelang rumstochern müssen, bis ich meine Laptops und anderen PCs dort wieder angemedet hätte wegen Internet. Da hab ich lieber gekniffen.
Deine Anregungen werde ich gerne einbauen.
Ich komm mir eben vor wie einer, der beim ersten Autohändler 4 Kotflügel kauft, beim 2. einen Motor, beim 3. 4 Räder und alles zusammenbaut. Daß das Ding nicht gut aussieht, klar.
Aber wenns fährt, ists immerhin ein Auto.
Und ja, mein sketch mit und ohne den eingesetzten Teil funktioniert. Ich hab Verbindung zum 3EM und bekomme die Verbr/Einsp-Daten seriell geliefert. Und ja, ich kann auch eine Verbindung zum Shelly1 aufbauen und dort über meinen Browser das Relais ein/aus-schalten. Nur eben aus meinem Programm heraus noch nicht.
Der link von Loetauge zeigt, daß man den Shellys auch jedem eine eigene IP verpassen kann, allerdings als Server.
Mal sehn...
Danke, daß du bei mir bleibst!
Natürlich habe ich das schon versucht, einzubinden in mein Wlan. Geht einfach nicht.
Haben wir in einem anderen thread ( Brauche Hilfe zu Einspeisebetrag )schon ausgiebig diskutiert. Habe kapituliert.
Hab mal, wie du vorgeschlagen hast, den Passus in meinen sketch eingefügt und den ESP damit gefüttert. Seltsamerweise ignoriert der den eingesetzten Teil völlig, und verhält sich genau wie vorher. Ich vermute, der Programmteil passt nur zu einer anderen Konstellation und wirkt sich deshalb auf das Ergebnis überhaupt nicht aus. Da das für mich eh nur "Blindflug" ist, daher meine ursprüngliche Frage, ob da mal ein Spezialist drübergucken kann, in der Hoffnung, daß der gleich erkennt, daß das nix ist.
/**
aus BasicHTTPClient.ino
Created on: 24.04.2023
*/
//#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
ESP8266WiFiMulti WiFiMulti;
String x1;
int Wert;
//**********************************
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
for (uint8_t t = 4; t > 0; t--)
{
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("shellyem3-3494547B8D61", "");
}
//*******************************
void loop()
{
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED))
{
WiFiClient client;
HTTPClient http;
if (http.begin(client, "http://192.168.33.1/status"))
{
int httpCode = http.GET(); // start connection and send HTTP header
if (httpCode > 0) // httpCode will be negative on error
{
// HTTP header has been send and Server response header has been handled
//Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY)
{
String payload = http.getString();
Wert = 0;
for (uint16 s = 400; s < 750; s++)
{
String A = payload.substring(s, s + 5);
if (A == "power")
{
s = s + 7;
//======================
x1 = payload.substring(s , s + 10);
Serial. print (x1.toInt()) ;
Serial. print (" ") ;
Wert = Wert + x1.toInt() ;
// xxxxxxxxxxxxxxx
client.stop();
WiFiMulti.addAP("shelly1-349454798D61", "");
while (WiFiMulti.run() != WL_CONNECTED)
{}
if (Wert >= 41)
{
http.begin(client, "http://192.168.33.1/relay/0?turn=on");
}
else
{
http.begin(client, "http://192.168.33.1/relay/0?turn=off");
}
client.stop();
WiFiMulti.addAP("shellyem3-3494547B8D61", "");
// xxxxxxxxxxxxxx
s = s + 10;
//=========================
}
}
Serial. println (Wert) ;
digitalWrite(LED_BUILTIN, HIGH);
delayMicroseconds(5000 + Wert);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
else
{
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
}
}
delay(1000);
}
}
Alles anzeigen
Dein link ist sehr interessant. Super Seite. Auch dort handelt es sich um eine sternförmige Struktur. Allerdings melden sich da die Sternchen an und das tun die Shelly1 ja nicht.
Tun sie wohl doch als Client.
Aber vielleicht kann ich da ja doch einiges abschreiben und mitnehmen.
Wenn ich sowas einfüge in meinen sketch,
client.stop();
WiFiMulti.addAP("shelly1-xxxxxxxx8D61", "");
while (WiFiMulti.run() != WL_CONNECTED)
{}
if (Wert >= 0)
{
if (http.begin(client, "http://192.168.33.1/relay/0?/turn=off"));
}
else
{
if (http.begin(client, "http://192.168.33.1/relay/0?/turn=on"));
}
client.stop();
WiFiMulti.addAP("shellyem3-yyyyyyyy8D61", "");
}
Alles anzeigen
könnte das gehen?
Hab bei einem anderen Anbieter folgenden Hinweis gefunden:
Zitat:
""
Technischer Hinweis:
Der Hersteller hat ab einem gewissen Zeitpunkt die Belegung der Klemmen, bzw. die Anleitung zur Einbaurichtung geändert.
Sollte das Gerät negative Verbrauchswerte anzeigen, bitte die Klemmen einfach umdrehen. Der Einbau sollte von einem Elektrofachbetrieb vorgenommen werden!
""
Zitat Ende
D.h.: Der Meßwert ist wohl in Ordnung, nur das Vorzeichen ist invertiert.
Das Kabel hat auch nur 2 Adern, also nur ein Strom oder eine Spannung als Referenz. Ein "Verdrehen" kann also auch garkeinen Einfluß auf den Meßwert haben.
Nun, genau das, was die meisten wollen, die sich mit Shelly3EM beschäftigen:
Möglichst viel Solarstrom sebst verbrauchen.
Plan B ist: wenn das so nicht funzt, einen 2. 3. 4... ESP8266 und einen Attiny, der vom ersten die Daten vom 3EM bekommt, auswertet und dann über den 2. 3. 4...jeweils einenShelly1 ansteuert.
Aber erst mal keine Feigheit vor dem Feind:
Kann ich meinem Shelly1 eine eigene andere IP verpassen (auch ohne in ein Wlan eingebunden zu sein) und ihn damit gezielt ansprechen?
Alles anzeigenIch kann dir eine solche Vorgehensweise nicht empfehlen.
Ich seh im Moment keine andere.
Die Shellies sollen vermutlich in deinem WLAN erreichbar sein. Das sind sie nicht über diese IP-Adresse.Ich hab keines, in das sich der 3EM einklinkt, deshalb wohl auch nur der AP-Modus
Das Wechseln der AP-Shellies ist aufwändiger und kostet zusätzlich Wartezeit, beides muss zusätzlich implementiert werden.
Vermutlich sollen die beteiligten Shellies durchgehend zugreifbar sein. Das ist mit dieser IP-Adresse nicht möglich.Wenn du das trotz aller Bedenken implementieren willst, solltest du dich mit den dafür vorgesehenen Bibliotheken genauer beschäftigen.
Auch genügt es dann nicht, eine Verbindung in der setup() Funktion herzustellen, da diese ausschließlich beim booten des Mikrocontrollers einmal abgearbeitet wird.
Du musst dann ja regelmäßig zwischen den Shelly-AP wechseln lassen.
Ja,das ist sicher keine opt-Lösung, aber wenn sie klappt, geh ich zum Basteln wieder an mein Auto. Programmieren lernen wollte ich nicht mehr mit 83 Jahren.
Übrigens:
Orientiert man sich am Klappdeckel und/oder am Kabelausgang, dann zeigt sich, daß die Kennzeichnung immer in die gleiche Richtung zeigt.
Vermutlich ist das also eher ein Montagefehler. Die Meßeinrichtung ist wohl verkehrt herum
ins Gehäuse eingebaut.
Das heist, du kannst bestätigen, daß es falsche Angaben gibt?
Hat der Hersteller das jemals kommentiert?
Hin und Wieder wird hier vermutet, daß die Wandler in der falschen Richtung messen.
Ich kann mir nur schwer vorstellen, daß man solche Fehler bei der Produktion nicht entdeckt, oder sie trotzdem in den Verkauf gibt. Aber ich bekomme dennoch nur logisch verständliche Werte, wenn ich 2 der 3 Wandler entgegen der Kennzeichnung montiere.
Gibt es eine andere Erklärung oder ist tatsächlich die Kennzeichnung falsch?
Feststellen läßt sich das eindeutig, wenn alle 3 auf die gleiche Phase klemme und alleSpannungseingänge mit der gleichen zugehöhrigen Phase versorge.
Dann muß der 3EM 3 gleiche Werte anzeigen, oder wenn falsch, dann eben nicht.
Hat das schon jemand überprüft?
Stimmt, die 192.168.33.1 ist die Standard IP-Adresse jedes Shelly im AP-Modus. Hier ist eine IP-Adresse aus deinem WLAN erforderlich.
Von der Eingabe-Zeile meines PC-Browsers kann ich mit "192.168.33.1" tatsächlich beide Shellys erreichen. Abhängig ist das jeweils nur davon, mit welchem Gerät ich vorher die WLan verbindung hergestellt habe. Also müßte es doch genügen, einfach die Verbindungen hin und her zu schalten :
"shellyem3-3494547B8D61","" <...> "shelly1-yyyyyyyy8D61", ""
geht das ??
Super, glaube du hast mich ein Stück weitergebracht.
Meine Programmierkenntnisse beschränken sich auf etwas BASIC auf dem COMMODORE V20
Was die Shellys angeht, hab ich wohl ausreichend verstanden; mein größtes Problem ist die C++-Syntax. Das ist für mich Blindflug. Aber ich seh wieder Licht am Ende des Tunnels (kann auch eine entgegenkommende Lock sein ).
Hallo eiche,
Danke, aber du überforderst mich. Was ist eine 2. Instanz?
Wo finde ich die Dokumentation von Allterco?
Meinst du hier das Lexikon?
Wenn ich das richtig verstanden habe, gehen 2 verschiedene Verbindungen gleichzeitig wohl nicht.
Also sollte das wohl etwa so aussehen:"
Erst Verb_3EM schließen: Stop_client ??
Dann Verb_sh1 öffnen : WiFiMulti.addAP("shelly1-yyyyyyyy2E10", "") ??
Wenn Verb. steht, Befehl absetzen : http://192.168.33.1/relay/0?/turn=on ??
Verb-sh1 wieder schließen : stop_client ??
Verb_3EM wiederherstellen: WiFiMulti.addAP("shellyem3-xxxxxxxx8D61", "") ??
und zurück oder weiter
Hallo zusammen,
hab das jetzt tatsächlich zusammengeklaut:
/**
aus BasicHTTPClient.ino
Created on: 24.04.2023
*/
//#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
ESP8266WiFiMulti WiFiMulti;
String x1;
int Wert;
//**********************************
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
for (uint8_t t = 4; t > 0; t--)
{
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("shellyem3-3494547B8D61", "");
}
//*******************************
void loop()
{
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED))
{
WiFiClient client;
HTTPClient http;
if (http.begin(client, "http://192.168.33.1/status"))
{
int httpCode = http.GET(); // start connection and send HTTP header
if (httpCode > 0) // httpCode will be negative on error
{
// HTTP header has been send and Server response header has been handled
//Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY)
{
String payload = http.getString();
Wert = 0;
for (uint16 s = 400; s < 750; s++)
{
String A = payload.substring(s, s + 5);
if (A == "power")
{
s = s + 7;
//======================
x1 = payload.substring(s , s + 10);
Serial. print (x1.toInt()) ;
Serial. print (" ") ;
Wert = Wert + x1.toInt() ;
s = s + 10;
//=========================
}
}
Serial. println (Wert) ;
digitalWrite(LED_BUILTIN, HIGH);
delayMicroseconds(5000+Wert);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
else
{
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
}
}
//delay(2000);
}
}
Alles anzeigen
Das funktioniert auch.
Es ist das Programm für einen ESP8266, der sich mit dem Shelly3EM verbindet, einen "Status" abruft, den durchsucht nach dem Wort "Power" ("Power" gibts 3x, je 1x für jede Phase), dann den nachfolgenden Wert seriell ausgibt und gleich zum Summenwert dazuzählt und am Ende auch die Summe liefert. Soweit läuft alles, aber für mich ist vieles "Blindflug".
Mein Ziel nun:
Aus diesem Programm heraus möchte ich jetzt einen Shelly1 ein/ausschalten.
IP 192.168.33.1
ID shelly1-yyyyyyyy2E10
Kann ich gleichzeitig zum 3EM eine Verbindung zu Shelly1 aufbauen, und wie kann ich
den dann ansteuern?
"Leider schaltet der Shelly immer noch hin und her."
Ja. ich denke , du hast ihm das ja befohlen .
Du sagst: Einschalten bei > -700, das macht er, dadurch steigt der Verbrauch auf (-700 +650 = -50). Du hast auch gesagt: Ausschalten bei > -100, das ist jetzt erfüllt, also schaltet er aus, wodurch der Verbrauch wieder bei der Einschaltschwelle ist.
Die Ein/Ausschaltschwellen müssen weiter auseinander sein, als der Bedarf des Verbrauchers, sonst pendelt das System natürlich.
"Leider schaltet der Shelly immer noch hin und her."
Ja. ich denke , du hast ihm das ja befohlen .
Du sagst: Einschalten bei > -700, das macht er, dadurch steigt der Verbrauch auf (-700 +650 = -50). Du hast auch gesagt: Ausschalten bei > -100, das ist jetzt erfüllt, also schaltet er aus, wodurch der Verbrauch wieder bei der Einschaltschwelle ist.
Die Ein/Ausschaltschwellen müssen weiter auseinander sein, als der Bedarf des Verbrauchers, sonst pendelt das System natürlich.
Was muß ich in Zeile 48 eingeben, damit der Shelly3EM die richtige Antwort gibt?
Hier bin ich wieder ,
zunächst eine Frage zum DHCP:
Wenn ich mich mit meinem Handy in meinem Netzwerk anmelde, dann wartet das kurze Zeit auf die IP-Adresse, bevor es sich dann verbindet. Bedeutet das denn nicht, daß mein Router DHCP kann?
Aber jetzt hab ich sowieso meine Strategie geändert. Da ich die Daten ja weiterverarbeiten will, und das vollautomatisch, und nicht dauernd einen PC laufen lassen will, hab ich folgenden Plan:
Ich lese die Powerdaten des Shelly's über einen ESP8266 in einen Attiny45 ein.(Seriell oder über eine Pulslänge, was mir einen Pin spart.) Der Attiny kann dann über die 4 freien Pins 16 Zustände ausgeben. Letztlich werden da 4 verschiedene Heizpatronen sein, die im Rücklauf meiner Zentralheizung sitzen werden: 2kW, 1kW, 500W und 250W.
Warum die Heizung? Mit jedem kW Solarstrom, das ich dort einleite, spare ich 1kW Gas, sprich 12 Cent; aber wenn ich's einspeise, krieg ich gerade mal 8 Cent im besten Fall.
Zurück:
Hab mir jetzt den ESP beschafft und der hängt zunächst noch an der Seriellen meines PC's. Hab inzwischen auch ein Sketch mit dem ich den ESP soweit bringe, daß er behauptet, verbunden zu sein. Aber was auch immer ich an den Shelly sende, der antwortet nicht.
Hätt' mich auch gewundert
Habe die Frage auch bei den MicroFans schon gestellt, aber ohne Lösung.
Ich glaube jetzt auch eher, daß die Ursache an den Settings des Shelly's liegt.
Hat jemand eine Idee?
#include <ESP8266WiFi.h>
const char* ssid = "shellyem3-3494547B8D61";
const char* password = "";
const char* host = "192.168.33.1";
const uint16_t port = 80;
int http_get(String getstr);
void setup()
{
Serial.begin(115200); // We start by connecting to a WiFi network
Serial.println();Serial.print("Connecting to ");Serial.println(ssid);
/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("WiFi connected");
Serial.println("IP address: "); Serial.println(WiFi.localIP());
}
void loop() {
static bool wait = false;
WiFiClient client; // Use WiFiClient class to create TCP connections
if (!client.connect(host,port))
{
//Serial.println("connection failed");
delay(5000);
return;
}
if (client.connected())
{
Serial.println("connected: now sending data to server");
client.println("http://192.168.33.1/emeter/0/Status");
}
// wait for data to be available
unsigned long timeout = millis();
while (client.available() == 0)
{
if (millis() - timeout > 10000)
{
Serial.println(">>> Client Timeout !");
client.stop();
delay(60000);
return;
}
}
// Read all the lines of the reply from server and print them to Serial
// Serial.println("receiving from remote server");
// not testing 'client.connected()' since we do not need to send data here
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.println(line);
// char ch = static_cast<char>(client.read());
// Serial.print(ch);
}
// Close the connection
Serial.println();
Serial.println("closing connection");
client.stop();
if (wait) {
delay(300000); // execute once every 5 minutes, don't flood remote service
}
wait = true;
}
Alles anzeigen