/** * CreationDate: 20.12.2018 * Descriptin: Rolladensteuerung im VIS Modul **/ //enable Logging logMode = true; //EG const rolladen_Kueche = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Kueche" /*IOT-Shelly2-Rolladen-Kueche*/; const rolladen_Wz_Holzterrasse = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Holzterrasse" /*IOT-Shelly2-Rolladen-WZ-Holzterrasse*/; const rolladen_Wz_Terrasse_Links = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Links" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Links*/; const rolladen_Wz_Terrasse_Mitte = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte*/; const rolladen_Wz_Terrasse_Rechts = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts*/; const rolladen_HWR = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-HWR"; const rolladen_Buero = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Buero"; const rolladen_Gaestebad = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestebad"; //OG const rolladen_Fitnessraum = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Fitnessraum"; const rolladen_Gaestezimmer = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestezimmer"; const rolladen_Ankleide = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Ankleide"; const rolladen_Schlafzimmer = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Schlafzimmer"; const rolladen_Bad = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Bad"; const rolladen_Gaube = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Gaube"; //Group buttons const grp_All = 'javascript.0.Rolladensteuerung.VIS.Group_All'/*Group All*/; const grp_EG = 'javascript.0.Rolladensteuerung.VIS.Group_EG'/*Group EG*/; const grp_OG = 'javascript.0.Rolladensteuerung.VIS.Group_OG'/*Group OG*/; const grp_Wohnzimmer = 'javascript.0.Rolladensteuerung.VIS.Group_Wohnzimmer'/*Group Wohnzimmer*/; const grp_Doors = 'javascript.0.Rolladensteuerung.VIS.Group_Doors'/*Group Doors*/; const grp_NoDoors = 'javascript.0.Rolladensteuerung.VIS.Group_No_Doors'/*Group No Doors*/; const grp_Sun_Protection_Front = 'grp_Sun_Protection_Front'/*No State/Button */; const grp_NoSelection = 'javascript.0.Rolladensteuerung.VIS.Group_No_Selection'; const groupButtons = [grp_All, grp_EG, grp_OG, grp_Wohnzimmer, grp_Doors, grp_NoDoors, grp_NoSelection]; const activeShutterState = 'javascript.0.Rolladensteuerung.VIS.Active_Shutters'; const shutterMapping = { "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Kueche": 'shelly.0.SHSW-21#134AD8#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Holzterrasse": 'shelly.0.SHSW-25#68C63AFA1E5C#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Links": 'shelly.0.SHSW-21#559F06#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte": 'shelly.0.SHSW-21#134A12#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts": 'shelly.0.SHSW-25#483FDA762941#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-HWR": 'shelly.0.SHSW-21#5596AC#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Buero": 'shelly.0.SHSW-21#135908#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestebad": 'shelly.0.SHSW-21#134BD8#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Fitnessraum": 'shelly.0.SHSW-21#559883#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestezimmer": 'shelly.0.SHSW-21#559ED1#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Ankleide": 'shelly.0.SHSW-25#691CB5#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Schlafzimmer": 'shelly.0.SHSW-25#5DBBA3#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Bad": 'shelly.0.SHSW-25#BA7E7D#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Gaube": 'shelly.0.SHSW-25#744E55#1' }; const fnct_allUp = "javascript.0.Rolladensteuerung.VIS.Function_All_Up"; const fnct_allDown = "javascript.0.Rolladensteuerung.VIS.Function_All_Down"; const fnct_50Percent = "javascript.0.Rolladensteuerung.VIS.Function_50Percent"; const fnct_SunProtection = "javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection"; const fnct_SunProtectionFront = "javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection_Front"; const functionButtons = [fnct_allUp, fnct_allDown, fnct_50Percent, fnct_SunProtection, fnct_SunProtectionFront]; //Groups const groups = { [grp_All]: [ rolladen_Kueche, rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_EG]: [ rolladen_Kueche, rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad], [grp_OG]: [ rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_Wohnzimmer]: [ rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts], [grp_Doors]: [ rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Mitte], [grp_NoDoors]: [ rolladen_Kueche, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_Sun_Protection_Front]: [ rolladen_Kueche, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Gaube], [grp_NoSelection]: [ "blank", ], }; let activeGroupButton; let activeFunctionButton; let activeShutters = {}; /**######################### ### VIS-Steuerung ### ############################*/ //deselektiert alle group button bis auf den einen aktiven function deselectAllGroupButtons(activeGroupButton){ groupButtons.forEach(function (button) { if (button != activeGroupButton) { setState(button, false); log(button); } }); }; //deselektiert alle function buttons bis auf den einen aktiven function deselectAllFunctionButtons(functionButtonActive){ functionButtons.forEach(function (button) { if (button != activeFunctionButton) setState(button, false); }); }; //deselektiert alle group button bis auf den einen aktiven function deselectGroupButtons(shutter, state){ if(activeGroupButton === undefined){ }else{ //check if shutter deactivated shutter is in active group //if so deactivate group button if(state === false){ let groupShutters = groups[activeGroupButton]; if(groupShutters.includes(shutter)){ setState(activeGroupButton, false); activeGroupButton = undefined; } } //check if activated shutter is not in active group //if so deactivate group button else if(state == true){ let groupShutters = groups[activeGroupButton]; if(!groupShutters.includes(shutter)){ setState(activeGroupButton, false); activeGroupButton = undefined; } } } }; //set active shutter buttons according to group function setShutterButtons(activeShutters){ let allShutters = groups[grp_All]; if(activeShutters === undefined){ allShutters.forEach(function (shutter) { setState(shutter, false); }); }else{ allShutters.forEach(function (shutter) { if (activeShutters.includes(shutter) === true) setState(shutter, true); else setState(shutter, false); }); } }; function deselectAllShuttersAndGroups(){ deselectAllGroupButtons(undefined); setShutterButtons(undefined); activeGroupButton = undefined; activeShutters = {}; } /**######################### ### Listener ### ############################*/ //Group Button Listener on(groupButtons, function (obj) { var state = obj.newState.val; if(state === true){ activeGroupButton = obj.id; log("activeButton " + obj.id); deselectAllGroupButtons(obj.id); setShutterButtons(groups[obj.id]); deselectAllFunctionButtons(undefined); }else if (state === false){ //setShutterButtons(undefined); deselectAllFunctionButtons(undefined); } }); //Shutter Button Listener on(groups[grp_All], function (obj) { var state = obj.newState.val; deselectGroupButtons(obj.id, state); if(state === true){ deselectAllFunctionButtons(undefined); activeShutters[shutterMapping[obj.id]] = obj.id; }else if(state === false){ delete activeShutters[shutterMapping[obj.id]] } //setState(activeShutterState, JSON.stringify(activeShutters)); }); /**######################### ### Shelly Steuerung ### ############################*/ // hoch / runter / pause function shutterAction(action, shutterList){ let shutterToConsider = {}; if(shutterList === undefined)shutterToConsider = activeShutters; else{ //Convert Array with Names to Object with Shelly IDs shutterList.forEach(function(shutterId){ shutterToConsider[shutterMapping[shutterId]] = shutterId; }) } log(JSON.stringify((shutterToConsider))); Object.keys(shutterToConsider).forEach(function(key){ switch (action){ case "open": log(key); setState(key + '.Shutter.state', "open"); break; case "stop": setState(key + '.Shutter.state', "stop"); break; case "close": setState(key + '.Shutter.state', "close"); break; } }); } //Fährt aktive Rolladen in entsprechende Position function shuttersTo(position, shutterList){ let shutterToConsider = {}; //consider active shutter if no shutter list available //convert shutterList to JSON structure if available if(shutterList === undefined)shutterToConsider = activeShutters; else{ //Convert Array with Names to Object with Shelly IDs shutterList.forEach(function(shutterId){ shutterToConsider[shutterMapping[shutterId]] = shutterId; }) } log(JSON.stringify(activeShutters)); log(JSON.stringify(shutterList)); log(JSON.stringify(shutterToConsider)); let currentState; Object.keys(shutterToConsider).forEach(function(key){ currentState = key + '.Shutter.Position'; log(currentState); log(getState(currentState).val); if ( shutterMapping[rolladen_Gaube] == key) setState('javascript.0.Rolladensteuerung.Gaubensteuerung.ValuePercentage', +position); else if (getState(currentState).val != position)setState(currentState, +position); }); } /**######################### ### Steuerungsbuttons ### ############################*/ // hoch / runter / pause Button on("javascript.0.Rolladensteuerung.VIS.Steuerung", function (obj) { // 1/-1 --> pause // 2/-2 --> öffnen // 3/-3 --> schließen let state = obj.newState.val; switch (state){ case 1: shutterAction("stop"); break; case 2: shutterAction("open"); break; case 3: shutterAction("close"); break; } }); on("javascript.0.Rolladensteuerung.VIS.Position", function (obj) { let state = obj.newState.val; shuttersTo(state, undefined); }); /**######################### ### Functions ### ############################*/ //all up on("javascript.0.Rolladensteuerung.VIS.Function_All_Up", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; setState('javascript.0.Rolladensteuerung.alleHoch', true); } }); //all down on("javascript.0.Rolladensteuerung.VIS.Function_All_Down", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; setState('javascript.0.Rolladensteuerung.alleRunter', true); } }); //50 Prozent on("javascript.0.Rolladensteuerung.VIS.Function_50Percent", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(50, groups[grp_All]); } }); //Sonnenschutz komplett on("javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(getState('javascript.0.Rolladensteuerung.Sonnenschutz.RolladenProzent').val, groups[grp_All]); } }); //Sonnenschutz Front on("javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection_Front", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(getState('javascript.0.Rolladensteuerung.Sonnenschutz.RolladenProzent').val, groups[grp_Sun_Protection_Front]); } }); ```