Add the ability to set the number of repeats per motor when sending commands #113

This commit is contained in:
Robert Strouse 2023-07-23 15:22:20 -07:00
parent cd24ca3510
commit ff16bb6107
10 changed files with 134 additions and 71 deletions

View file

@ -1 +1 @@
2.1.1
2.1.2

View file

@ -3,11 +3,11 @@
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<link rel="stylesheet" href="main.css?v=2.1.1" type="text/css" />
<link rel="stylesheet" href="widgets.css?v=2.1.1" type="text/css" />
<link rel="stylesheet" href="icons.css?v=2.1.1" type="text/css" />
<link rel="stylesheet" href="main.css?v=2.1.2" type="text/css" />
<link rel="stylesheet" href="widgets.css?v=2.1.2" type="text/css" />
<link rel="stylesheet" href="icons.css?v=2.1.2" type="text/css" />
<link rel="icon" type="image/png" href="favicon.png" />
<script type="text/javascript" src="index.js?v=2.1.1"></script>
<script type="text/javascript" src="index.js?v=2.1.2"></script>
</head>
<body>
<div id="divContainer" class="container main" data-auth="false">
@ -375,7 +375,7 @@
</div>
</div>
<div style="margin-top:-10px;">
<div class="field-group">
<div class="field-group" style="display:inline-block">
<input id="cbFlipCommands" name="flipCommands" data-bind="flipCommands" type="checkbox" style="" />
<label for="cbFlipCommands" style="display:block;font-size:1em;margin-top:0px;margin-left:7px;display:inline-block;">Invert Commands</label>
</div>
@ -386,6 +386,24 @@
<label for="cbFlipPosition" style="display:block;font-size:1em;margin-top:0px;margin-left:7px;display:inline-block;">Invert Position (expressed in % of open)</label>
</div>
</div>
<div classs="field-group" style="display:inline-block;">
<label for="selRepeatCommnds" style="cursor:pointer;color:#00bcd4;margin-right:4px;">Repeat Commands</label>
<select id="selRepeatCommands" data-bind="repeats" data-datatype="int" style="width:127px;">
<option value="0">No Repeats</option>
<option value="1">1 Time</option>
<option value="2">2 Times</option>
<option value="3">3 Times</option>
<option value="4">4 Times</option>
<option value="5">5 Times</option>
<option value="6">6 Times</option>
<option value="7">7 Times</option>
</select>
</div>
<div style="margin-top:-10px;">
<div class="field-group">
</div>
</div>
<div class="button-container" style="text-align:center;">
<button id="btnPairShade" type="button" onclick="somfy.pairShade(parseInt(document.getElementById('spanShadeId').innerText, 10));" style="display:inline-block;width:47%;">
Pair Shade
@ -459,6 +477,20 @@
<input id="fldGroupName" name="groupName" data-bind="name" type="text" length=20 placeholder="Name">
<label for="fldGroupName">Name</label>
</div>
<div classs="field-group" style="display:inline-block;">
<label for="selRepeatCommnds" style="cursor:pointer;color:#00bcd4;margin-right:4px;">Repeat Commands</label>
<select id="selRepeatCommands" data-bind="repeats" data-datatype="int" style="width:127px;">
<option value="0">No Repeats</option>
<option value="1">1 Time</option>
<option value="2">2 Times</option>
<option value="3">3 Times</option>
<option value="4">4 Times</option>
<option value="5">5 Times</option>
<option value="6">6 Times</option>
<option value="7">7 Times</option>
</select>
</div>
<div class="button-container" style="margin-top:-10px;padding-left:7px;padding-right:7px;">
<button id="btnSaveGroup" type="button" onclick="somfy.saveGroup();">
Save Group

View file

