Temperatursteuerung Solarpumpe / Mix analog und digital Eingang

Hinweis zur Nutzung von Skripten (für Nutzer)

Die Verwendung von Skripten erfolgt ausdrücklich auf eigene Gefahr. Weder Shelly noch die jeweiligen Autoren oder Entwickler der Skripte übernehmen irgendeine Form der Haftung für mögliche Schäden, Fehlfunktionen, Datenverluste oder anderweitige Beeinträchtigungen, die durch die Nutzung dieser Skripte entstehen könnten. Bitte stellen Sie vor dem Einsatz sicher, dass Sie den Quellcode verstehen und sich der möglichen Auswirkungen bewusst sind. Die Skripte werden ohne Gewähr bereitgestellt und unterliegen keiner regelmäßigen Wartung oder offiziellen Unterstützung.


Hinweis für Entwickler

Wenn Sie eigene Skripte bereitstellen, achten Sie bitte darauf, eine klare Beschreibung, eventuelle Einschränkungen und Sicherheitsaspekte zu dokumentieren. Beachten Sie zudem, dass Nutzer Ihre Skripte grundsätzlich auf eigenes Risiko verwenden. Eine Haftung für Schäden ist ausgeschlossen, sofern diese nicht vorsätzlich oder grob fahrlässig verursacht wurden oder gesetzlich anderweitig geregelt ist.

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.

  • Dear All!

    Ich habe basierend auf den Scripts von 'OSTFRIESE' und 'HighFive' versucht ein Script zu erstellen, welches mir die Solarpumpe einschaltet, wenn die Temperatur der Solaranlage größer als jene im Boiler ist. Die Temperatur der Solaranlage kommt von einem PT1000 und die Temperatur des Boilers von einem DS18B20. Der PT1000 hängt via Messwandler am Analog Eingang des Shelly Plus Add-on und der DS18B20 am digitalen Eingang. Das Add-on steckt auf einem Shelly 1 Gen3.

    Wenn ich folgende Scripte laufen lasse, bekomme ich folgende Fehlermeldung: Uncaught InternalError: Too many scopes removed (ist ein Internal Interpreter Error)

    Dieser Fehler tritt bei beiden Scripts jedoch nur dann auf, wenn ich den Analogeingang abfrage. Mit zwei digitalen Eingängen funktioniert das Script fehlerfrei, ebenso mit einem digitalen und einen Fixwert für temp_outside.

    -> temp_outside = Shelly.getComponentStatus('Input', Config.id_outside).percent;

    -> tempOutside = Shelly.getComponentStatus('Input', 100).percent;

    Der analoge Wert wird am Shelly korrekt angezeigt und ebenso in der Console angezeigt

    Code
    shelly_notification:164 Status change of input:100: {"percent":65.65,"xpercent":65.65}
    Code
    shelly_notification:164 Status change of temperature:100: {"tC":46.62,"tF":115.92}


    Kann mir da bitte jemand weiterhelfen.

    Thx, ein777er

    -------

    //GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
    //More information: https://www.gnu.org/licenses/gpl-3.0.txt
    //ABSOLUTELY NO WARRANTY!!!
    //Made by Ostfriese

    //############################## Config ############################
    let Config = {
    temp_diff : 0.5,
    temp_min : 12,
    id_inside : 100,
    id_outside: 100,
    relay : 0,
    interval : 10 // 2 seconds is the minimum interval
    }
    //############################## Config end ############################

    function watch() {
    temp_inside = Shelly.getComponentStatus('Temperature', Config.id_inside).tC;
    temp_outside = Shelly.getComponentStatus('Input', Config.id_outside).percent;
    //inside <= outside
    if (temp_inside >= temp_outside) {
    Shelly.call("http.get", {url:'http://127.0.0.1/relay/' + JSON.stringify(Config.relay) + '?turn=off'});
    print('Relay(', Config.relay, ') off. Inside temp <= ', temp_outside);
    };
    }

    Timer.set(10000,true,watch);


    -----------

    /// Temperature Control Fan V1.0
    ////////////////////////////////////////////////////////////////////////////////////////////
    ///
    /// Created by HighFive © 2024
    ///
    ////////////////////////////////////////////////////////////////////////////////////////////
    // log = 1; // If no console log needed please set log to "0"
    ////////////////////////////////////////////////////////////////////////////////////////////
    function timerHandler() {
    ////////////////////////////////////////////////////////////////////////////////////////////
    ///tempOutside = Shelly.getComponentStatus('Input', 100).percent; // temperatur outside
    tempOutside = 70;
    tempInside = Shelly.getComponentStatus('Temperature', 100).tC; // temperatur inside
    log = 1;
    ////////////////////////////////////////////////////////////////////////////////////////////
    /// Control switching fan
    ////////////////////////////////////////////////////////////////////////////////////////////
    Shelly.call("Switch.set", {
    'id': 0,
    'on': ((tempOutside > tempInside))
    // 'on': ((Shelly.getComponentStatus('input:100').percent) > (Shelly.getComponentStatus('Temperature', 100).tC))
    });
    ////////////////////////////////////////////////////////////////////////////////////////////
    /// All 1 second print all temperatur sensors and state of the relay to console window
    ////////////////////////////////////////////////////////////////////////////////////////////
    if (log != 0) {
    // print('Outside temperature: ', (Shelly.getComponentStatus('input:100').percent) + ' °C / Inside temperature: ' + (Shelly.getComponentStatus('Temperature', 100).tC) +
    // ' °C / State fan: ' + Shelly.getComponentStatus('switch', 0).output);
    print('Outside temperature: ', tempOutside + ' °C / Inside temperature: ' + tempInside +
    ' °C / State fan: ' + Shelly.getComponentStatus('switch', 0).output);
    print('*******************************************************************************************************');
    };
    };
    ////////////////////////////////////////////////////////////////////////////////////////////
    ///
    ////////////////////////////////////////////////////////////////////////////////////////////
    Timer.set(10000, true, timerHandler,null);
    ////////////////////////////////////////////////////////////////////////////////////////////

  • Ein ähnliches vielleicht so gleiches Problem hatte schon mal ein anderer Nutzer:

    joma0815
    20. Mai 2025 um 19:04

    Obwohl es vermutlich ein Bug ist, "wollte" der Shelly Support hier keinen Fehler "erkennen".

    Mir scheint, man müsste das Thema nochmal aufgreifen.

    Überwiegend PRO 3EM im Einsatz zur Haus und PV Überwachung

  • Dear tvbshelly!

    Das wäre echt toll, wenn dieses Thema nochmals aufgegriffen würde. Ich habe das Auslesen auf mehrere Arten probiert und immer den selben Fehler bekommen. Geholfen hat mir ein Script von NORDLICHT_2023, welches ich im Forum gefunden und in mein Script adaptiert habe.

    Shelly.call("Input.GetStatus",{ id:101 },
    function(result, err_code, err_message, user_data) {
    if (err_code === 0) {
    console.log("Temperature:", result['percent']);
    if (result['percent'] < 20.0) {
    // do something
    } else {
    // do something else
    }
    } else {
    console.log("Error:", err_message);
    }
    }
    );

    und hier mein komplettes und funktionsfähiges Script:

    //GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
    //More information: https://www.gnu.org/licenses/gpl-3.0.txt
    //ABSOLUTELY NO WARRANTY!!!
    //
    // Steuerung Solarpumpe V3.0, 2025/08/12
    // Created by ein777er
    //
    ///////////////////////////////////////////////////////////////////////////////////////////
    // log = 1; // If no log needed please set log to "0"
    ///////////////////////////////////////////////////////////////////////////////////////////


    function timerHandler() {

    Shelly.call("Input.GetStatus",{ id:100 },
    function(result, err_code, err_message, user_data) {
    if (err_code === 0) {
    log = 1;
    if (log != 0) {
    console.log("Solartemperatur (Dach): ", result['percent']);
    }
    tempOutside = result['percent'];
    tempInside = Shelly.getComponentStatus('Temperature', 100).tC;
    Shelly.call("Switch.set", {
    'id': 0,
    'on': ((tempOutside >= tempInside))
    });
    if (log != 0) {
    print('Solartemperatur (Dach): ', tempOutside + ' °C / Boiler L1: ' + tempInside +
    ' °C / State Solarpumpe: ' + Shelly.getComponentStatus('switch', 0).output);
    print('*******************************************************************************************************');
    };
    if (result['percent'] < 20.0) {
    // do something
    } else {
    // do something else
    }
    } else {
    console.log("Error:", err_message);
    }
    }
    );
    };

    ////////////////////////////////////////////////////////////////////////////////////////////
    Timer.set(1000*10, true, timerHandler,null);
    ////////////////////////////////////////////////////////////////////////////////////////////

    Vielen DANK für Deine Unterstützung, ebenso DANK an OSTFRIESE, HighFive & NORDLICHT_2023!

    THx, ein777er

  • Eine kleine Bitte: Zur besseren Lesbarkeit Skripte in einen Code-Block einfügen

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Das wäre echt toll, wenn dieses Thema nochmals aufgegriffen würde.

    Dazu müsstest du bitte den Fehler (nochmal) melden:

    https://support.shelly.cloud/de/support/tic…report_an_issue

    Überwiegend PRO 3EM im Einsatz zur Haus und PV Überwachung

  • Hallo,

    ja, die Hotline bot mir hier keine Unterstützung. Ich habe das Problem mit einem Shelly.call Aufruf umgangen, obwohl ich lieber die Direkaufrufe verwenden würde.

    Java
    Shelly.call('Shelly.GetStatus', null, function(response, error_code) {
    if (error_code === 0) {
    wind = response['input:2'].xfreq;
    rot  = response['input:2'].counts.xtotal
    }
    });
    // Direkaufrufe - funktionieren nicht, Too many scopes removed
    //let wind= Shelly.getComponentStatus('input:2').xfreq;
    //let rot= Shelly.getComponentStatus('input:2').counts.xtotal;
  • Dieses Thema enthält einen weiteren Beitrag, der nur für registrierte Benutzer sichtbar ist.