NEWS
Wer findet den Fehler im Skript (ZisternenNachbefüllung)
-
Hallo zusammen,
ich habe nach mehreren Stunden mit ChatGPT folgendes Skript erstellt. Leider funktioniert es noch nicht wie gewünscht.
Anforderungen:
wenn Füllstand länger wie 1min kleiner 5% dann schalte Shelly auf true für mindestens 45sec.
Aktualiesiere die berechnung alle 15sec.
Zusätzlich soll der shelly falls er extern auf true gestellt wurde alle 4 Zyklen auf false gestellt werden.alle funktioniert scheinbar aber falls der shelly extern auf true gestellt wird, wird er nicht automatisch auf false gestellt.
Habt ihr eine Idee wo da was falsch programiert ist?
einfach mit Copypaste rausskopiert:
// Konfiguration
const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne
const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter
const threshold = 5; // Schwellenwert auf 5% gesetzt
const checkInterval = 15000; // 15 Sekunden
const activateDuration = 45000; // Standard: 45 Sekunden
const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wirdlet shellyActive = false;
let cycleCount = 0;// Funktion zum periodischen Auslesen des Tankfüllstands
function readTankLevel() {
// Tankfüllstand auslesen
const tankLevel = getState(tankLevelId);
if (tankLevel) {
const tankLevelValue = parseFloat(tankLevel.val);
console.log('Tank Level:', tankLevelValue);if (tankLevelValue < threshold) { // Schalte den Shelly Plug S ein und setze den Timer if (!shellyActive) { shellyActive = true; setState(shellyPlugId, true); console.log('Shelly Plug S aktiviert'); setTimeout(() => { // Deaktiviere den Shelly Plug S nach Ablauf der Zeit shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert'); }, activateDuration); } cycleCount++; if (cycleCount >= maxCyclesBeforeShutdown) { // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen'); cycleCount = 0; } } else { // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück cycleCount = 0; } }
}
// Periodisch den Tankfüllstand auslesen
setInterval(() => {
console.log('--- Neuer Zyklus ---');
readTankLevel();
}, checkInterval); -
@keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):
Habt ihr eine Idee wo da was falsch programiert ist?
Pack mal bitte das ganze Skript in Codetags - dann kann vll geholfen werden
-
@keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):
// Tankfüllstand auslesen
const tankLevel = getState(tankLevelId);Versuche mal so:
var tankLevel = getState(tankLevelId).val;
und
if (tankLevel) {
const tankLevelValue = parseFloat(tankLevel.val);if (tankLevel) { var tankLevelValue = parseFloat(tankLevel);
Habe nur mal kurz überflogen...
Ro75. -
Wo wird denn hier im showroom ein nützliches Projekt vorgestellt?
ich schieb das mal nach javascript.
-
@keineahnungvonprogrmieren
Pack das mal alles in code tags -
@ticaki ; @Ro75
Habe mal versucht die änderungen einzubauen, ist das so gemeint?Leider funktioniert es noch nicht so wie gedacht.
Habe den shelly aus testgründen in der Instanz auf true gestellt, gehe davon aus das das skript Ihn dann auf false stellt.// Konfiguration const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter const threshold = 5; // Schwellenwert auf 5% gesetzt const checkInterval = 15000; // 15 Sekunden const activateDuration = 45000; // Standard: 45 Sekunden const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird let shellyActive = false; let cycleCount = 0; // Funktion zum periodischen Auslesen des Tankfüllstands function readTankLevel() { // Tankfüllstand auslesen const tankLevel = getState(tankLevelId).val; if (tankLevel) { const tankLevelValue = parseFloat(tankLevel); console.log('Tank Level:', tankLevelValue); if (tankLevelValue < threshold) { // Schalte den Shelly Plug S ein und setze den Timer if (!shellyActive) { shellyActive = true; setState(shellyPlugId, true); console.log('Shelly Plug S aktiviert'); setTimeout(() => { // Deaktiviere den Shelly Plug S nach Ablauf der Zeit shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert'); }, activateDuration); } cycleCount++; if (cycleCount >= maxCyclesBeforeShutdown) { // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen'); cycleCount = 0; } } else { // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück cycleCount = 0; } } } // Periodisch den Tankfüllstand auslesen setInterval(() => { console.log('--- Neuer Zyklus ---'); readTankLevel(); }, checkInterval);
-
@keineahnungvonprogrmieren
Sorry natürlich in objekten -
Falsch läuft das du alle 15 Sekunden den Füllstand prüfst und wenn true schaltest du den shelly an und dann prüfst du 15 Sekunden später auf den Füllstand und schaltest den Shelly auf True und dann kommst drauf an wer zu erst malt. Jetzt kommt dein Timeout zurück und schaltet den Shelly ab und dann prüfst du den Füllstand und schaltest den Shelly auf true
Zeit des umschließenden Intervals auf 1 Minute setzen.
-
// Konfiguration const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter const threshold = 5; // Schwellenwert auf 5% gesetzt const activateDuration = 45000; // Standard: 45 Sekunden const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird let shellyActive = false; let cycleCount = 0; // Funktion zum periodischen Auslesen des Tankfüllstands function readTankLevel() { if (tankLevel) { var tankLevelValue = parseFloat(tankLevel); console.log('Tank Level:', tankLevelValue); if (tankLevelValue < threshold) { // Schalte den Shelly Plug S ein und setze den Timer if (!shellyActive) { shellyActive = true; setState(shellyPlugId, true); console.log('Shelly Plug S aktiviert'); setTimeout(() => { // Deaktiviere den Shelly Plug S nach Ablauf der Zeit shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert'); }, activateDuration); } cycleCount++; if (cycleCount >= maxCyclesBeforeShutdown) { // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen shellyActive = false; setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen'); cycleCount = 0; } } else { // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück cycleCount = 0; } } } on(tankLevelId, function(dp) { // Tankfüllstand auslesen var tankLevel = dp.state.val; console.log('--- Neuer Zyklus ---'); readTankLevel(); });
-
@keineahnungvonprogrmieren sagte: soll der shelly falls er extern auf true gestellt wurde alle 4 Zyklen auf false gestellt werden.
Vorschlag mit Shedule und Trigger auf den Shelly:
// Konfiguration const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter const threshold = 5; // Schwellenwert auf 5% gesetzt const checkInterval = 15000; // 15 Sekunden const activateDuration = 45000; // Standard: 45 Sekunden const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird let shellyActive = getState(shellyPlugId).val; var timer = null; // Funktion zum periodischen Auslesen des Tankfüllstands function readTankLevel() { // Tankfüllstand auslesen const tankLevel = parseFloat(getState(tankLevelId).val); if (tankLevel) { console.log('Tank Level:', tankLevel); if (tankLevel < threshold) { // Schalte den Shelly Plug S ein und setze den Timer if (!shellyActive) { setState(shellyPlugId, true); console.log('Shelly Plug S aktiviert'); } } else if(shellyActive && !timer) { timer = setTimeout(() => { // Deaktiviere den Shelly Plug S nach Ablauf der Zeit setState(shellyPlugId, false); console.log('Shelly Plug S deaktiviert'); timer = null; }, activateDuration); } } } // Periodisch den Tankfüllstand auslesen schedule('*/15 * * * * *', function() { console.log('--- Neuer Zyklus ---'); readTankLevel(); }); on(shellyPlugId, function(dp) { shellyActive = dp.state.val; if(shellyActive && dp.state.c != scriptName) { setTimeout(function() { setState(shellyPlugId, false); }, maxCyclesBeforeShutdown * checkInterval); } });
@keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):
kleiner 5% dann schalte Shelly auf true für mindestens 45sec.
-
Mit dem skript funktioniert es . Vielen Dank für die Hilfe.