mirror of https://github.com/sfeakes/AqualinkD.git
Final Update for 2.3.4
parent
6768ca5d90
commit
9d580cb3d3
26
README.md
26
README.md
|
@ -56,9 +56,10 @@ https://github.com/sfeakes/AqualinkD/wiki/Jandy-Aqualink-RS485-protocol
|
|||
</td></tr>
|
||||
</table>
|
||||
|
||||
### Simulator
|
||||
Designed to mimic AqualinkRS6 All Button keypad and (like the keypad) is used to fully configure the master control panel<br>
|
||||
<img src="extras/simulator.png?raw=true" width="550">
|
||||
### Simulators
|
||||
Designed to mimic AqualinkRS devices, used to fully configure the master control panel<br>
|
||||
<img src="extras/onetouch_sim.png?raw=true">
|
||||
<img src="extras/allbutton_sim.png?raw=true">
|
||||
|
||||
### In Apple Home app.
|
||||
<img src="extras/HomeKit2.png?raw=true" width="800"></img>
|
||||
|
@ -71,13 +72,26 @@ Designed to mimic AqualinkRS6 All Button keypad and (like the keypad) is used to
|
|||
## All Web interfaces.
|
||||
* http://aqualink.ip/ <- (Standard WEB UI
|
||||
* http://aqualink.ip/simple.html <- (Simple opion if you don't like the above)
|
||||
* http://aqualink.ip/simulator.html <- (RS8 All Button Control Panel simulator)
|
||||
* http://aqualink.ip/debug.html <- (Turn on/off debug/serial debug & download logs)
|
||||
* http://aqualink.ip/simulator.html <- (Displays all simulators in one page with tabs)
|
||||
* http://aqualink.ip/aqmanager.html <- (Manage AqualinkD configuration & runtime)
|
||||
* http://aqualink.ip/allbutton_sim.html <- (All Button Simulator)
|
||||
* http://aqualink.ip/onetouch_sim.html <- (One Touch Simulator)
|
||||
* http://aqualink.ip/aquapda_sim.html <- (PDA simulator)
|
||||
#<a name="release"></a>
|
||||
# ToDo (future release)
|
||||
* Allow selecting of pre-defined VSP programs (Aqualink Touch & OneTouch protocols.)
|
||||
* Add set time to OneTouch protocol.
|
||||
* Publish AqualinkD Management console. (Configure, Restart, run serial_logger) within AqualinkD.
|
||||
* Update AqualinkD Management console to manage configuration
|
||||
* Create iAqualink Touch Simulator
|
||||
|
||||
# Update in Release 2.3.4
|
||||
* Changes for Docker
|
||||
* Updated simulator code base and added new simulators for AllButton, OneTouch & PDA.
|
||||
* <aqualinkd.ip>/allbutton_sim.html
|
||||
* <aqualinkd.ip>/onetouch_sim.html
|
||||
* <aqualinkd.ip>/aquapda_sim.html
|
||||
* On PDA only panel AqualinkD has to share the same ID with the PDA simulator. There for AqualinkD will not respond to commands while simulator is active.
|
||||
* Now you can completley program the control panel with the simulators removing the need to have Jandy device.
|
||||
|
||||
# Update in Release 2.3.3
|
||||
* Introduced Aqualink Manager UI http://aqualink.ip/aqmanager.html
|
||||
|
|
|
@ -1879,8 +1879,12 @@ void main_loop()
|
|||
_aqualink_data.updated = process_packet(packet_buffer, packet_length);
|
||||
|
||||
#ifdef AQ_PDA
|
||||
if (isPDA_PANEL)
|
||||
caculate_ack_packet(rs_fd, packet_buffer, AQUAPDA);
|
||||
if (isPDA_PANEL) {
|
||||
// If we are in simulator mode, the sim has already send the ack
|
||||
if (_aqualink_data.simulator_active == SIM_NONE) {
|
||||
caculate_ack_packet(rs_fd, packet_buffer, AQUAPDA);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
caculate_ack_packet(rs_fd, packet_buffer, ALLBUTTON);
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
@ -98,11 +98,12 @@ device_id=0x60
|
|||
#extended_device_id_programming = no
|
||||
|
||||
# Not documented
|
||||
serial_readahead_b4_write = yes
|
||||
mqtt_timed_update = no
|
||||
thread_netservices = yes
|
||||
rs_poll_speed = -1
|
||||
#serial_readahead_b4_write = yes
|
||||
#mqtt_timed_update = no
|
||||
#thread_netservices = yes
|
||||
#rs_poll_speed = -1
|
||||
#rs_poll_speed = 1
|
||||
rs485_frame_delay = 4
|
||||
|
||||
# Your RS panel size. ie 4, 6, 8, 12 or 16 relates to RS4, RS6, RS8, RS12 or RS16.
|
||||
# VERY important that you select 12 or 16, if you have either of those size panels.
|
||||
|
|
|
@ -72,6 +72,13 @@ bool processSimulatorPacket(unsigned char *packet, int packet_length, struct aqu
|
|||
|
||||
bool start_simulator(struct aqualinkdata *aqdata, emulation_type type) {
|
||||
|
||||
// If we are a PDA panel and PDA sim, we are connected, so just set that
|
||||
// since PDA only panel can only handle one remote ID.
|
||||
if (isPDA_PANEL && type == AQUAPDA) {
|
||||
aqdata->simulator_active = type;
|
||||
aqdata->simulator_id = _aqconfig_.device_id;
|
||||
}
|
||||
|
||||
// if type is same AND id is valid, sim is already started, their is nothing to do.
|
||||
if (aqdata->simulator_active == type) {
|
||||
if (aqdata->simulator_id >= 0x40 && aqdata->simulator_id <= 0x43) {
|
||||
|
|
|
@ -24,10 +24,15 @@
|
|||
flex-direction: column;
|
||||
}
|
||||
|
||||
.inner {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
align-items: center;
|
||||
/*position: absolute;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
|
@ -131,6 +136,14 @@
|
|||
/*font-family: monospace;*/
|
||||
font-size: x-small;
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
/*
|
||||
filter: alpha(opacity=0);
|
||||
opacity: 0.0;
|
||||
*/
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type='text/javascript'>
|
||||
|
@ -157,6 +170,8 @@
|
|||
var _hlightcharstart = -1;
|
||||
var _hlightcharend = -1;
|
||||
|
||||
var _initial_click=false;
|
||||
|
||||
// See if we are in an iframe and capture focus
|
||||
function capture_iframe_focus() {
|
||||
var targetNode = parent.document.getElementById('aquapda_iframe');
|
||||
|
@ -417,12 +432,18 @@
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
function update_status(data) {
|
||||
// Some form of error if PDA only panel.
|
||||
|
||||
if (data.panel_type.startsWith("PDA")) {
|
||||
//document.getElementById("status").innerHTML = ' !!! PDA only panels are not Supported !!! '
|
||||
//document.getElementById("status").classList.add("error");
|
||||
update_status_message("PDA only panels are not Supported", true);
|
||||
// If we are a PDA only panel, we are already connected, send the back command to get some PDA clar
|
||||
// message to reset the screen.
|
||||
if (_initial_click == false) {
|
||||
document.getElementById("pdaWarning").style.display = 'block';
|
||||
document.getElementById("Back").click();
|
||||
_initial_click = true;
|
||||
}
|
||||
}
|
||||
|
||||
const versionlabel = document.getElementById("version");
|
||||
|
@ -541,7 +562,7 @@
|
|||
<div class="wrapper">
|
||||
|
||||
<div class="inner">
|
||||
|
||||
<div>
|
||||
<table border='0' id="deviceList">
|
||||
<tr>
|
||||
<th id="status" align="center" colspan="5"> </th>
|
||||
|
@ -652,9 +673,11 @@
|
|||
<td colspan="5" id="version" class="version"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<!--<div class="inner">END</div>-->
|
||||
|
||||
<div id="pdaWarning" class='hide'>
|
||||
Warning<br>AqualinkD will not respond to commands while this window is open,<br>Please close when finished.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -141,6 +141,27 @@
|
|||
/*flex-direction: column;*/
|
||||
}
|
||||
|
||||
.simulator_pane {
|
||||
background-color: var(--options_pane_background);
|
||||
border: 2px solid var(--options_pane_bordercolor);
|
||||
border-radius: 20px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
/* Actual size of sim 305 by 385 */
|
||||
width: 325px;
|
||||
height: 405px;
|
||||
padding: 10px;
|
||||
/*overflow-y: scroll; didn't work*/
|
||||
/*height: 100%;*/
|
||||
/*flex-basis: content;*/
|
||||
/*flex-direction: column;*/
|
||||
}
|
||||
|
||||
.simiframe {
|
||||
width: 305px;
|
||||
height: 385px;
|
||||
}
|
||||
|
||||
.options {
|
||||
top: 10px;
|
||||
/*left: 10px;*/
|
||||
|
@ -609,6 +630,8 @@
|
|||
document.getElementById('vspswitch_options').classList.remove("hide");
|
||||
document.getElementById('timer_options').classList.remove("hide");
|
||||
document.getElementById('scheduler_options').classList.remove("hide");
|
||||
//document.getElementById('simulator_options').classList.remove("hide");
|
||||
document.getElementById('simulator_iframe').classList.remove("hide");
|
||||
setColors();
|
||||
load_background();
|
||||
showTileOptions(false);
|
||||
|
@ -1233,6 +1256,7 @@
|
|||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'switch_program') {
|
||||
active_option = document.getElementById('pswitch_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1240,6 +1264,7 @@
|
|||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'setpoint_swg') {
|
||||
active_option = document.getElementById('swg_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1247,6 +1272,7 @@
|
|||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'setpoint_freeze') {
|
||||
active_option = document.getElementById('swg_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1254,6 +1280,7 @@
|
|||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'switch_vsp') {
|
||||
active_option = document.getElementById('vspswitch_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1261,6 +1288,7 @@
|
|||
document.getElementById('swg_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'switch_timer') {
|
||||
active_option = document.getElementById('timer_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1268,6 +1296,7 @@
|
|||
document.getElementById('swg_options').style.display = 'none';
|
||||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'scheduler') {
|
||||
active_option = document.getElementById('scheduler_options');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
|
@ -1275,6 +1304,15 @@
|
|||
document.getElementById('swg_options').style.display = 'none';
|
||||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
} else if (id != null && document.getElementById(id).getAttribute('type') == 'simulator') {
|
||||
active_option = document.getElementById('simulator_iframe');
|
||||
document.getElementById('thermostat_options').style.display = 'none';
|
||||
document.getElementById('pswitch_options').style.display = 'none';
|
||||
document.getElementById('swg_options').style.display = 'none';
|
||||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
}
|
||||
|
||||
active_option.style.display = 'flex';
|
||||
|
@ -1310,6 +1348,7 @@
|
|||
document.getElementById('vspswitch_options').style.display = 'none';
|
||||
document.getElementById('timer_options').style.display = 'none';
|
||||
document.getElementById('scheduler_options').style.display = 'none';
|
||||
document.getElementById('simulator_iframe').style.display = 'none';
|
||||
document.getElementById('wrapper').classList.remove("opaque");
|
||||
return;
|
||||
}
|
||||
|
@ -1363,6 +1402,8 @@
|
|||
} else if (type == 'scheduler') {
|
||||
title = document.getElementById("scheduler_options_title");
|
||||
close_button = document.getElementById("scheduler_options_close");
|
||||
} else if (type == 'simulator') {
|
||||
close_button = document.getElementById("simulator_iframe_close");
|
||||
} else {
|
||||
slider = document.getElementById("option_slider_range");
|
||||
slider_output = document.getElementById("option_slider_text_value");
|
||||
|
@ -1415,6 +1456,8 @@
|
|||
|
||||
if (type == 'scheduler') {
|
||||
title.innerHTML = "Scheduler";
|
||||
} else if (type == 'simulator') {
|
||||
// title.innerHTML = "Simulator";
|
||||
} else {
|
||||
title.innerHTML = document.getElementById(id + '_name').innerHTML;
|
||||
}
|
||||
|
@ -1480,6 +1523,8 @@
|
|||
cs_clearSchedules();
|
||||
//cs_loadJSON("/api/schedules", cs_schedules,'jsonp');
|
||||
get_schedules();
|
||||
} else if (type == 'simulator') {
|
||||
startSimulator();
|
||||
} else {
|
||||
slider.value = sp_value;
|
||||
oswitch = document.getElementById("option_switch");
|
||||
|
@ -1597,6 +1642,7 @@
|
|||
if ( ! cs_createJSON() ) {
|
||||
return // This stops pane from closing.
|
||||
}
|
||||
} else if (type == 'simulator') {
|
||||
} else {
|
||||
var value = slider.value;
|
||||
if (state == (tile.getAttribute('status') == 'off'))
|
||||
|
@ -1673,6 +1719,16 @@
|
|||
}
|
||||
}
|
||||
|
||||
function showSimulator(caller){
|
||||
caller.setAttribute('type', 'simulator');
|
||||
showTileOptions(true, caller.id);
|
||||
}
|
||||
|
||||
function startSimulator() {
|
||||
console.log("Starting ifram sim init");
|
||||
document.getElementById('onetouch_iframe').display = 'block';
|
||||
}
|
||||
|
||||
// NSF CHANGE TO USING WS FOR THIS REQUEST
|
||||
/*
|
||||
function cs_loadJSON(path, success, error) {
|
||||
|
@ -2418,6 +2474,7 @@
|
|||
<!-- <div id='body_wrap' class='body_wrap' onmousedown='showTileOptions(false);'> -->
|
||||
<div id='wrapper' class="wrapper">
|
||||
<div id="header" class="head" onclick="showBackground();">
|
||||
<!--<div id="header" class="head" onclick="event.stopPropagation();showSimulator(this);">-->
|
||||
<table border='0' width='100%' cellpadding='0' cellspacing='0'>
|
||||
<tr>
|
||||
<td width="70px" align='left' id='td_name'><span class='title' id='name'
|
||||
|
@ -2650,6 +2707,14 @@
|
|||
</div>
|
||||
|
||||
|
||||
<div id="simulator_iframe" class='options hide'>
|
||||
<div id="onetouch_iframe" class="simulator_pane" onclick='event.stopPropagation();''>
|
||||
<iframe id="simulatoriframe" src="/onetouch_sim.html" class="simiframe"></iframe>
|
||||
<input type="button" class="options_button" id="simulator_iframe_close" value="Close">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id='scheduler_options' class='options hide'>
|
||||
<div id='scheduler_options_pane' class='scheduler_pane' onclick='event.stopPropagation();'>
|
||||
<table id="cronschedules" border="0">
|
||||
|
@ -2684,6 +2749,8 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
|
|
@ -119,6 +119,8 @@
|
|||
.lcd_highlight {
|
||||
font-family: monospace;
|
||||
background-color: #8e1e1e !important;
|
||||
/*background-color: #8b7d7d !important;*/
|
||||
/*background-color: #868383 !important;*/
|
||||
color: white !important;
|
||||
white-space: pre;
|
||||
}
|
||||
|
@ -133,7 +135,7 @@
|
|||
</style>
|
||||
|
||||
<script type='text/javascript'>
|
||||
|
||||
console.log("SIM LOAD");
|
||||
var _socket_di;
|
||||
var _keep_socket_alive=true;
|
||||
|
||||
|
@ -158,7 +160,13 @@
|
|||
|
||||
// See if we are in an iframe and capture focus
|
||||
function capture_iframe_focus() {
|
||||
|
||||
var targetNode = parent.document.getElementById('onetouch_iframe');
|
||||
/*
|
||||
if (targetNode == null)
|
||||
targetNode = parent.document.getElementById('simulator_iframe');*/
|
||||
|
||||
console.log("OneTouch checking if iframe");
|
||||
if (targetNode != null) {
|
||||
var observer = new MutationObserver(function(){
|
||||
if(targetNode.style.display != 'none'){
|
||||
|
@ -170,9 +178,10 @@
|
|||
}
|
||||
});
|
||||
observer.observe(targetNode, { attributes: true, childList: true });
|
||||
|
||||
console.log("OneTouch in iframe");
|
||||
return true;
|
||||
}
|
||||
console.log("OneTouch no iframe");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -529,6 +538,17 @@
|
|||
}
|
||||
}
|
||||
|
||||
// Print all events
|
||||
/*
|
||||
Object.keys(window).forEach(key => {
|
||||
if (/^on/.test(key)) {
|
||||
window.addEventListener(key.slice(2), event => {
|
||||
console.log(event);
|
||||
|
||||
});
|
||||
}
|
||||
});
|
||||
*/
|
||||
</script>
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue