Nicht zuu schnell!
Da sind noch Schreibfehler drin, u.a. sollte es besser schedules_json lauten ...
Bin gespannt, wie es letztlich funktionieren wird.
Edit: ausbaufähig
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
Nicht zuu schnell!
Da sind noch Schreibfehler drin, u.a. sollte es besser schedules_json lauten ...
Bin gespannt, wie es letztlich funktionieren wird.
Edit: ausbaufähig
Alter, Alter, sou geit dat nich.
Du musst den Dig. Inp. mit GND verbinden (per Schalter oder so).
Siehe https://kb.shelly.cloud/knowledge-base/shelly-plus-add-on
Codebeispiel, nicht komplett:
let Status = {
DigInp : null
};
Shelly.addEventHandler(
function(e) {
//print(JSON.stringify(e));
let comp = e.info.component;
if(comp===undefined) return;
if (comp==="input:100") {
print("Digital Input: ", e.info.state);
Status.DigInp = e.info.state;
}
}
);
// Dort, wo bedingt geschaltet werden soll:
if(Status.DigInp) Shelly.call("switch.set", {id:0, on:true});
Alles anzeigen
Nun bleibt noch die Frage, wie du das Skript mit einem Schedule Job verbinden kannst.
Es gibt dafür die Methode "script.eval", diese wird aber derzeit wohl nicht in der Shelly Konfiguration angeboten.
Man kann aber sehr gut abseits der App, der WebUI und der Cloud per RPC Schedule Jobs anlegen und/oder ändern.
Ich schaue mal in der Konfiguration nach ...
Shelly.addEventHandler(
function(e) {
//print(JSON.stringify(e));
let comp = e.info.component;
if(comp===undefined) return;
if (comp==="input:100") {
print("Digital Input: ", e.info.state);
//In e.info.state liegt der Eingangszustand false|true.
// ...
}
}
);
Alles anzeigen
Edit:
Nun gibt es prinzipiell zwei Implementationen.
Ich favorisiere eindeutig Variante 1. Code kann bei Bedarf folgen ...
Edit 1:
Variante 2 ist aufwändiger, weil hierfür ein RPC Aufruf erforderlich ist und diese Aufrufe asynchron ablaufen. D.h. dass dir der Status nicht unmittelbar zur Verfügung steht.
Ich habe mal das Shelly Relais mit GND und Digital Input verbunden und lasse schalten.
Damit liefert die Abfrage .../rpc/input.getstatus?id=100 die passenden Werte.
Nun werde ich mal den Eventhandler erstellen und prüfen.
Bis später ...
Ja klar, und der Input muss auch eingerichtet/angemeldet werden am Shelly ...
*vor den Kopf schlag*
nachdenk ...
Ich nutze einen Plus 1 mit AddOn, aber mit einem DHT22 Sensor und keinem digitalen Input.
Meine Abfrage liefert ebenfalls
was nicht verwunderlich ist. Somit vermute ich, dass dein Anschluss nicht korrekt ist oder dein Schalter nicht arbeitet.
Prüfe bitte mal mit einem Durchgangsprüfer (Ohmmeter), ob dein Schalter wirklich schaltet!
Ich hatte Hilfe zur Selbsthilfe versucht und zu wenig Zeit für mehr Aufwand.
Ansonsten ist es spannend, wie der TE mit einem Skript zurechtkommt.
Ganz ohne Kenntnisse dbzgl. ist er anscheinend nicht.
Die Dokumentation von Allterco Robotics ist vergleichsweise umfang- und aufschlussreich.
Zum Input eines AddOn: https://shelly-api-docs.shelly.cloud/gen2/Component…tstatus-example
Btw, die schedule jobs sind per RPC sehr flexibel nutzbar, falls du über die in der WebUI angebotenen Möglichkeiten hinausgehen möchtest.
Dazu https://shelly-api-docs.shelly.cloud/gen2/Component…rvices/Schedule
Ab Firmware 1.0 steht nach der Doku die Date Klasse zur Verfügung.
Ich habe bisher nicht damit experimentiert.
In der Doku findest du den Hinweis unter
https://shelly-api-docs.shelly.cloud/gen2/Scripts/S…anguageFeatures
Dort geht es per Linktext Espruino zu https://www.espruino.com/Reference#Date.
Vielleicht genügt die Performance für hinreichend genaue Daten.
Viel Erfolg
Mir gefällt prinzipiell dein Entwurf, trotzdem habe ich zwei kleine Einwände.
Vorteile deines Entwurfs:
Nachteile deines Entwurfs:
Aus technischer Sicht würde ich den Einsatz eines Gerätes (bspw. Shelly Plus 1PM) bevorzugen und diesem ein kleines Skript einverleiben.
Ein solches Skript ist nicht aufwändig, muss allerdings erstellt werden. Vielleicht gibt es dafür auch eine Vorlage.
Skriptidee:
Das Signal am Switch-Eingang des Shelly ändert sich -> Ereignis -> der Eventhandler registriert dies und arbeitet wie folgt:
Bei ON wird der Zustand einer Error-Variablen geprüft.
Beinhaltet diese true, geschieht nichts weiter, weil die Pumpe vorher zu lange lief.
Andernfalls wird der Ausgang auf ON geschaltet und ein Timer (für 20 Minuten) gestartet,
Bei OFF wird der gestartete Timer beendet, der Ausgang auf OFF geschaltet und Error nicht verändert..
Mit Ablauf des Timers wird die Variable Error auf true gesetzt und der Ausgang auf OFF geschaltet.
Um das Ganze ausfallsicher zu gestalten, wird mit jeder Änderung von Error dessen Wert in den nichtflüchtigen Speicher (NVS) kopiert - hier per KVS.
Dieser Wert wird mit jedem Skriptstart, regulär nach einem Stromausfall, vom NVS in die Variable Error kopiert.
Ich wäre evtl. bereit, ein solches Skript zu erstellen, genügend Muße meinerseits dafür vorausgesetzt.
Mein Motiv dafür könnte ein Einsatz für meine Zisternenpumpe sein.
Edit:
Eine Kommunikationsschnittstelle zum rücksetzen von Error auf false ist vorteilhaft und implementierbar.
Auch die Dauer für den Timer ist per KVS konfigurierbar.
Edit2:
Statt des Switch-Eingangsereignisses sollte hier ein Ereignis der Leistungsänderung genutzt werden, ich vergaß dies vorübergehend.
Steigt diese Leistung über einen festgelegten Schwellwert, wird der Timer gestartet.
Fällt diese Leistung unter einen festgelegten Schwellwert, wird der laufende Timer beendet.
Ansonsten wie oben.
Die Schwellwerte können bei Bedarf ebenfalls per KVS konfigurierbar gemacht werden.
An einer Tauchpumpe würde ich kein Elektrikgehäuse ohne Not öffnen ...
Zusätzlich wäre es erforderlich, die Werte vom Drucksensor zu analysieren, um eine zielführende Schadensbegrenzung erreichen zu können.
Genau genommen sind für einen solchen Fall zwei Druckmessstellen jeweils an den Schlauchenden zielführend.
Diesen Aufwand will der TE vermutlich nicht treiben.
Die vom TE genutzte Transformation Schaltzustand -> Leistungsentnahme erscheint mir für eine Implementation mit geringem Aufwand durchaus geeignet.
Da du eine Schadensminderung durch bspw. geplatzten Schlauch anstrebst, erscheint es mir unangemessen, hierfür die Cloud einzusetzen (Szene).
Eine solche Schadensminderungsfunktion sollte möglichst direkt auf dem überwachenden Gerät implementiert werden.
Hierzu empfehle ich eine Shelly der zweiten Generation (Zusatz "Plus", bspw. Shelly Plus 1 PM) und ein Skript.
Deren aktuelle Firmware arbeitet derzeit sehr stabil, auch mit Skripten.
Was du letztlich bevorzugst, ist selbstverständlich alleine deine Angelegenheit.
...
Folgende Fragen/Anmerkungen/Unklarheiten:
Vorweg - ich kann kein Python, bin Anhänger von C und C++.
Ich nutze erstmalig PyCharm (community edition).
Nun erwarte ich irgendeine Konfiguration bzw. Quellcode-Anpassung zum Ziel-Shelly, finde dazu aber nichts.
Ein mutiger Klick auf den Run-Button (grüner Pfeil/Dreieck) ergibt eine Fehlermeldung
Zitatimport requests
ModuleNotFoundError: No module named 'requests'
Nun weiß ich nicht weiter.
Was kann ich?
Was kann ich nicht?
Welche Schritte sind durchzuführen, damit
Diese Fragen sind inzwischen geringfügig veraltet. Ich lasse sie trotzdem stehen, weil sie mir im Vorfeld noch nicht als hinreichend behandelt erscheinen.
Ich habe inzwischen die Parametereinstellungen zu deinem Python-Programm gefunden.
Was bedeuten bzw. bewirken die letzten drei Parameter "1 0 1"?
Die o.a. Fehlermeldung bleibt trotz passender Parametereinträge. Vermutlich fehlt mir eine passende Bibliotheksumgebung.
Gruß
eiche
Edit:
Ich verwende sehr ungerne vorgefertigte Projekt-Pfade und tat dies in diesem Projekt auch nicht.
Also ...
zunächst einmal vielen Dank für deine Informationen.
Ich bin dran, dieses Verfahren zu testen, muss aber noch learning by doing praktizieren.
Falls präzisierbare Fragen meinerseits auftauchen, werde ich diese hier posten.
Bisher kam ich mit dem Editor im Browser gut zurecht, erkenne aber an, dass eine IDE beim coden unterstützt.
Dass ich ein Anhänger von Skripten der ESP 32 bin, dürfte bekannt sein.
Vorweg: Ich habe derzeit keinerlei PV-Anlage.
Es bleibt die Frage, wie du feststellen lassen kannst, wenn die kleine PV-Anlage einspeist.
Ist daran ständig ein Verbraucher angeschlossen, über den du die Stromstärke bzw. Leistung (richtungsabhängig) messen kannst?
Dann bliebe die Frage nach der Messempfindlichkeit eines EM.
Ansonsten erscheint mir der Einwand von Schubbie sehr begründet.
Ich kann dir nur eine Zusammenfassung von bereits Angeführtem empfehlen + kleine Ergänzung.
Nimm eine Raspberry Pi - mindestens Gen. 2 - und installiere dort einen MQTT Broker.
Dann hast du dieses eh doofe Cloud Gedöns nicht.
Wo der Raspberry Pi laufen soll, überlegst du dir selbst.
Mit einer VPN gelingt die Verbindung.
Die Installation eines Brokers wie Mosquitto ist sehr einfach.
Wenn du dir das nicht zutraust, kennst du vielleicht jemanden, der das mal schnell für dich erledigt.
Nebenbei könnte der Raspberry Pi noch andere Dinge tun.
Von nichts kommt nichts.
Der link von Loetauge zeigt, daß man den Shellys auch jedem eine eigene IP verpassen kann, allerdings als Server.
Das bringt insofern nichts, als dann immer noch beide Shellies ihr eigenes WLAN aufspannen.
(never change a winning team
)
Nun, so richtig gewinnt dieses dein Team ja eigentlich nicht.
Es wird höchste Zeit, dass du dir einen neuen Router zulegst.
Vermutlich nutzt du DHCP. Da ist der Aufwand, deine Geräte mit einem neuen Router zu verbinden vergleichsweise gering.
Aber auch, wenn du statische IP-Adressen verwendest, ist der Router relativ leicht dafür einzustellen.
Trau dich!
Edit:
Und dein Vorhaben gelingt mit einem ESP32 Shelly per Skript noch leichter und besser.
Ich täte versuchen, dir dabei zu helfen.
Ich nutze derzeit keine Arduino-Programmierung und komme nicht dazu, deinen Programmcode zu prüfen.
In Zeile 41 steht
if (httpCode > 0) // httpCode will be negative on error
Wenn der Kommentar stimmt, sollte die Bedingung so lauten:
Vielleicht ist dies nicht relevant, ich kenne die möglichen Resultate nicht.
Der Code weist so oder so einige "Unschönheiten" auf, welche das Programm sehr schlecht pflegbar macht.
Es stecken einige "mystische Werte" darin.
Das sind die WLAN SSID der beiden Shellies "shellyem3-3494547B8D61" und "shelly1-349454798D61".
Stattdessen sind besser Konstanten zu setzen.
Auch das Finden der gewünschten Daten (suchen nach "power") erscheint sehr umständlich. Stattdessen sollte die String Methode indexOf() verwendet werden.
Ab Zeile 50 in deinem Code etwa so:
const int SearchStart = 400;
int pos = payload.indexOf("power", SearchStart);
if (pos>=0) {
String x1 = payload.substring(pos, ...); // Ich kenne die genaue Textstruktur der Antwort nicht. Du magst mal eine solche Antwort posten.
// verarbeiten
}
Auch ist es hilfreich, zunächst ausschließlich die Kommunikation mit dem EM3 zu testen.
Wenn dies fehlerfrei gelingt, wäre das Gleiche mit dem Shelly1 zu testen, allerdings mit anderem Code.
Im dritten Schritt kann versucht werden, beides zu vereinen.
Mein Problem: Ich kenne die Klasse WifiMulti nicht. Deshalb weiß ich derzeit nicht, wie damit von einem Access Point (AP) auf einen anderen umgeschaltet werden kann.
Vielleicht werde ich dbzgl. mal recherchieren.
Es erscheint auch verwunderlich, dass die Shellies sich nicht mit deinem WLAN verbinden lassen.
Es mag AP geben, mit denen Probleme auftreten können. Ich hatte bisher mit so etwas keine Probleme.
Welchen AP bzw. Router nutzt du?
Ich kann nur empfehlen, die Shellies in das WLAN zu bringen.
Halte die Ohren steif!