@paul53
Hi Paul anbei das ganze Script:
Spoiler
// *******************************************************************************************************
//
// Bewässerungsautomatik
//
//
// *******************************************************************************************************
// -----------------------------------------------------------------------------
// allgemeine Variablen
// -----------------------------------------------------------------------------
var logging = false; // Logging on/off
var debugging = false;
var telegram_benachtrichtigung = true;
var instanz = 'javascript.0'; instanz = instanz + '.'; //
var geraeteInstanz = 'hm-rpc.0.'; // Geräteinstanz
//var pfad1 = 'Automation.'; // Pfad innerhalb der Instanz - Status allgemien
var pfad0 = 'Bewaesserung.';
var pfad1 = '_Zeiten.';
var pfad2 = '_History.';
var bwZeit_Schedule1 = []; // Array für die Gieß Zeit1
var bwZeit_Schedule2 = []; // Array für die Gieß Zeit2
var Enum_ids =[]; // Array für die ID's die später in der enum.function erstellt werden
var bwTage = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag']; // Wochentage f. Autobewässerung
var time;
var runtimer = false;
var bwModus = 'manu';
var bwPumpe = geraeteInstanz + 'OEQxxxxxxxx.1';
// Bewässerungszonen
var bwZone = [];
bwZone[0] = [];
bwZone[0][0] = '1'; // Ventil Nummer fortlaufend
bwZone[0][1] = 'Hinten'; // Name der Zone
bwZone[0][2] = 'OEQxxxxxxxx.1'; // Ventil Geräte ID
bwZone[1] = [];
bwZone[1][0] = '2'; // Ventil Nummer fortlaufend
bwZone[1][1] = 'Terasse'; // Name der Zone
bwZone[1][2] = 'OEQxxxxxxxx.2'; // Ventil Geräte ID
bwZone[2] = [];
bwZone[2][0] = '3'; // Ventil Nummer fortlaufend
bwZone[2][1] = 'Vorne'; // Name der Zone
bwZone[2][2] = 'OEQxxxxxxxx.3'; // Ventil Geräte ID
/*
bwZone[3] = [];
bwZone[3][0] = '4'; // Ventil Nummer fortlaufend
bwZone[3][1] = 'HeckeBlumen'; // Name der Zone
bwZone[3][2] = 'xxxxxxxxxxxx'; // Ventil Geräte ID
*/
// -----------------------------------------------------------------------------
// Objekte
// -----------------------------------------------------------------------------
// Objekt für Zufalls-Farbwechsel an oder aus
function createObjects() {
createState(instanz + pfad0 + '_Konfig_abgeschlossen', {def: 'false', type: 'boolean', name: 'Konfiguration abgeschlossen'});
createState(instanz + pfad0 + 'bwSchalter', {def: 'false', type: 'boolean', name: 'Schalter Bereiche Bewaessern start/stop'});
createState(instanz + pfad0 + 'bwAktivZone', {def: '', type: 'string', name: 'Aktuell bewaesserte Zone'});
createState(instanz + pfad0 + 'bwTimeCounter', {def: '0', type: 'number', name: 'Bewaesserung Timer'});
createState(instanz + pfad0 + pfad2 + 'bwZeitGesamtMin', {def: '0',type:'number',name: 'Bewässerungszeit gesammt alle Bereiche'});
createState(instanz + pfad0 + pfad2 + 'bwZeitHeuteMin', {def: '0',type:'number',name: 'Bewaesserungszeit Heute alle Bereiche'});
createState(instanz + pfad0 + pfad2 + 'bwZeitZuletztMin', {def: '0',type:'number',name: 'Bewaesserungszeit Zuletzt alle Bereiche'});
bwTage.forEach(function(wtg){
createState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik1', {def: 'false',type: 'boolean',name: 'Bewaesserungsautomatik 1 ein/aus '+wtg});
createState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik2', {def: 'false',type: 'boolean',name: 'Bewaesserungsautomatik 2 ein/aus '+wtg});
createState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime1', {def: '09:00',type: 'string',name: 'Uhrzeit 1 für Auto Bewaessern '+wtg});
createState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime2', {def: '20:00',type: 'string',name: 'Uhrzeit 1 für Auto Bewaessern'+wtg});
if(!getState(instanz + pfad0 + '_Konfig_abgeschlossen').val) {
Enum_ids.push(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik1');
Enum_ids.push(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik2');
Enum_ids.push(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime1');
Enum_ids.push(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime2');
}
});
bwZone.forEach(function(bwz) {
// -----------------------------------------------------------------------------
// Erstellen Datenpunkte
// -----------------------------------------------------------------------------
createState(instanz + pfad0 + bwz[1] + '.bwAktiv', {def: 'false', type: 'boolean', name: 'Bewaesserung für Zone:'+bwz[1]+' Aktiv/Inaktiv'});
createState(instanz + pfad0 + bwz[1] + '.bwVorgabeZeit', {def: '2', type: 'number', name: 'Bewaesserungsvorgabezeit für Zone:'+bwz[1]});
createState(instanz + pfad0 + bwz[1] + '.bwZeitHeuteSek', {def: '0',type:'number',name: 'Bewaesserungszeit Heute in Sek'});
createState(instanz + pfad0 + bwz[1] + '.bwZeitZuletztSek', {def: '0',type:'number',name: 'Bewaesserungszeit Zuletzt in Sek'});
createState(instanz + pfad0 + bwz[1] + '.bwVentilSchalten', {def: 'false', type: 'boolean', name: 'Ein / Aus Ventil für Zone:'+bwz[1]});
if(!getState(instanz + pfad0 + '_Konfig_abgeschlossen').val) {
Enum_ids.push(instanz + pfad0 + bwz[1] + '.bwVentilSchalten');
Enum_ids.push(instanz + pfad0 + bwz[1] + '.bwAktiv');
}
});
}
// Objekte erstellen
createObjects();
// #############################################################################
// # #
// # fahren der Jalousien #
// # #
// #############################################################################
function bwJalousien(VentilNr) {
// Jalosie in küche und wohnzimmer herunter während gießen,
// beim hochfahren welches level?
if(VentilNr === 2){
// log('____________________________________________________________________________________________')
setStateDelayed('hm-rpc.0.NEQxxxxx.1.LEVEL', 15, getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwVorgabeZeit').val * 60000);
setStateDelayed('hm-rpc.0.NEQxxxx.1.LEVEL', 15, (getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwVorgabeZeit').val * 60000)+1000);
}
if(VentilNr === 3){
// var jalLevelWohnz = getState('hm-rpc.0.NEQxxxx.1.LEVEL').val;
// var jalLevelKueche = getState('hm-rpc.0.NEQxxxx.1.LEVEL').val;
setStateDelayed('hm-rpc.0.NEQxxxx.1.LEVEL', getState('javascript.0.Jalousien.Jalousie_Wunschlevel_Wohnen').val, (getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwVorgabeZeit').val * 60000)+1000);
setStateDelayed('hm-rpc.0.NEQxxxx.1.LEVEL', getState('javascript.0.Jalousien.Jalousie_Wunschlevel_Kueche').val, (getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwVorgabeZeit').val * 60000)+3000);
// jalLevelKueche = 100;
// jalLevelWohnz = 100
}
}
// #############################################################################
// # #
// # Durchschalten der verfügbaren Bewässerungszonen #
// # #
// #############################################################################
function bwBereiche(VentilNr) {
bwJalousien(VentilNr);
// if(getState(instanz + pfad0 + "bwSchalter").val !== false){
if(logging === true && VentilNr < bwZone.length) log('Aktuell bewässerter Bereich:' + VentilNr);
if(debugging === true ) log('VentilNr-----------------------------------------------: '+VentilNr);
setState(instanz + pfad0 + 'bwAktivZone', VentilNr.toString());
if(VentilNr <= bwZone.length) setState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek', 0);
if(VentilNr <= bwZone.length){
// Nachschauen ob die Variable verfügbar ist.
// log(getState(instanz + pfad0 + bwz[VentilNr-1] + '.bwVorgabeZeit').val * 60000)
if(VentilNr == '1'){
// BewaessernStart();
if(debugging === true ) log('Alle Ventile ausgeschalten');
setState(instanz + pfad0 + pfad2 + 'bwZeitZuletztMin', 0);
bwZone.forEach(function(bwz) {
if(debugging === true ) log('Ventil '+bwz[2]+' ausgeschalten');
// Ventil ausschalten
if(getState(geraeteInstanz + bwz[2]+ ".STATE").val) setState(geraeteInstanz + bwz[2]+ ".STATE", false);
});
}
if(VentilNr >1){
if(debugging === true ) log('Ventil Nr.:'+bwZone[VentilNr-2][2]+' ausgeschalten');
if(getState(geraeteInstanz + bwZone[VentilNr-2][2]+ ".STATE").val === true) setState(geraeteInstanz + bwZone[VentilNr-2][2]+ ".STATE", false);
}
if(debugging === true ) log('Pumpe einschalten');
// Pumpe Schalten
if(getState(bwPumpe + ".STATE").val === false) setState(bwPumpe + ".STATE", true); //Pumpe
// Ventil ausschalten, nächstes nach 5 Sekunden einschalten
if(getState(geraeteInstanz + bwZone[VentilNr-1][2]+ ".STATE").val === false) setStateDelayed(geraeteInstanz + bwZone[VentilNr-1][2]+ ".STATE", true, 5000);
if(debugging === true ) log('Ventil Nr.:'+bwZone[VentilNr-1][2]+' eingeschalten');
setState(instanz + pfad0 + 'bwTimeCounter', getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwVorgabeZeit').val * 60);// noch ändern auf 60
bwZeitCountdown(VentilNr);
}
else{
BewaessernEnde(VentilNr);
}
// } else {
// if(logging) log('Zonenbewaesserung ausgeschalten');
// }
}
// #############################################################################
// # #
// # Endefunktion nach dem Bewässern #
// # #
// #############################################################################
function BewaessernEnde(VentilNr){
if(time) clearTimeout(time);
if(VentilNr < bwZone.length) bwWerteSpeichern(VentilNr);
if(getState(geraeteInstanz + bwZone[VentilNr-2][2]+ ".STATE").val === true) setState(geraeteInstanz + bwZone[VentilNr-2][2]+ ".STATE", false);
if(debugging === true ) log('Ventil Nr.:'+bwZone[VentilNr-2][2]+' ausgeschalten');
if(debugging === true ) log('Übergebene Ventilnummer: '+VentilNr);
if(getState(instanz + pfad0 + "bwSchalter").val !== false) setState(instanz + pfad0 + "bwSchalter", false);
setState(instanz + pfad0 + 'bwAktivZone','');
if(debugging === true ) log('Pumpe ausgeschalten');
if(getState(bwPumpe + ".STATE").val === true) setState(bwPumpe + ".STATE", false); //Pumpe
if(telegram_benachtrichtigung === true) telegram_versenden('BewaessernEnde');
}
// #############################################################################
// # #
// # Counter der die Bewässerungszeit herunter zählt #
// # #
// #############################################################################
function bwZeitCountdown(VentilNr) {
time = setTimeout(function () {
var bwtimer = getState(instanz + pfad0 + 'bwTimeCounter').val; // || (getState(instanz + pfad0 + bwz[VentilNr-1] + '.bwVorgabeZeit').val * 60000);
if(VentilNr > bwZone.length) bwtimer = 0;
if (bwtimer >= 1) {
setState(instanz + pfad0 + 'bwTimeCounter', bwtimer - 1);
bwZeitCountdown(VentilNr);
setState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitHeuteSek', parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitHeuteSek').val) + 1);
setState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek', parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek').val) + 1);
if(debugging) log(bwtimer);
}
else{
bwWerteSpeichern(VentilNr);
bwBereiche(parseInt(VentilNr) + 1);
}
}, 1000);
}
// #############################################################################
// # #
// # Speichert die ZonenWerte in die Gesamtwerte #
// # #
// #############################################################################
function bwWerteSpeichern(VentilNr){
setState(instanz + pfad0 + pfad2 + 'bwZeitZuletztMin', parseInt(getState(instanz + pfad0 + pfad2 + 'bwZeitZuletztMin').val) + (Math.floor(parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek').val)))/60);
setState(instanz + pfad0 + pfad2 + 'bwZeitHeuteMin', parseInt(getState(instanz + pfad0 + pfad2 + 'bwZeitHeuteMin').val) + (Math.floor(parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek').val)))/60);
setState(instanz + pfad0 + pfad2 + 'bwZeitGesamtMin', parseInt(getState(instanz + pfad0 + pfad2 + 'bwZeitGesamtMin').val) + (Math.floor(parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek').val)))/60);
setState(instanz + pfad0 + 'bwTimeCounter', 0);
}
// #############################################################################
// # #
// # Timer der die Bewässerungszeit herauf zählt #
// # #
// #############################################################################
function bwStopUhr(VentilNr){
time = setTimeout(function () {
bwtimer = 0;
setState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitHeuteSek', parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitHeuteSek').val) + 1);
setState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek', parseInt(getState(instanz + pfad0 + bwZone[VentilNr-1][1] + '.bwZeitZuletztSek').val) + 1);
/*
setState(instanz + pfad0 + 'bwZeitHeuteMin',Math.floor(getState(instanz + pfad0 + 'BetriebszeitHeuteSek').val/60));
setState(instanz + pfad0 + 'bwZeitZuletztMin',Math.floor(getState(instanz + pfad0 + 'BetriebszeitZuletztSek').val/60));
setState(instanz + pfad0 + 'bwZeitGesamtMin',Math.floor(getState(instanz + pfad0 + 'BetriebszeitHeuteSek').val/60));
*/
if(logging) log(bwtimer);
}, 1000);
}
// #############################################################################
// # #
// # Timer der die Bewässerungszeit herauf zählt #
// # #
// #############################################################################
function bwAutoBewaesserungszeiten() {
bwTage.forEach(function(wtg){
if(getState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime1').val){
var bwZeit1 = getState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime1').val.split(':');
if(logging) log(getState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik1').val);
if(getState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik1').val === true){
if(bwZeit_Schedule1[wtg]) clearSchedule(bwZeit_Schedule1[wtg]);
bwZeit_Schedule1[wtg] = schedule('10 '+bwZeit1[1].trim() + ' ' + bwZeit1[0].trim() + ' * * '+ bwTage.indexOf(wtg), function (){
setState(instanz + pfad0 + "bwSchalter", true);
});
if(logging) log('Automatisches Gießen 1 am '+wtg+' um '+bwZeit1[0]+': '+bwZeit1[1]+' Uhr aktiviert');
}
else{
if(bwZeit_Schedule1[wtg]) clearSchedule(bwZeit_Schedule1[wtg]);
if(logging) log('Automatisches Gießen 1 am '+wtg+' wurde deaktiviert');
}
}
if(getState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime2').val){
var bwZeit2 = getState(instanz + pfad0 + pfad1 + wtg +'_bwScheduleTime2').val.split(':');
if(debugging === true ) log(getState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik2').val);
if(getState(instanz + pfad0 + pfad1 + wtg +'_bwAutomatik2').val === true){
if(bwZeit_Schedule2[wtg]) clearSchedule(bwZeit_Schedule2[wtg]);
bwZeit_Schedule2[wtg] = schedule('10 '+bwZeit2[1].trim() + ' ' + bwZeit2[0].trim() + ' * * '+ bwTage.indexOf(wtg), function (){
setState(instanz + pfad0 + "bwSchalter", true);
});
if(logging) log('Automatisches Gießen 2 am '+wtg+' um '+bwZeit2[0]+': '+bwZeit2[1]+' Uhr aktiviert');
}
else{
if(bwZeit_Schedule2[wtg]) clearSchedule(bwZeit_Schedule2[wtg]);
if(logging) log('Automatisches Gießen 2 am '+wtg+' wurde deaktiviert');
}
}
});
}
// #############################################################################
// # #
// # sonstiges #
// # #
// #############################################################################
if(!getState(instanz + pfad0 + '_Konfig_abgeschlossen').val) {
var Enum_obj = {};
Enum_obj.type = 'enum';
Enum_obj.common = {};
Enum_obj.common.name = 'Bewaesserung';
Enum_obj.common.members = Enum_ids;
setObject('enum.functions.Bewaesserung', Enum_obj);
setState(instanz + pfad0 + '_Konfig_abgeschlossen', true);
}
// #############################################################################
// # #
// # Zurücksetzen dert Tageswerte um 0:00 Uhr täglich #
// # #
// #############################################################################
schedule("0 0 * * *", function (){
bwZone.forEach(function(bwz) {
setState(instanz + pfad0 + bwz[1] + '.bwZeitHeuteSek', 0);
});
setState(instanz + pfad0 + pfad2 + 'bwZeitHeuteMin', 0);
});
// Beobachten des Schalters für die automatik Bewässerung
on({id: instanz + pfad0 + 'bwSchalter', change: "ne"}, function (dp) {
if(dp.state.val === true){
bwBereiche('1');
} else {
bwBereiche(bwZone.length +1);
}
});
if(!getObject('enum.functions.Bewaesserung')) {
log('objekt fehlt');
}
function ScriptStart() {
// if(getState(instanz + pfad0 + 'Konfiguration.IoRestart_komp_Bkp').val === true){
// setStateDelayed(instanz + pfad0 + 'Konfiguration.IoRestart_komp_Bkp', false, 5000);
// }
bwScheduleAktuallisieren();
log('hier wurde der schedule-befehl ausgeführt');
}
function bwScheduleAktuallisieren() {
// runScript(name);
log('Werte wurden aktualisiert');
bwAutoBewaesserungszeiten();
}
// #############################################################################
// # #
// # Beobachten aller Enum Funcions Datenpunkte #
// # #
// #############################################################################
$('state(functions=Bewaesserung)').on(function(dp) {
bwAutoBewaesserungszeiten();
var flog = dp.id.split('.');
if(logging === true ) log('Folgender Datenpunkt hat sich geändert: '+flog[3]);
bwZone.forEach(function(findstring){
if(findstring.indexOf(flog[3]) != '-1') log('Ventil Nr.:'+findstring[0]);
});
});
ScriptStart();