Shelly schaltet nicht

  • Hi Leute,

    ich habe hier in der Suche das Script von Ostfriese gefunden, das ich für meine Pumpensteuerung angepasst habe.

    Ich habe einen wasserführenden Kamin der einen Pufferspeicher speist. Die Steuerung soll folgendes machen.

    • Wenn die Temperatur im Kamin 65 Grad erreicht dann schalte die Pumpe an. -> Schalte Shelly Plus 1PM ein
    • Wenn die Temperatur über 65 Grad ist, dann prüfe den Temperaturunterschied zum Pufferspeicher, ist dieser größer, gleich 4 Grad, dann schalte Pumpe an
    • <= 4 Grad, schalte Pumpe aus.

    Hier das angepasste Script von Ostfriese

    Aber irgendwie funktioniert das nicht immer. Gestern lief es erst, aber heute morgen nicht.

    Derzeit hat mein Kamin 70 Grad, Delta ist >= 4 Grad, aber der Shelly Plug wird nicht eingeschaltet. Die Bedingungen scheinen zu passen, er biegt richtig ab, was ja die Logausgaben belegen. Relay( 0 ) on. Delta >= 4. Aber das Einschalten hackt.

    Temp. Kamin = 70.5
    10:55:40

    Temp. Speicher = 38.9
    10:55:40

    Temp. Delta= 31.6
    10:55:40

    Relay( 0 ) on. Delta >= 4

    Hier noch ein paar mehr Logausgaben:

    shos_rpc_inst.c:230 http.get via loopback
    11:14:37

    shelly_http_client.:306 0x3ffe45d0: HTTP GET http://127.0.0.1/relay/0?turn=on
    11:14:37

    shelly_notification:163 Status change of temperature:101: {"id":101,"tC":43.06,"tF":109.51}
    11:14:38

    shelly_notification:163 Status change of temperature:100: {"id":100,"tC":71.00,"tF":159.80}
    11:14:43

    shelly_http_client.:606 0x3ffe5fc4: Finished; bytes 0, code 0, redir 0/3, auth 0, status DEADLINE_EXCEEDED: Timed out
    11:14:43

    Temp. Kamin = 71
    11:14:47

    Temp. Speicher = 43.1
    11:14:47

    Temp. Delta= 27.9
    11:14:47

    shelly_ejs_rpc.cpp:41 Shelly.call http.get {"url":"http://127.0.0.1/relay/0?turn=on"}
    11:14:47

    Relay( 0 ) on. Delta >= 4
    11:14:47

    11:14:47

    shos_rpc_inst.c:230 http.get via loopback
    11:14:47

    shelly_http_client.:306 0x3ffe5fc4: HTTP GET http://127.0.0.1/relay/0?turn=on
    11:14:47

    shelly_notification:163 Status change of temperature:101: {"id":101,"tC":43.19,"tF":109.74}
    11:14:48

    shelly_notification:163 Status change of temperature:100: {"id":100,"tC":71.12,"tF":160.03}
    11:14:53

    shelly_http_client.:606 0x3ffe45d0: Finished; bytes 0, code 0, redir 0/3, auth 0, status DEADLINE_EXCEEDED: Timed out
    11:14:53

    Temp. Kamin = 71.1
    11:14:57

    Temp. Speicher = 43.1
    11:14:57

    Temp. Delta= 28
    11:14:57

    shelly_ejs_rpc.cpp:41 Shelly.call http.get {"url":"http://127.0.0.1/relay/0?turn=on"}
    11:14:57

    Relay( 0 ) on. Delta >= 4
    11:14:57

    11:14:57

    shos_rpc_inst.c:230 http.get via loopback
    11:14:57

    shelly_http_client.:306 0x3ffe45d0: HTTP GET http://127.0.0.1/relay/0?turn=on
    11:14:57

    shelly_notification:163 Status change of temperature:101: {"id":101,"tC":43.06,"tF":109.51}
    11:14:58

    shelly_notification:163 Status change of switch:0: {"id":0,"aenergy":{"by_minute":[0.000,0.000,0.000],"minute_ts":1709892900,"total":6657.430}}
    11:15:00

    shelly_notification:163 Status change of temperature:100: {"id":100,"tC":71.25,"tF":160.25}
    11:15:03

    shelly_http_client.:606 0x3ffe5fc4: Finished; bytes 0, code 0, redir 0/3, auth 0, status DEADLINE_EXCEEDED: Timed out
    11:15:03

    Temp. Kamin = 71.2
    11:15:07

    Temp. Speicher = 43.1
    11:15:07

    Temp. Delta= 28.1
    11:15:07

    shelly_ejs_rpc.cpp:41 Shelly.call http.get {"url":"http://127.0.0.1/relay/0?turn=on"}
    11:15:07

    Relay( 0 ) on. Delta >= 4
    11:15:07

    11:15:07

    shos_rpc_inst.c:230 http.get via loopback
    11:15:07

    shelly_http_client.:306 0x3ffe5fc4: HTTP GET http://127.0.0.1/relay/0?turn=on
    11:15:07

    shelly_notification:163 Status change of temperature:100: {"id":100,"tC":71.38,"tF":160.47}
    11:15:13

    shelly_http_client.:606 0x3ffe45d0: Finished; bytes 0, code 0, redir 0/3, auth 0, status DEADLINE_EXCEEDED: Timed out
    11:15:13

    Temp. Kamin = 71.4
    11:15:17

    Temp. Speicher = 43.1
    11:15:17

    Temp. Delta= 28.3
    11:15:17

    shelly_ejs_rpc.cpp:41 Shelly.call http.get {"url":"http://127.0.0.1/relay/0?turn=on"}
    11:15:17

    Relay( 0 ) on. Delta >= 4


    Idee woran das liegen könnte ?

    Danke u. Gruß

    Spike

    2 Mal editiert, zuletzt von spike78 (8. März 2024 um 11:16)

  • Das Skript arbeitet offensichtlich zumindest gelegentlich, was an Hand der Skriptausgeben zu sehen ist.

    Wenn etwas nicht funktioniert, ist als erstes zu prüfen, ob das Skript weiterhin läuft.

    Du schreibst von einem Shelly Plus 1PM und später von einem Shelly Plug - ist das einer der ersten Generation (vermutlich).

    Es ist nicht hinreichend deutlich, welcher der beiden wofür zuständig ist.

    Im Skript werden HTTP Requests ausschließlich an die IP Adresse 127.0.0.1 (=localhost) gerichtet, was ja ausschließlich am selben Shelly wirksam werden kann, auf dem das Skript arbeitet.

    Hierzu dürfte in der Config Struktur ein Eintrag Remote (o.ä.) fehlen, der die IP Adresse des Plug beinhalten muss.

    In den oder zumindest einem der HTTP Requests ist dann statt 127.0.0.1 Config.Remote zu verwenden, damit der Plug die Requests erhält.

    Falls du lokal schalten lassen willst, täte ich dafür kein HTTP Request einsetzen sondern einen schlichten Shelly.call("Switch.Set", ...) Aufruf, es sei denn du willst das Skript so offen halten, dass du jederzeit statt lokal zu schalten ein anderes remote Gerät schalten lassen kannst. Dann sind aber die IP Adressen in deinen Requests unterschiedlich zu wählen, also ggf. ein weiterer Config Eintrag einzusetzen.

    Ich empfehle sogar, in Config komplette URL(s) zu notieren, die an dieser einen Stelle gepflegt werden können und an den Stellen ihres Einsatzes einen schlichteren Aufruf gestatten.

    Bsp:
    let Config = {

    UrlPumpe: 'http://<IP Adresse>/relay/0?turn=off'; // Hier wird der zielführende URL komplett festgelegt.

    // ...
    }

    // An der Stelle der URL-Nutzung:

    Shelly.call("http.get", {url: UrlPumpe});

    Ich bin derzeit überfragt, ob ein Shelly der zweiten Generation auch URLs verarbeitet, die für Geräte der ersten Generation gelten. Wenn, dann ausschließlich aus Gründen einer Rückwärts-Kompatibilität. Andernfalls laufen solche URLs in's leere.

    Zwecks Fehleranalyse sind erheblich genauere Informationen erforderlich.

    Aber irgendwie funktioniert das nicht immer. Gestern lief es erst, aber heute morgen nicht.

    Solche Aussagen haben einen Informationsgehalt von fast Null.

    1. Was lief gestern?
    2. Was lief heute Morgen nicht?
    3. Welche Schaltvorgänge gelingen?
    4. Welche Schaltvorgänge gelingen nicht

    Das sollte erst einmal genauer geklärt werden.

    Trotzdem können dich meine obigen Aussagen zum Skript bereits weiterbringen.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    5 Mal editiert, zuletzt von eiche (8. März 2024 um 18:35)

  • Wenn die Temperatur im Kamin 65 Grad erreicht dann schalte die Pumpe an.

    So etwas geht nicht wirklich. Was soll "65 Grad erreicht" bedeuten?

    Nur wenn die Temperatur genau 65 Grad ist (für Regelungen unbrauchbar) oder wenn sie mindestens 65 Grad ist?

    Letzteres passt nicht zum folgenden Zitat.

    Wenn die Temperatur über 65 Grad ist, dann prüfe den Temperaturunterschied zum Pufferspeicher, ist dieser größer, gleich 4 Grad, dann schalte Pumpe an

    Dies sollte den Inhalt des ersten Zitats überflüssig machen.

    Zum brauchbaren Regeln (oder Steuern) fehlt hier eine Hysterese der Temperaturdifferenz. Ohne eine solche Hysterese wird im nahen Bereich der Differenz von 4 Grad (mal 4.1, mal 3.9) wiederholt in kurzen Abständen geschaltet. Solche Temperaturschwankungen bzw. Messschwankungen sind zu erwarten.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

  • Noch etwas zum Skript.

    Ich kenne den Ersteller des, nach deinem Hinweis, ursprünglichen Skriptes und halte sehr viel von seiner Kompetenz. Trotzdem ist es wenigstens guter Stil, eine Variable mit deren erstem Einsatz per Schlüsselwort "let" anzulegen,

    also bspw. in Zeile 19 statt temp_kamin =

    let temp_kamin =

    zu notieren.

    Die grundsätzliche Funktionsfähigkeit sollte aber mit diesem Skript gelingen.

    Noch ein kleiner Hinweis:

    Wenn du den Wert von Config.relay als String einsetzt (hier '0'), kannst du dir an anderer Stelle den Aufruf JSON.stringify(Config.relay) sparen und stattdessen nur Config.relay einsetzen.

    Empfehlung:

    Wenn du dich gelegentlich mit event handler beschäftigen solltest, wirst du vielleicht erkennen, dass es durchaus zielführend wäre, einen solchen event handler statt der regelmäßigen Abfragen einzusetzen. Dies ist aber nur eine zweckmäßige Alternative und keine Notwendigkeit. Bei Einsatz eines event handlers sind allerdings eintreffende Werte immer auch zu speichern, damit diese für spätere Vergleiche zur Verfügung stehen.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    3 Mal editiert, zuletzt von eiche (8. März 2024 um 18:38)

  • Und noch etwas fällt mir bei genauerem Hinsehen auf.

    Das Skript gibt jeweils bzgl. des Schaltens etwas aus, was "es nur vermuten kann", aber nicht vom beauftragten Gerät bzw. der Methode als Antwort kommt.

    Das ist nicht geeignet und führt zu nicht sicheren Beobachtungen.

    Hierfür sind Responses oder callback Funktionen einzusetzen.

    Bei Einsatz von HTTP.Get ist die Antwort auszuwerten, die bei Shelly.call("HTTP.Get", ...) in der callback Funktion per Parameter (oft result benannt) eintreffen sollte.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    2 Mal editiert, zuletzt von eiche (8. März 2024 um 18:32)

  • Dieses Thema enthält 8 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind.