Ich habe noch mal drüber nachgedacht und mit den vorhandenen Mitteln, bekomme ich für mich keine gute Lösung hin.
Habe das Script noch mal deutlich überarbeitet, aber es klappt nur bedingt. Was an den Datenpunkten vom Sprinklercontrol liegt und an dem Shelly.
Der Shelly verhält sich anders als erwartet. Man kann den Wert AutoTimeOff nicht ändern, wenn der Switch auf True steht.
Sieht dann so aus.
timer.png
Mein Script, wenn wer gucken will. DIe Datenpunkte sind leider Strings im Sprinklercontrol, daher musste ich umrechnen. Hätte sek. erwartet.
const pumpAutoTimerDP = 'shelly.0.SHSW-1#A4CF12F41B2C#1.Relay0.AutoTimerOff';
const pumpSwitchDP = 'shelly.0.SHSW-1#A4CF12F41B2C#1.Relay0.Switch';
const countdownDPs = [
'sprinklecontrol.0.sprinkle.Beet.runningTime',
'sprinklecontrol.0.sprinkle.Rasen.runningTime',
'sprinklecontrol.0.sprinkle.Terrasse.runningTime',
'sprinklecontrol.0.sprinkle.Vorgarten.runningTime',
'sprinklecontrol.0.sprinkle.Weg.runningTime'
];
const delay = 5; // Zusätzliche Verzögerung in Sekunden
let totalCountdownTimer = null; // Timer für die Gesamt-Laufzeit
let currentTotalCountdown = 0; // Aktuelle Gesamt-Laufzeit in Sekunden
// Funktion zur Berechnung und Aktualisierung der Gesamtlaufzeit
function updateTotalCountdown() {
let newTotalCountdown = 0;
let anyActive = false;
// Summiere die runningTime-Werte aller Sprinkler und rechne von Minuten:Sekunden in Sekunden um
for (const dp of countdownDPs) {
const val = getState(dp).val;
if (val && typeof val === 'string' && val.includes(':')) {
const parts = val.split(':');
const minutes = parseInt(parts[0], 10) || 0;
const seconds = parseInt(parts[1], 10) || 0;
// Umrechnung in Sekunden und zur Gesamtlaufzeit hinzufügen
const totalSecondsForSprinkler = (minutes * 60) + seconds;
newTotalCountdown += totalSecondsForSprinkler;
if (totalSecondsForSprinkler > 0) {
anyActive = true;
}
}
}
// Nur bei Änderungen den AutoTimer anpassen
if (newTotalCountdown !== currentTotalCountdown && newTotalCountdown > 0 ) {
currentTotalCountdown = newTotalCountdown;
// Shelly AutoTimerOff setzen (in Sekunden)
setState(pumpAutoTimerDP, newTotalCountdown + delay, false);
log(`Gesamtlaufzeit aller Sprinkler: ${newTotalCountdown} Sekunden. AutoTimerOff wurde gesetzt.`);
}
// Timer-Logik für die Backup-Abschaltung
if (totalCountdownTimer) {
clearTimeout(totalCountdownTimer);
totalCountdownTimer = null;
}
}
// Skript-Start-Logik
log('Skript zur Steuerung der Pumpe gestartet.');
// Überwache alle runningTime-Datenpunkte
on({id: countdownDPs, change: 'any'}, (obj) => {
log(`Änderung bei ${obj.id}: ${obj.state.val}`);
updateTotalCountdown();
});
// Bei Skriptstart die Werte einmalig prüfen
updateTotalCountdown();
Aber das ist alles an den Symptomen basteln und keine stabile langfristige Lösung. 😞
Das wird wohl meine Lösung jetzt werden. Bin komplett in der HMIP Welt
Homematic IP Smart Home Schaltaktor für Hutschienenmontage – 4-fach, HmIP-DRSI4
https://de.elv.com/p/homematic-ip-smart-home-funk-schaltaktor-fuer-hutschienenmontage-hmip-drsi4-4-fach-P154431/?utm_source=google&utm_medium=cpc&utm_campaign=perfmax_shopping_de&refid=Gads&Gads_PerfMax_Shopping&gad_source=1&gad_campaignid=20522237738&gbraid=0AAAAAD-GiXxGOK8K4JKi5HN_0vliaUag1&gclid=Cj0KCQjw8KrFBhDUARIsAMvIApYha3BSs0uIKRMN0SABJATdqJIPRVnR5oCYo-mIMMYWFJSa25PK-PwaAmzvEALw_wcB
HmIPW-DRS4 wäre auch gut, dann brauch ich nur ein Kabel legen. Mal sehen.
Ein Schütz für die Pumpe. Weiß noch nicht welchen, aber wird sich bestimmt was finden. Vielleicht braucht es auch keinen, aber naja das Modul ist zu teuer.
Meine Ventilsteuerung bleibt.
https://de.elv.com/p/elv-smart-home-bausatz-garten-ventil-interface-elv-sh-gvi-powered-by-homematic-ip-P157246
Dann haben ich die Möglichkeit Ventil und Pumpensteuerung direkt zu Verknüpfen.
Dazu kann man im Ventil den ON_TIME setzen.
938bec9f-b504-4fa9-8697-7f3502aea0e1-image.png
Somit ist keine Zentrale weder iobroker noch die CCU zwingend nötig.
Rest Risiko wird natürlich bleiben.