@ -1197,7 +1197,7 @@ var security = new Security();
class General {
initialized = false;
appVersion = 'v2.1.1';
appVersion = 'v2.1.2';
reloadApp = false;
init() {
if (this.initialized) return;
@ -2073,33 +2073,37 @@ class Somfy {
setGroupsList(groups) {
let divCfg = '';
let divCtl = '';
for (let i = 0; i < groups.length; i++) {
let group = groups[i];
divCfg += `<div class="somfyGroup" data-groupid="${group.groupId}" data-remoteaddress="${group.remoteAddress}">`;
divCfg += `<div class="button-outline" onclick="somfy.openEditGroup(${group.groupId});"><i class="icss-edit"></i></div>`;
//divCfg += `<i class="Group-icon" data-position="${Group.position || 0}%"></i>`;
divCfg += `<span class="group-name">${group.name}</span>`;
divCfg += `<span class="group-address">${group.remoteAddress}</span>`;
divCfg += `<div class="button-outline" onclick="somfy.deleteGroup(${group.groupId});"><i class="icss-trash"></i></div>`;
divCfg += '</div>';
if (typeof groups !== 'undefined') {
for (let i = 0; i < groups.length; i++) {
let group = groups[i];
divCfg += `<div class="somfyGroup" data-groupid="${group.groupId}" data-remoteaddress="${group.remoteAddress}">`;
divCfg += `<div class="button-outline" onclick="somfy.openEditGroup(${group.groupId});"><i class="icss-edit"></i></div>`;
//divCfg += `<i class="Group-icon" data-position="${Group.position || 0}%"></i>`;
divCfg += `<span class="group-name">${group.name}</span>`;
divCfg += `<span class="group-address">${group.remoteAddress}</span>`;
divCfg += `<div class="button-outline" onclick="somfy.deleteGroup(${group.groupId});"><i class="icss-trash"></i></div>`;
divCfg += '</div>';
divCtl += `<div class="somfyGroupCtl" data-groupId="${group.groupId}" data-remoteaddress="${group.remoteAddress}">`;
divCtl += `<div class="group-name">`;
divCtl += `<span class="groupctl-name">${group.name}</span>`;
divCtl += `<div class="groupctl-shades">`;
for (let j = 0; j < group.linkedShades.length; j++) {
divCtl += '<span>';
if (j !== 0) divCtl += ', ';
divCtl += group.linkedShades[j].name;
divCtl += '</span>';
divCtl += `<div class="somfyGroupCtl" data-groupId="${group.groupId}" data-remoteaddress="${group.remoteAddress}">`;
divCtl += `<div class="group-name">`;
divCtl += `<span class="groupctl-name">${group.name}</span>`;
divCtl += `<div class="groupctl-shades">`;
if (typeof group.linkedShades !== 'undefined') {
for (let j = 0; j < group.linkedShades.length; j++) {
divCtl += '<span>';
if (j !== 0) divCtl += ', ';
divCtl += group.linkedShades[j].name;
divCtl += '</span>';
}
}
divCtl += '</div></div>';
divCtl += `<div class="groupctl-buttons">`;
divCtl += `<div class="button-sunflag cmd-button" data-cmd="sunflag" data-groupid="${group.groupId}" data-on="${group.flags & 0x01 ? 'true' : 'false'}" style="${!group.sunSensor ? 'display:none' : ''}"><i class="icss-sun-c"></i><i class="icss-sun-o"></i></div>`;
divCtl += `<div class="button-outline cmd-button" data-cmd="up" data-groupid="${group.groupId}"><i class="icss-somfy-up"></i></div>`;
divCtl += `<div class="button-outline cmd-button my-button" data-cmd="my" data-groupid="${group.groupId}" style="font-size:2em;padding:10px;"><span>my</span></div>`;
divCtl += `<div class="button-outline cmd-button" data-cmd="down" data-groupid="${group.groupId}"><i class="icss-somfy-down" style="margin-top:-4px;"></i></div>`;
divCtl += '</div></div>';
}
divCtl += '</div></div>';
divCtl += `<div class="groupctl-buttons">`;
divCtl += `<div class="button-sunflag cmd-button" data-cmd="sunflag" data-groupid="${group.groupId}" data-on="${group.flags & 0x01 ? 'true' : 'false'}" style="${!group.sunSensor ? 'display:none' : ''}"><i class="icss-sun-c"></i><i class="icss-sun-o"></i></div>`;
divCtl += `<div class="button-outline cmd-button" data-cmd="up" data-groupid="${group.groupId}"><i class="icss-somfy-up"></i></div>`;
divCtl += `<div class="button-outline cmd-button my-button" data-cmd="my" data-groupid="${group.groupId}" style="font-size:2em;padding:10px;"><span>my</span></div>`;
divCtl += `<div class="button-outline cmd-button" data-cmd="down" data-groupid="${group.groupId}"><i class="icss-somfy-down" style="margin-top:-4px;"></i></div>`;
divCtl += '</div></div>';
}
document.getElementById('divGroupList').innerHTML = divCfg;
let groupControls = document.getElementById('divGroupControls');
@ -3305,7 +3309,7 @@ class Firmware {
}
backup() {
var link = document.createElement('a');
link.href = '/backup';
link.href = baseUrl.length > 0 ? `${baseUrl}/backup` : '/backup';
link.setAttribute('download', 'backup');
document.body.appendChild(link);
link.click();
@ -3431,8 +3435,10 @@ class Firmware {
prog.style.display = '';
btnSelectFile.style.visibility = 'hidden';
formData.append('file', field.files[0]);
let xhr = new XMLHttpRequest();
xhr.open('POST', service, true);
//xhr.open('POST', service, true);
xhr.open('POST', baseUrl.length > 0 ? `${baseUrl}${service}` : service, true);
xhr.upload.onprogress = function (evt) {
let pct = evt.total ? Math.round((evt.loaded / evt.total) * 100) : 0;
prog.style.setProperty('--progress', `${pct}%`);