EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
m21muc
Beiträge: 9
Registriert: 21.04.2017, 22:47

EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Beitrag von m21muc » 29.02.2020, 19:14

Hallo zusammen,

ich habe eine EOS Sauna-Steuerung, die über eine App und ein Web-Interface gesteuert werden kann. Als Web-Interface sieht es dann so aus:

Bild

Ist es möglich, ggfs. aus der durch das Web-Interface erzeugten Seite die jeweils angezeigten Stati und Werte für Betriebsstatus, Licht, Sauna, Verdampfer, Temperatur, Luftfeuchtigkeit, etc. auszulesen und in die CCU als variablen zu schreiben? Die Bedienung, z.B. das Ein- und Ausschalten erfolgt über Buttons auf der Seite - ich schätze mal, das wird sich über ein HM Script nicht realisieren lassen.

Hier wäre der Quellcode der Seite:

Code: Alles auswählen

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style>
            body,html {
                font-family: Helvetica, Arial, sans-serif;
                background-color: #fafafa;
            }
            @media screen and (-webkit-min-device-pixel-ratio:0) {
                #linkconfig td:last-of-type {
                    width: 30%;
                    vertical-align: middle;
                }
            }
            .logobutton {
                height: 100%;
                width: 100%;
                cursor: pointer;
                font-weight: bold;
                font-size: 16px;
                background-color: transparent;
                color: #fff;
                border: 0 solid #000;
                border-radius: 5px;
            }
            .logobutton:hover {
                height: 100%;
                width: 100%;
                cursor: pointer;
                font-weight: bold;
                font-size: 16px;
                background-color: transparent;
                color: #fff;
                border: 0 solid #000;
                text-shadow: #fff 0.1em 0.1em 0.2em;
            }
            .logotop {
                width: 10%;
                cursor: pointer;
                border-right: 1px solid #c0c0c0;
                min-width: 100px;
                background:-moz-linear-gradient(right,#79b935 0%, white 100%); /* Firefox */
                background:-webkit-linear-gradient(right,#79b935 0%, white 100%); /* Safari, Chrome */
                background:-o-linear-gradient(right,#79b935 0%, white 100%); /* Opera */
                background:-ms-linear-gradient(right,#79b935 0%, white 100%); /* IE */
                background:linear-gradient(right,#79b935 0%, white 100%); /* W3C Standard */
            }

            table.tabtable td {
                padding-left: 12px;
            }

            .setlabel {
                width: 5%;
                color: #79b935;
                cursor: pointer;
                border: 1px solid #79b935;
                vertical-align: middle;
                padding-left: 3px;
                padding-right: 3px;
            }
            .setinputtext {
                width: 12%;
            }
            .setinputbutton {
                width: 15%;
                color: #fff;
                background-color: #79b935;
            }

            .blink{
                font-weight: bold;
                color: red;
                -webkit-animation-name: blinker;
                -webkit-animation-duration: 2s;
                -webkit-animation-timing-function: linear;
                -webkit-animation-iteration-count: infinite;

                -moz-animation-name: blinker;
                -moz-animation-duration: 1s;
                -moz-animation-timing-function: linear;
                -moz-animation-iteration-count: infinite;

                animation-name: blinker;
                animation-duration: 2s;
                animation-timing-function: linear;
                animation-iteration-count: infinite;
            }

            #logo {
                font-family: Arial, sans-serif;
                color: #738190;
            }

            #tabs {display: block;}

            #tabHeader {
                display: none;
                padding: 0;
                margin-bottom: 9px;
                min-width: 700px;
            }
            #tabHeader li {
                display: inline-block;
                padding: 10px 12px 10px 12px;
                margin-bottom: 5px;
                font-size: 15px;
                font-family: sans-serif;
                text-shadow: #6e6e6e 0.1em 0.1em 0.2em;
                background-color: #6e6e6e;
            }
            #tabHeader li a {
                color: #FFF;
                text-decoration: none;
            }

            #tabContent {
                display: block;
                border: 1px solid #79b935;
                border-top-width: 3px;
                border-bottom-left-radius: 7px;
                border-bottom-right-radius: 7px;
                background-color: #fff;
                padding: 10px;
                overflow: auto;
                width: auto;
                min-width: 775px;
            }

            #tabContent>div {display: none;}

            th {
                text-align: right;
                color: #747d8d;
            }

            select {
                border: 0 solid #747d8d;
                padding: 0 4px 0 4px;
                background-color: #FFF;
                font-family: inherit;
                text-indent: 5px;
                color: #000;
                font-size: 14px;
                box-shadow: #6e6e6e 0.1em 0.1em 0.2em;
                border-radius: 5px;
                height: 20px;
            }

            textarea {
                border: 1px solid #79b935;
                border-radius: 5px;
                height: 130px;
            }

            .otherbuttons {
                background-color: green;
                color: #fff;
                font-size: 12px;
                text-align: center;
                line-height: 20px;
                cursor: pointer;
            }

            .onoffbuttons {
                background-color: green;
                color: #fff;
                width: 35px;
                height: 20px;
                font-size: 12px;
                text-align: center;
                line-height: 20px;
                cursor: pointer;
            }

            .edgeborder{
                width: 100%;
                min-width: 700px;
                border: 1px solid gray;
                text-align:justify;
                border-radius: 10px;
                background:-moz-linear-gradient(right,#79b935 90%, white 100%); /* Firefox */
                background:-webkit-linear-gradient(right,#79b935 90%, white 100%); /* Safari, Chrome */
                background:-o-linear-gradient(right,#79b935 90%, white 100%); /* Opera */
                background:-ms-linear-gradient(right,#79b935 90%, white 100%); /* IE */
                background:linear-gradient(right,#79b935 90%, white 100%); /* W3C Standard */
            }

            @-moz-keyframes blinker {
                0% { opacity: 1.0; }
                50% { opacity: 0.0; }
                100% { opacity: 1.0; }
            }

            @-webkit-keyframes blinker {
                0% { opacity: 1.0; }
                50% { opacity: 0.0; }
                100% { opacity: 1.0; }
            }

            @keyframes blinker {
                0% { opacity: 1.0; }
                50% { opacity: 0.0; }
                100% { opacity: 1.0; }
            }

            input[type=number]{
                min-width: 50px;
                max-width: 100px;
                width: 50%;
                border: 1px solid #ccc;
                border-radius: 4px;
            }

            button {
                outline: none;
                border: 1px solid #ccc;
                border-radius: 4px;
                cursor: pointer;
                background: #fff;
            }

            /* responsive */
            @media only screen and (max-width: 1700px){
            }

            @media only screen and (max-width: 1300px){
            }

            .saunaLOn {
                background-color: #fff;
                color: #79b935;
                font-weight: bold;
            }
            .saunaLOff {
                background-color: #fff;
                color: #df3935;
                font-weight: bold;
            }
            .saunaBOn {
                background-color: #fff;
                color: #79b935;
                border: 1px solid #79b935;
                cursor: pointer;
                font-weight: bold;
            }
            .saunaBOff {
                background-color: #fff;
                color: #df3935;
                border: 1px solid #df3935;
                cursor: pointer;
                font-weight: bold;
            }
            .saunaBOn:disabled, .saunaBOff:disabled {
                background-color: #fff;
                color: #c0c0c0;
                border: 1px solid #c0c0c0;
                cursor: pointer;
                font-weight: bold;
            }

        </style>
        <title>WEB@Sauna Configuration</title>
        <meta name="viewport" content="width=470px, initial-scale=1.0">
    </head>

    <body>
        <div id="topbutton" style="display:block" class="edgeborder">
            <table id="topsystembts" style="width: 50%; min-width: 500px;">
                <tr>
                    <td class="logotop">
                        <div id="logo" onclick="">
						    <img src="../p/EOSLogo.PNG">
 <!---                           <span class="logoPart" style="font-size: 45px;">EOS</span>
-->
                        </div>
                    </td>
                    <td id="topinfodiv" style="width: 10%; border-right: 1px solid #c0c0c0; min-width: 100px;">
                        <div align=center>
                            <a id="topinfo" class="logobutton" onclick="showTabs('2')">Information</a>
                        </div>
                    </td>
                    <td id="topenterdiv" style="width: 10%; border-right: 1px solid #c0c0c0; min-width: 100px; display: none">
                        <div align=center>
                            <a id="enterconfigbutton" class="logobutton" onclick='enterConfigMode()'>Enter Config</a>
                        </div>
                    </td>
                    <td id="topsavediv" style="display: none; width: 10%; border-right: 1px solid #c0c0c0; min-width: 100px;">
                        <div align=center>
                            <a id="topsave" class="logobutton" onclick="saveexit()">Save and exit</a>
                        </div>
                    </td>
                    <td id="toprebootdiv" style="width: 10%; border-right: 1px solid #c0c0c0; min-width: 100px;">
                        <div align=center>
                            <a id="topreboot" class="logobutton">Reboot Device</a>
                        </div>
                    </td>
                </tr>
            </table>
        </div>
        <br>
        <div id="tabs">
            <ul id="tabHeader">
                <li id="t0"><a href="#tabDevice" onclick="updateTabs('tabDevice');">Device Info</a></li>
                <li id="t1"><a href="#tabSystemInfo" onclick="updateTabs('tabSystemInfo');">System Info</a></li>
                <li id="t2"><a href="#tabSaunaInfo" onclick="updateTabs('tabSaunaInfo');">Sauna</a></li>
                <li id="t3"><a href="#tabNETConfig" onclick="updateTabs('tabNETConfig');">Config</a></li>
            </ul>
            <div id="tabContent">
                <div id="tabDevice">
                    <table id="deviceInfo" class="tabtable">
                            <tr>
                              <th>Device Name</th>
                              <td id="device-name"></td>
                            </tr>
                            <tr>
                              <th>System Time</th>
                              <td id="device-sysTime"></td>
                            </tr>
                            <tr>
                              <th>Up Time</th>
                              <td id="device-upTime"></td>
                            </tr>
                            <tr>
                                <th>&nbsp;</th>
                            </tr>
                            <tr>
                              <th style="color: #000">Network</th>
                            </tr>
                            <tr>
                              <th>DHCP</th>
                              <td id="device-dhcp"></td>
                            </tr>
                            <tr>
                              <th>IP address</th>
                              <td id="device-ipAddress"></td>
                            </tr>
                            <tr>
                              <th>Netmask</th>
                              <td id="device-mask"></td>
                            </tr>
                            <tr>
                              <th>Gateway</th>
                              <td id="device-gateway"></td>
                            </tr>
                            <tr>
                              <th>DNS</th>
                              <td id="device-dns"></td>
                            </tr>
                            <tr>
                              <th>Cloud</th>
                              <td id="device-cloud"></td>
                            </tr>
                        </table>
                </div>

                <div id="tabSystemInfo">
                    <table id="systemInfo" class="tabtable">
                            <tr>
                                <th>Core</th>
                                <td id="system-core"></td>
                            </tr>
                            <tr>
                                <th>HWID</th>
                                <td id="system-hwid"></td>
                            </tr>
                            <tr>
                                <th>Hardware Rev.</th>
                                <td id="system-hwVersion"></td>
                            </tr>
                            <tr>
                                <th>Firmware Rev.</th>
                                <td id="system-fwVersion"></td>
                            </tr>
                            <tr>
                                <th>CPU Clock</th>
                                <td id="system-cpuClock"></td>
                            </tr>
                            <tr>
                                <th>CPU Temp</th>
                                <td id="system-cpuTemp"></td>
                            </tr>
                            <tr>
                                <th>Ram Size</th>
                                <td id="system-ramSize"></td>
                            </tr>
                            <tr>
                                <th>Flash Size</th>
                                <td id="system-flashSize"></td>
                            </tr>
                            <tr>
                                <th>Program Size</th>
                                <td id="system-programSize"></td>
                            </tr>
							<tr>
                                <th>Admin password</th>
                                <td><input type=password id="pwd" size="11" maxlength='10'>&nbsp;&nbsp;<input type=button id="admin-button" class="otherbuttons" value='Set admin mode' onclick="enableAdmin()"></td>
                            </tr>
                        </table>
                </div>

                <div id="tabSaunaInfo">
                    <table id="saunaInfo" class="tabtable">
                            <tr>
                                <th>Status</th>
                                <td colspan=2 id="sauna-status"></td>
                            </tr>
                            <tr>
                                <th>Light</th>
                                <td>
                                    <label class=saunaLOn id="light-state"></label>
                                </td>
                                <td>
                                    <input type=button class="saunaBOn" id="sauna-light-button-on" value='ON' onclick="saunaState(1,1)">
                                    <input type=button class="saunaBOff" id="sauna-light-button-off" value='OFF' onclick="saunaState(1,2)">
                                </td>
                            </tr>
                            <tr>
                                <th>Sauna</th>
                                <td>
                                    <label class=saunaLOn id="sauna-state"></label>
                                </td>
                                <td>
                                    <input type=button class="saunaBOn" id="sauna-sauna-button-on" value='ON' onclick="saunaState(2,1)">
                                    <input type=button class="saunaBOff" id="sauna-sauna-button-off" value='OFF' onclick="saunaState(2,2)">
                                </td>
                            </tr>
                            <tr>
                                <th>Vaporizer</th>
                                <td>
                                    <label class=saunaLOn id="vapor-state"></label>
                                </td>
                                <td>
                                    <input type=button class="saunaBOn" id="sauna-vapor-button-on" value='ON' onclick="saunaState(3,1)">
                                    <input type=button class="saunaBOff" id="sauna-vapor-button-off" value='OFF' onclick="saunaState(3,2)">
                                </td>
                            </tr>
                            <tr>
                                <th>Light Intensity</th>
                                <td id="sauna-light"></td>
                                <td>
                                    <div id="setlightdiv">
                                    <label onclick="showLight()" id="setlightlabel" class="setlabel">Edit</label>
                                    <input type=text id="sauna-setlight" class="setinputtext" maxlength='3' style="visibility: hidden">
                                    <input type=button value="Set" id="setlight" class="setinputbutton" onclick="checkLight()" style="visibility: hidden">
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <th>Current Temperature</th>
                                <td colspan=2 id="sauna-istemp"></td>
                            </tr>
                            <tr>
                                <th>Target Temperature</th>
                                <td id="sauna-tartemp"></td>
                                <td>
                                    <div id="settempdiv">
                                    <label onclick="showTemp()" id="settemplabel" class="setlabel">Edit</label>
                                    <input type=text id="sauna-settemp" class="setinputtext" maxlength='3' style="visibility: hidden">
                                    <input type=button value="Set" id="settemp" class="setinputbutton" onclick="checkTemp()" style="visibility: hidden">
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <th>Current Humidity</th>
                                <td colspan=2 id="sauna-ishumi"></td>
                            </tr>
                            <tr>
                                <th>Target Humidity</th>
                                <td id="sauna-tarhumi"></td>
                                <td>
                                    <div id="sethumidiv">
                                    <label onclick="showHumi()" id="sethumilabel" class="setlabel">Edit</label>
                                    <input type=text id="sauna-sethumi" class="setinputtext" maxlength='3' style="visibility: hidden">
                                    <input type=button value="Set" id="sethumi" class="setinputbutton" onclick="checkHumi()" style="visibility: hidden">
                                    </div>
                                </td>
                            </tr>
                    </table>
                </div>


                <div id="tabNETConfig">
                    <table id="NETConfig" class="tabtable">
                        <tr>
                            <th>MAC</th>
                            <td id="NET-MAC"></td>
                        </tr>
                        <tr>
                            <th>DHCP</th>
                            <td><div id="NET-dhcp-active" class="onoffbuttons" onclick="onoffnetwork('1');">ON</div></td>
                        </tr>
                        <tr>
                            <th>Static IP</th>
                            <td id="NET-ipAddr"></td>
                        </tr>
                        <tr>
                            <th>Mask</th>
                            <td id="NET-maskAddr"></td>
                        </tr>
                        <tr>
                            <th>Gateway</th>
                            <td id="NET-gwAddr"></td>
                        </tr>
                        <tr>
                            <th>DNS</th>
                            <td id="NET-DNS"></td>
                        </tr>
                        <tr>
                            <th>Time Server</th>
                            <td><input type="text" id="NET-timeSrv" size='30' maxlength='30' /></td>
                        </tr>
                        <tr>
                        <th>Device Name</th>
                        <td><input type="text" id="NET-deviceName" size='20' maxlength='20' /></td>
                        </tr>
						<tr>
                        <th>Discovery</th>
                        <td><div id="NET-discover-active" class="onoffbuttons" onclick="onoffnetwork('2');">ON</div></td>
                        </tr>

                    </table>
                    <table id="systemtable">
                        <tr>
                            <td>
                                <input type="button" class="otherbuttons" id="factory-restore" value="Restore factory default settings" />
                            </td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>
<script>
    var device = '';
    var net = '';
    var sys_Sec = '';
    var dataIO = '';
    var sys_Status = '';
    var net_Status = '';
    var sauna_Status = '';
    var sauna_Status_is = '';
    var sauna_Status_setdev = '';
    var sauna_Status_setcld = '';
    var sauna_Status_cfg = '';
    var System_Time = '';
    var System_Config = '';
    var System_Version = '';

    var prodType = 0;
    var showCloud = 1;

    var showOut = true;
    var adminMode = false;

    var ConfigApplyMsg = "Apply Changes ?\nDevice will reboot.\nThis may take 20 seconds.\nIf web page fails to load after that time, press F5.";
    var SetFactoryMsg = "Restore to factory defaults and reboot ?\nThis may take 20 seconds.\nIf web page fails to load after that time, press F5.";
    var RebootMsg = "Execute reboot ?\nThis may take 20 seconds.\nIf web page fails to load after that time, press F5.";

    var configMode = 0;
    var old_config = 0;
    var h2nConnected  = false;

    var saunastatus = ["Inactive","Finnish mode","BIO mode","After burner mode","Fault"];

    var _bLightOnBtnLocked= false;
    var _bLightOnTargetState = "0";
    var _timeLightOnStart = 0;
    var _bSaunaOnBtnLocked= false;
    var _bSaunaOnTargetState = "0";
    var _timeSaunaOnStart = 0;
    var _bVaporOnBtnLocked= false;
    var _bVaporOnTargetState = "0";
    var _timeVaporOnStart = 0;

    var globalGetPeriodicBundleFlag = true; // flag if the periodic bundles are being fetched; normally yes, when rebooting or saving cfg no

    ///////////////////////////////////////////////////////////

    (function(w) {
        var ajaxTimeoutInMs = 4000; // 4s
        var ajax = function (url, method, headers, body, callback) {
            if(!callback){
                if(!body && typeof headers === 'function'){
                    if(typeof headers === 'function'){
                        callback = headers;
                        headers = null;
                    }
                } else if(typeof body === 'function'){
                    callback = body;
                    body = null;
                }
            }

            var xhr = new XMLHttpRequest();
            xhr.open(method || "GET", url);
            xhr.onload = function () {
                var payload, err;
                if (xhr.status === 200) {
                    payload = xhr.responseText;
                    err = null;
                }
                else {
                    payload = xhr.responseText || 'AJAX request failed';
                    err = xhr.status;
                    console.log("Error " + err + " on: " + url);
                }
                if (typeof callback === 'function') {
                    callback(err, payload);
                }
            };
            xhr.timeout = ajaxTimeoutInMs;
            xhr.ontimeout = function () {
                console.log("Timeout on: " + url);
            };
            if (headers && headers.length > 0){
                for(var i=0; i<headers.length; i++){
                    xhr.setRequestHeader(headers[i].key, headers[i].val);
                }
            }
            xhr.send(body);
        };

        var readBundle = function(pairs, retryOnError, callback){
            if(!callback && typeof retryOnError === 'function') {
                callback = retryOnError;
                retryOnError = 0;
            }

            var arr = pairs.map(function(item){
                return jsonStringify({op: 'r', path: item.val});
            });
            // var body = '[\r\n' + arr.join(',\r\n') + '\r\n]\r\n';
            var body = arr.join('\r\n') + '\r\n\r\n';
            var reversedMap = {};
            pairs.forEach(function(item){
                reversedMap[item.val] = item.key;
            });

            ajax('/_bundle', "POST", null, body, function(err, payload){
                if(err && retryOnError){
                    setTimeout(function(){
                        console.warn('Error on readBundle, retrying...');
                        readBundle(pairs, retryOnError, callback);
                    }, 1000);
                    return;
                }
                if(!err && payload){
                    var res = jsonParse(payload); // res should be an array of objects {"path": "PATH": "res": RESOURCE_OBJECT_FOR_THIS_PATH}
                    res.forEach(function(item){
                        var variable = reversedMap[item['path']];
                        if (variable){
                            w[variable] = item['res'];
                        }
                    });
                    if (typeof callback === 'function') {
                        callback(err);
                    }
                }
            });
        };

        var addPrefixIfMissing = function(path){
            var prefix = '/__';
            var lenPrefix = prefix.length;
            return (prefix === path.substr(0, lenPrefix))? path: prefix + path;
        };

        var readResource = function (path, callback) {
            ajax(addPrefixIfMissing(path), "GET", function (err, payload) {
                if(!err && payload) {
                    if (typeof callback === 'function') {
                        callback(jsonParse(payload));
                    }
                }
            });
        };

        var ssiVars = [
            {'key': 'device', 'val': '/config/device'},
            {'key': 'net', 'val': '/config/net'},
            {'key': 'sys_Sec', 'val': '/config/system/security'},
            {'key': 'sys_Status', 'val': '/system/status'},
            {'key': 'net_Status', 'val': '/net/status'},
            {'key': 'System_Time', 'val': '/system/rtc'},
            {'key': 'System_Config', 'val': '/config/system'},
            {'key': 'System_Version', 'val': '/system/version'},
            {'key': 'sauna_Status_is', 'val': '/usr/eos/is'},
            {'key': 'sauna_Status_setdev', 'val': '/usr/eos/setdev'},
            {'key': 'sauna_Status_cfg', 'val': '/usr/eos/cfg'}
        ];

        var statusVars = [
            {'key': 'System_Time', 'val': '/system/rtc'},
            {'key': 'sys_Status', 'val': '/system/status'},
            {'key': 'net_Status', 'val': '/net/status'},
            {'key': 'sauna_Status_is', 'val': '/usr/eos/is'},
            {'key': 'sauna_Status_setdev', 'val': '/usr/eos/setdev'},
            {'key': 'sauna_Status_cfg', 'val': '/usr/eos/cfg'}
        ];

        var updateResource = function(path, payload, callback){
            var retries = 5;

            var doIt = function(path, payload, callback) {
                ajax(addPrefixIfMissing(path), "POST", null, jsonStringify(payload) + "\r\n", function (err, result) {
                    if (!err && typeof callback === 'function') {
                        callback(result);
                    }
                    if (err && retries-->0) {
                        setTimeout(function () {
                            console.warn('Error on updateResource, retrying...');
                            doIt(path, payload, callback);
                        }, 1000);
                    }
                });
            };
            doIt(path, payload, callback);
        };

        var updateBundle = function(pairs, callback){
            var arr = pairs.map(function(item){
                return jsonStringify({op: 'w', path: item.path, res: item.res});
            });
            var body = arr.join('\r\n') + '\r\n\r\n';

            var retries = 5;
            var doIt = function (body, callback) {
                ajax('/_bundle', 'POST', null, body, function (err, result) {
                    if(!err && typeof callback === 'function'){
                        var payload = jsonParse(result);
                        callback(payload);
                    }
                    if (err && retries-->0) {
                        setTimeout(function () {
                            console.warn('Error on updateBundle, retrying...');
                            doIt(body, callback);
                        }, 1000);
                    }
                });
            };
            doIt(body, callback);
        };

        var loadSSI = function () {
            //console.log('loadSSI called');
            readBundle(ssiVars, 1, OnStart);
        };
        var loadStatus = function() {
            //console.log('loadStatus called');
            if (globalGetPeriodicBundleFlag == true) {
                readBundle(statusVars, 0, cgiGetDeviceStatus);
            }
        };

        var exports = {
            ajax: ajax,
            loadStatus: loadStatus,
            loadSSI: loadSSI,
            updateResource: updateResource,
            updateBundle: updateBundle,
            readResource: readResource,
            readBundle: readBundle
        };

        // TODO: export for CommonJS and RequireJS (later, now we just add them to the global soup)
        window.ajax = exports.ajax;
        window.readResource = exports.readResource;
        window.readBundle = exports.readBundle;
        window.updateResource = exports.updateResource;
        window.updateBundle = exports.updateBundle;
        window.loadStatus = exports.loadStatus;
        window.loadSSI = exports.loadSSI;
    })(window);

    function id(id) {
        if (!document.getElementById(id)) {
            console.log(id, document.getElementById(id));
        }
        return document.getElementById(id);
    }

    function OnStart() {
        getDeviceInfo();
        getNETConfig();
        parseSaunaFirstTime();
        parseSaunaConfig();
        generateOnClickFunction();
        loadStatus();
        window.setInterval(loadStatus, 1000);
        showTabs("2");
    }

    window.onload = function () {
        loadSSI();
    };

    function enableAdmin() {
        adminMode = (id("pwd").value=="EOS?Conf99");
        if (adminMode) {
            id("topenterdiv").style.display = "";
        } else {
            id("topenterdiv").style.display = "none";
        }
    }

    function jsonParse(string) {
        var ret = '';
        if (JSON && JSON.parse) {
            return JSON.parse(string);
        }
        // OLD browser
        eval("ret = " + string + ";"); // eval is EVIL!!!
        return ret;
    }

    function jsonStringify(parameters) {
        if (JSON && JSON.stringify) {
            return JSON.stringify(parameters);
        }
        // OLD browser
        var ret = "{";
        for (var key in parameters) {
            if(!parameters.hasOwnProperty(key)) continue;
            var value = parameters[key];
            ret += "\"" + key + "\"" + ":" + "\"" + value + "\"" + ",";
        }
        if (ret.length > 0) {
            ret = ret.substring(0, ret.length - 1);
        }
        ret = ret + "}";
        return ret;
    }

    ////////// GETTERS /////////////////////////////////
    //get static info from device
    function getDeviceInfo() {
        var data = device;
        id("system-core").innerHTML = data["core"];
        id("system-hwid").innerHTML = data["hwid"];
        id("device-name").innerHTML = data["deviceName"];
        id("NET-deviceName").value = data["deviceName"];
        id("system-hwVersion").innerHTML = data["hwVersion"];
        id("system-fwVersion").innerHTML = data["fwVersion"];
        id("system-cpuClock").innerHTML = formatSI(data["cpuClock"], 1, 1000) + "Hz";
        id("system-programSize").innerHTML = formatSI(data["programSize"], 0, 1024) + "B";
        id("system-flashSize").innerHTML = formatSI(data["flashSize"], 0, 1024) + "B";
        id("system-ramSize").innerHTML = formatSI(data["ramSize"], 0, 1024) + "B";
    }

    function cgiGetDeviceStatus() {
        var cgiData = sys_Status;
        if(!cgiData){
            console.log("No CGI data!");
            return;
        }

        id("system-cpuTemp").innerHTML = parseFloat(cgiData["cpuTemp"]).toFixed(1) + " &deg;C";
        id("device-upTime").innerHTML = formatTimePeriod(cgiData["upTime"]);
        id("device-sysTime").innerHTML = formatDateTimeS(cgiData["sysTime"]);

        configMode = parseInt(cgiData["configMode"]);
        showConfigMode(0);
        cgiData = net_Status;

        h2nConnected=cgiData["h2nConnected"];
        if (showCloud==1) {
            if (!h2nConnected) {
                id("device-cloud").innerHTML = "not connected";
            } else {
                id("device-cloud").innerHTML = cgiData["h2nIp"]+":"+cgiData["h2nPort"];
            }
        }
        id("device-ipAddress").innerHTML = cgiData["devIp"];
        id("device-mask").innerHTML = cgiData["devMask"];
        id("device-gateway").innerHTML = cgiData["devGw"];
        id("device-dns").innerHTML = cgiData["devDns"];
        id("NET-MAC").innerHTML = cgiData["macAddr"];
        parseSaunaConfig();
    }

    // get ip info from device
    function getNETConfig() {
        parseNETConfig(net);
        disableNET();
    }


    ////////// TABS ///////////////////////////////////////

    function showTabs(value)
    {
        id("tabHeader").style.display= "block";
        var header = id("tabHeader");
        var i;
        if(value == "1") {
            for(i=0; i<3; i++){
                header.children[i].style.visibility = "hidden";
                header.children[i].style.display = "none";
            }
            for(i=3; i<4; i++){
                header.children[i].style.visibility = "visible";
                header.children[i].style.display = "inline";
            }
            id("topinfo").style.textShadow= "#747d8d 0.1em 0.1em 0.2em";
            id("topreboot").style.textShadow= "#747d8d 0.1em 0.1em 0.2em";
            updateTabs("tabNETConfig");
        } else if(value == "2") {
            for(i=3; i<4; i++){
                header.children[i].style.visibility = "hidden";
                header.children[i].style.display = "none";
            }
            for(i=0; i<3; i++){
                header.children[i].style.visibility = "visible";
                header.children[i].style.display = "inline";
            }
            updateTabs("tabDevice");
        }
    }


    function updateTabs(selectedTab) {
        var wrapper = id("tabContent");
        var i;
        for (i = 0; i < wrapper.children.length; i++) {
            wrapper.children[i].style.display = "none";
        }
        if (!selectedTab) {
            selectedTab = window.location.hash.substring(2);
        }
        if (!selectedTab) {
            selectedTab = "tabDevice";
        }
        id(selectedTab).style.display = "block";
        var header = id("tabHeader");

        for (i = 0; i < header.children.length; i++) {
            var str = header.children[i].firstChild.href;
            str = str.substring(str.indexOf('#')+1,str.length);
            if (str == selectedTab) {
                //header.children[i].setAttribute("class", "tabActive");
                //header.children[i].setAttribute("className", "tabActive");
                id("t"+i).style.backgroundColor = "#79b935";
                //id("t"+i).style.fontSize = "18px";
            } else {
                //header.children[i].setAttribute("class", "tabInactive");
                //header.children[i].setAttribute("className", "tabInactive");
                id("t"+i).style.backgroundColor = "#6e6e6e";
                //id("t"+i).style.fontSize = "16px";
            }
        }

    }
    //////////////////////////////////////////////


    ////// PARSING DATA //////////
    function parseNETConfig(data) {
        // Password Active
        if(data["dhcpEnabled"] == 1){id("NET-dhcp-active").style.backgroundColor = "green"; id("NET-dhcp-active").innerHTML = "ON";}
        else{id("NET-dhcp-active").style.backgroundColor = "red"; id("NET-dhcp-active").innerHTML = "OFF";}
        if(data["disCoverDisabled"] == 0){id("NET-discover-active").style.backgroundColor = "green"; id("NET-discover-active").innerHTML = "ON";}
        else{id("NET-discover-active").style.backgroundColor = "red"; id("NET-discover-active").innerHTML = "OFF";}
        id("NET-ipAddr").value = formatIpMask("NET-ipAddr", data["ipAddr"]);
        id("NET-maskAddr").value = formatIpMask("NET-maskAddr", data["maskAddr"]);
        id("NET-gwAddr").value = formatIpMask("NET-gwAddr", data["gwAddr"]);
        id("NET-DNS").value = formatIpMask("NET-DNS", data["DNS"]);
        id("NET-timeSrv").value = data["timeSrv"];
        id ("NET-discover-active").value = data["disCoverDisabled"];
        disableNET();

        if(data["dhcpEnabled"] == 1)
        {
            id("device-dhcp").innerHTML = "Enabled";
            id("device-dhcp").style.color = "#79b935";
            id("device-ipAddress").innerHTML = "";
            id("device-mask").innerHTML = "";
            id("device-gateway").innerHTML = "";
            id("device-dns").innerHTML = "";
        }
        else
        {
            id("device-dhcp").innerHTML = "Disabled";
            id("device-dhcp").style.color = "#DF7401";
            id("device-ipAddress").innerHTML = data["ipAddr"];
            id("device-mask").innerHTML = data["maskAddr"];
            id("device-gateway").innerHTML = data["gwAddr"];
            id("device-dns").innerHTML = data["DNS"];
        }
    }


    function postNETConfig() {
        postNetNow();
    }

    function postNetNow() {
        var ch = id("NET-dhcp-active").innerHTML == "ON";
        var disco = id("NET-discover-active").innerHTML == "OFF";
        updateResource('/config/net', {
            dhcpEnabled: ch,
            ipAddr: ipMaskValue("NET-ipAddr"),
            maskAddr: ipMaskValue("NET-maskAddr"),
            gwAddr: ipMaskValue("NET-gwAddr"),
            DNS: ipMaskValue("NET-DNS"),
            timeSrv: id("NET-timeSrv").value,
            deviceName: id("NET-deviceName").value,
            disCoverDisabled: disco
        }, function(result){
            // parseNETConfig(result);
        });
    }

    function parseSaunaFirstTime(){
        var data = sauna_Status_setdev;
        var lb = data["Lxd"];
        if(lb=="0"){
            id("light-state").innerHTML = "OFF";
            id("light-state").className = "saunaLOff";
            id("sauna-light-button-off").disabled = true;
            id("sauna-light-button-on").disabled = false;
        }else{
            id("light-state").innerHTML = "ON";
            id("light-state").className = "saunaLOn";
            id("sauna-light-button-off").disabled = false;
            id("sauna-light-button-on").disabled = true;
        }
        var sb = data["Sxd"];
        if(sb=="0"){
            id("sauna-state").innerHTML = "OFF";
            id("sauna-state").className = "saunaLOff";
            id("sauna-sauna-button-off").disabled = true;
            id("sauna-sauna-button-on").disabled = false;
        }else{
            id("sauna-state").innerHTML = "ON";
            id("sauna-state").className = "saunaLOn";
            id("sauna-sauna-button-off").disabled = false;
            id("sauna-sauna-button-on").disabled = true;
        }
        var vb = data["Vxd"];
        if(vb=="0"){
            id("vapor-state").innerHTML = "OFF";
            id("vapor-state").className = "saunaLOff";
            id("sauna-vapor-button-off").disabled = true;
            id("sauna-vapor-button-on").disabled = false;
        }else{
            id("vapor-state").innerHTML = "ON";
            id("vapor-state").className = "saunaLOn";
            id("sauna-vapor-button-off").disabled = false;
            id("sauna-vapor-button-on").disabled = true;
        }
    }
    function parseSaunaConfig(){
        var data = sauna_Status_is;
        var data_dev = sauna_Status_setdev;
        var st = parseInt(data["S"]);
        if(st==250)
            id("sauna-status").innerHTML = "ERR 250";
        else if(st==251)
            id("sauna-status").innerHTML = "ERR 251";
        else if(st==252)
            id("sauna-status").innerHTML = "ERR: INVAL WR FRM";
        else if(st==253)
            id("sauna-status").innerHTML = "ERR: ONLY RD FRM";
        else if(st==254)
            id("sauna-status").innerHTML = "ERR: NO RD/WR FRM";
        else if(st==255)
            id("sauna-status").innerHTML = "ERR: NO STATUS INFO";
        else
            id("sauna-status").innerHTML = saunastatus[data["S"]];
        if(id("sauna-status").innerHTML=="Fault"){id("sauna-status").style.color = "red";}
        else if(id("sauna-status").innerHTML=="Inactive"){id("sauna-status").style.color = "#c0c0c0";}
        else {id("sauna-status").style.color = "#000";}
        //ms_chg: ignore input until confirmed or timeout

        var tnow = new Date().getTime();

        if (_bLightOnBtnLocked==true)
        {
            if (_bLightOnTargetState == data_dev["Lxd"])
            {
                _bLightOnBtnLocked = false;
                if (_bLightOnTargetState=="1")
                {
                    saunaBtnDisplay(1,1);
                }
                else
                {
                    saunaBtnDisplay(1,2);
                }
            }
            else if (_timeLightOnStart < tnow)		//ms_chg: timeout hits
            {
                _bLightOnBtnLocked = false;					// unlock it
            }
        }
        if (_bLightOnBtnLocked==false)
        {
            var lb = data_dev["Lxd"];
            if(lb=="0"){
                id("light-state").innerHTML = "OFF";
                id("light-state").className = "saunaLOff";
                id("sauna-light-button-off").disabled = true;
                id("sauna-light-button-on").disabled = false;
            }else{
                id("light-state").innerHTML = "ON";
                id("light-state").className = "saunaLOn";
                id("sauna-light-button-off").disabled = false;
                id("sauna-light-button-on").disabled = true;
            }
        }
//sauna


        if (_bSaunaOnBtnLocked==true)
        {
            if (_bSaunaOnTargetState == data_dev["Sxd"])
            {
                _bSaunaOnBtnLocked = false;
                if (_bSaunaOnTargetState=="1")
                {
                    saunaBtnDisplay(2,1);
                }
                else
                {
                    saunaBtnDisplay(2,2);
                }
            }
            else if ((_timeSaunaOnStart) < tnow)		//ms_chg: timeout hits
            {
                _bSaunaOnBtnLocked = false;					// unlock it
            }
        }
        if (_bSaunaOnBtnLocked==false)
        {
            var sb = data_dev["Sxd"];
            if(sb=="0"){
                id("sauna-state").innerHTML = "OFF";
                id("sauna-state").className = "saunaLOff";
                id("sauna-sauna-button-off").disabled = true;
                id("sauna-sauna-button-on").disabled = false;
            }else{
                id("sauna-state").innerHTML = "ON";
                id("sauna-state").className = "saunaLOn";
                id("sauna-sauna-button-off").disabled = false;
                id("sauna-sauna-button-on").disabled = true;
            }
        }
//vapor
        if (_bVaporOnBtnLocked==true)
        {
            if (_bVaporOnTargetState == data_dev["Vxd"])
            {
                _bVaporOnBtnLocked = false;
                if (_bVaporOnTargetState=="1")
                {
                    saunaBtnDisplay(3,1);
                }
                else
                {
                    saunaBtnDisplay(3,2);
                }
            }
            else if ((_timeVaporOnStart) < tnow)		//ms_chg: timeout hits
            {
                _bVaporOnBtnLocked = false;					// unlock it
            }
        }
        if (_bVaporOnBtnLocked==false)
        {
            var vb = data_dev["Vxd"];
            if(vb=="0"){
                id("vapor-state").innerHTML = "OFF";
                id("vapor-state").className = "saunaLOff";
                id("sauna-vapor-button-off").disabled = true;
                id("sauna-vapor-button-on").disabled = false;
            }else{
                id("vapor-state").innerHTML = "ON";
                id("vapor-state").className = "saunaLOn";
                id("sauna-vapor-button-off").disabled = false;
                id("sauna-vapor-button-on").disabled = true;
            }
        }

        id("sauna-light").innerHTML = data_dev["Ld"]+" %";
        id("sauna-istemp").innerHTML = data["T"]+"&#176;"+"C";
        var tmp = id("sauna-istemp").innerHTML;
        if(tmp<20){id("sauna-istemp").style.color = "blue";}
        else if(tmp>=20 && tmp<50){id("sauna-istemp").style.color = "green";}
        else if(tmp>=50 && tmp<100){id("sauna-istemp").style.color = "orange";}
        else if(tmp>=100){id("sauna-istemp").style.color = "red";}
        id("sauna-tartemp").innerHTML = data_dev["Td"]+"&#176;"+"C";
        id("sauna-ishumi").innerHTML = data["H"]+" %";
        id("sauna-tarhumi").innerHTML = data_dev["Hd"]+" %";
        if(data_dev["Td"]==getTmp)
            id("settemp").disabled = false;
        if(data_dev["Ld"]==getLht)
            id("setlight").disabled = false;
        if(data_dev["Hd"]==getHum)
            id("sethumi").disabled = false;
    }

    //////////////////////////////////////

    ////////////// FORMATING //////////////////////////
    function formatIpMask(input, value) {
        if(!value) return;
        var x = 0;
        var x1 = 0;
        for (var i = 1; i <= 4; i++) {
            x1 = value.indexOf(".", x);
            if (x1 < 0) x1 = value.length;
            id(input + "-" + i).value = value.substring(x, x1);
            x = x1 + 1;
        }
    }

    function formatSI(value, decimals, divisor) {
        var i = 0,
                unit;
        while (value >= divisor) {
            value /= divisor;
            i++;
        }
        switch (i) {
            case 0:
                unit = "";
                break;
            case 1:
                unit = "K";
                break;
            case 2:
                unit = "M";
                break;
            case 3:
                unit = "G";
                break;
            case 4:
                unit = "T";
                break;
            case 5:
                unit = "E";
                break;
            default:
                unit = "?";
                break;
        }
        return parseFloat(value).toFixed(decimals) + " " + unit;
    }

    function formatTimePeriod(seconds) {
        var days = Math.floor(seconds / (60 * 60 * 24));
        seconds = seconds % (60 * 60 * 24);
        var hours = Math.floor(seconds / (60 * 60));
        seconds = seconds % (60 * 60);
        var minutes = Math.floor(seconds / (60));
        seconds = seconds % (60);

        var text = "";
        if (days) {
            text += days + "d ";
        }
        if (days || hours) {
            text += hours + "h ";
        }
        if (days || hours || minutes) {
            text += minutes + "m ";
        }
        if (days || hours || minutes || seconds) {
            text += seconds + "s";
        }
        return text;
    }

    function formatDate(seconds) {
        var d = new Date(seconds * 1000);
        return ("0" + d.getDate()).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
    }

    function formatTimeS(seconds) {
        var d = new Date(seconds * 1000);
        return ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2) + ":" + ("0" + d.getSeconds()).slice(-2);
    }

    function formatDateTimeS(seconds) {return formatDate(seconds) + " " + formatTimeS(seconds);}

    function formatTimeNew(sec){
        var d1 = new Date(sec*1000);
        var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
        return d2.toString();
    }
    /////////////////////////////////////////////////

    function generateOnClickFunction() {
        id("factory-restore").onclick = function(){
            postFactoryRestore();
        };
        id("topreboot").onclick = function(){
            postReboot();
        };
    }

    function ipMaskKeyPress(input, event) {
        event = event || window.event;
        var code = event.keyCode || event.which;
        var caret = caretPosition(input);
        var nr = input.id.charAt(input.id.length - 1);

        var focus = null;

        if (code == 8 && caret == 0) { // DELETE
            // console.log("DELETE");
            focus = id(input.id.substr(0, input.id.length - 1) + (nr - 1));
        } else if (code == 37 && caret == 0) { // PREVIOUS
            // console.log("PREVIOUS");
            focus = id(input.id.substr(0, input.id.length - 1) + (nr - 1));
            event.preventDefault();
        } else if (code >= 48 && code <= 57 && caret >= 2) { // APPEND
            // console.log("APPEND");
            focus = id(input.id.substr(0, input.id.length - 1) + (nr - -1));
        } else if ((code == 39 || code == 110 || code == 188 || code == 190 || code == 44 || code == 46) && caret == input.value.length) { // NEXT
            // console.log("NEXT");
            focus = id(input.id.substr(0, input.id.length - 1) + (nr - -1));
            event.preventDefault();
        }
        if (focus) {
            focus.focus();
            focus.select();
        }
    }

    function ipMaskChange(input) {
        var val = parseInt(input.value);
        if (!input.value || (val >= 0 && val <= 255)) {
            input.style.color = "inherit";
        } else {
            input.value="";
            input.style.color = "red";
        }
    }

    function ipMaskValue(input) {
        return ipMaskValuePart(input, 1) + "." + ipMaskValuePart(input, 2) + "." + ipMaskValuePart(input, 3) + "." + ipMaskValuePart(input, 4);
    }

    function ipMaskValuePart(input, nr) {
        var val = id(input + "-" + nr).value * 1;
        if (val >= 0 && val <= 255) {
            return val;
        } else {
            return 0;
        }

    }

    function OneMaskChange(input) {
        var val = input.value;
        if (!input.value || (val >= 0 && val <= 65535)) {
            input.style.color = "inherit";
        } else {
            input.style.color = "red";
        }
    }

    function caretPosition(input) {
        var pos = 0;
        if (document.selection) {
            var sel = document.selection.createRange();
            sel.moveStart('character', -input.value.length);
            pos = sel.text.length;
        } else if (input.selectionStart || input.selectionStart == '0') {
            pos = input.selectionStart;
        }
        return (pos);
    }

    // save and exit button action
    function saveexit() {
        if(id("NET-deviceName").value != ""){
            if (confirm(ConfigApplyMsg)) {
                globalGetPeriodicBundleFlag = false; // stop periodic bundle requests
                id("topsavediv").style.backgroundColor = "white";
                id("topsave").innerHTML = "Saving and rebooting...";
                id("topsave").setAttribute("class","blink");

                postNETConfig();
                setTimeout(function() {postSaunaConfig();},1000);
                setTimeout(function() {postSaveConfig();},1500); // reloads windows
            }
        } else {alert("Device name cannot be empty");}
    }

    function postSaveConfig() {
        updateResource('/command/system', {saveConfig: 1}, function(result){
            console.log('postSaveConfig() => ' + (typeof result === "object")? jsonStringify(result) : result);
        });
        setTimeout(function () {window.location.reload()}, 15000);
    }

    // reboot button action
    function postReboot() {
        if (confirm(RebootMsg)) {
            globalGetPeriodicBundleFlag = false; // stop periodic bundle requests
            id("toprebootdiv").style.backgroundColor = "white";
            id("topreboot").innerHTML ="Rebooting...";
            id("topreboot").setAttribute("class","blink");

            updateResource('/command/system', {reboot: 1}, function(result){
                console.log('postReboot() => ' + (typeof result === "object")? jsonStringify(result) : result);
            });

            setTimeout(function(){window.location.reload()},15000);
            showTabs('2');
        }
    }

    // factory restore button action
    function postFactoryRestore() {
        if (confirm(SetFactoryMsg)) {
            globalGetPeriodicBundleFlag = false; // stop periodic bundle requests
            id("factory-restore").setAttribute("disabled", "disabled");
            id("topsavediv").style.backgroundColor = "white";
            id("topsave").innerHTML ="Rebooting...";
            id("topsave").setAttribute("class","blink");

            updateResource('/command/system', {factoryRestore: 1}, function(result){
                console.log('postFactoryRestore() => ' + (typeof result === "object")? jsonStringify(result) : result);
            });
            setTimeout(function () {window.location.reload()}, 15000);
        }
    }

    function postSaunaConfig() {
        var lt = id("sauna-setlight").value;
        var tm = id("sauna-settemp").value;
        var hm = id("sauna-sethumi").value;
        var lb = 0;
        var sb = 0;
        var vb = 0;
        if(id("light-state").innerHTML == "ON")
            lb=1;
        if(id("sauna-state").innerHTML == "ON")
            sb=1;
        if(id("vapor-state").innerHTML == "ON")
            vb=1;
//	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Lc: lt, Tc: tm, Hc: 5, Lxc: lb, Sxc: sb, Vxc: vb})+"/r/n", true, function(){});
//	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/data/setcld" + queryString({Lc: lt, Tc: tm, Hc: hm}), true, function(){});


        updateResource('/usr/eos/setcld', {
            Lc: lt, Tc: tm, Hc: 5, Lxc: lb, Sxc: sb, Vxc: vb
        }, function(result){
            parseSaunaConfig(result);
        });
    }

    // ms_chg: function added
    function postSaunaAction(a,t) {
        var s = "";
        if (a==1)
        {
            _bLightOnBtnLocked = true;
            _timeLightOnStart =  new Date().getTime()+20000;
            if(t==1) {
                //s = queryString({lightondev: 1});
                //s = queryString({Lxc: 1});
                //	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Lxc: 1}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Lxc: 1
                }, function(result){
                    parseSaunaConfig(result);
                });
                _bLightOnTargetState = "1";
            }
            else {
                //s = queryString({lightondev: 0});
                //s = queryString({Lxc: 0});
                //ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Lxc: 0}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Lxc: 0
                }, function(result){
                    parseSaunaConfig(result);
                });
                _bLightOnTargetState = "0";
            }
        }
        if (a==2)
        {
            _bSaunaOnBtnLocked = true;
            _timeSaunaOnStart =  new Date().getTime()+20000;
            if(t==1)
            {
                //s = queryString({saunaondev: 1});
                //s = queryString({Sxc: 1});
//			ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Sxc: 1}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Sxc: 1
                }, function(result){
                    parseSaunaConfig(result);
                });

                _bSaunaOnTargetState = "1"
            }
            else {
                //s = queryString({saunaondev: 0});
                //s = queryString({Sxc: 0});
//			ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Sxc: 0}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Sxc: 0
                }, function(result){
                    parseSaunaConfig(result);
                });
                _bSaunaOnTargetState ="0"
            }
        }
        if (a==3)
        {
            _bVaporOnBtnLocked = true;
            _timeVaporOnStart =  new Date().getTime() + 20000;
            if(t==1) {
                //s = queryString({vaporizerondev: 1});
                //s = queryString({Vxc: 1});
                //	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Vxc: 1}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Vxc: 1
                }, function(result){
                    parseSaunaConfig(result);
                });
                _bVaporOnTargetState = "1";
            }
            else {
                //s = queryString({vaporizerondev: 0});
                //s = queryString({Vxc: 0});
//			ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Vxc: 0}), true, function(){});
                updateResource('/usr/eos/setcld', {
                    Vxc: 0
                }, function(result){
                    parseSaunaConfig(result);
                });
                _bVaporOnTargetState = "0";
            }
        }
        //ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + s +"/r/n", true, function(){});
    }

    var getTmp=0;
    var getLht=0;
    var getHum=0;
    function checkLight() {
        getLht = parseFloat(id("sauna-setlight").value);
        if( getLht > 100 || getLht < 0 || isNaN(getLht)){alert("Invalid light value (Must be less than 101 and greater than 0)");}
        else {
            //	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({}), true, function(){});
            updateResource('/usr/eos/setcld', {
                Lc: getLht
            }, function(result){
                parseSaunaConfig(result);
            });
            showLight();
            id("setlight").disabled = true;
        }
    }
    function checkTemp() {
        getTmp = parseFloat(id("sauna-settemp").value);
        if( getTmp > 115 || getTmp < 30 || isNaN(getTmp)){alert("Invalid temperature (Must be less than 116 and greater than 30)");}
        else {
            //	ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Tc: getTmp}), true, function(){});
            updateResource('/usr/eos/setcld', {
                Tc: getTmp
            }, function(result){
                parseSaunaConfig(result);
            });
            showTemp();
            id("settemp").disabled = true;
        }
    }
    function checkHumi() {
        getHum = parseFloat(id("sauna-sethumi").value);
        if( getHum > 100 || getHum < 0 || isNaN(getHum)){alert("Invalid humidity (Must be less than 101 and greater than 0)");}
        else {
            //ajax(jsonDir + "/usr/eos/setcld" + jsonExt, "POST", "POST:/usr/eos/setcld" + queryString({Hc: getHum}), true, function(){});
            updateResource('/usr/eos/setcld', {
                Hc: getHum
            }, function(result){
                parseSaunaConfig(result);
            });
            showHumi();
            id("sethumi").disabled = true;
        }
    }

    function showConfigMode(force)
    {
        if ((old_config!=configMode) || (force==1)){
            if (configMode==1){
                id("enterconfigbutton").innerHTML = "Exit without saving";
                id("topinfodiv").style.display = "none";
                id("toprebootdiv").style.display = "none";
                id("topsavediv").style.display = "";
                showTabs("1");
                old_config=configMode;

            } else {
                id("enterconfigbutton").innerHTML = "Enter Config";
                id("topinfodiv").style.display = "";
                id("toprebootdiv").style.display = "";
                id("topsavediv").style.display = "none";
                showTabs("2");
                old_config=configMode;
            }
        }
    }


    function enterConfigMode()
    {
        if (configMode==0){
            if (confirm("Enter config mode.\nThe cloud connection will shutdown")) {
                configMode=1;
                old_config=0;
                postConfigMode(1);
                //		showTabs('1');
            }
        } else {
            if (confirm("Exit config mode?\nChanges will not be saved")) {
                configMode=0;
                old_config=1;
                postConfigMode(0);
                //		showTabs('2');
            }
        }
    }

    function postConfigMode(val) {
        ajax("/__/system/configmode", "POST", null, jsonStringify({enable: val}), function(){showConfigMode(1);});
    }

    function disableNET() {
        var value = id("NET-dhcp-active").innerHTML == "ON";
        for (var i = 1; i <= 4; i++) {
            id("NET-ipAddr-" + i).disabled = value;
            id("NET-maskAddr-" + i).disabled = value;
            id("NET-gwAddr-" + i).disabled = value;
            id('NET-DNS-' + i).disabled = value;
        }
    }

    function onoffnetwork(value) {
        if(value == 1)
        {
            id("NET-dhcp-active").style.backgroundColor == "red" ? id("NET-dhcp-active").style.backgroundColor = "green" : id("NET-dhcp-active").style.backgroundColor = "red";
            id("NET-dhcp-active").innerHTML == "OFF" ? id("NET-dhcp-active").innerHTML = "ON" : id("NET-dhcp-active").innerHTML = "OFF";
        }
        else if(value == 2)
        {
            id("NET-discover-active").style.backgroundColor == "red" ? id("NET-discover-active").style.backgroundColor = "green" : id("NET-discover-active").style.backgroundColor = "red";
            id("NET-discover-active").innerHTML == "OFF" ? id("NET-discover-active").innerHTML = "ON" : id("NET-discover-active").innerHTML = "OFF";
        }
        else if(value == 3)
        {
            //	id("NET-pairing-disabled").style.backgroundColor == "red" ? id("NET-pairing-disabled").style.backgroundColor = "green" : id("NET-pairing-disabled").style.backgroundColor = "red";
            //	id("NET-pairing-disabled").innerHTML == "OFF" ? id("NET-pairing-disabled").innerHTML = "ON" : id("NET-pairing-disabled").innerHTML = "OFF";
        }
        disableNET();
    }


    function postSystemConfig() {
        updateResource('/config/system', {webSource: null}, function(result){
            console.log('postSystemConfig() => ' + (typeof result === "object")? jsonStringify(result) : result);
        });
    }

    function saunaBtnDisplay(v,t){
        if(v==1){
            if(t==1){
                id("sauna-light-button-off").disabled= false;
                id("sauna-light-button-on").disabled = true;
            }else if(t==2){
                id("sauna-light-button-off").disabled= true;
                id("sauna-light-button-on").disabled = false;
            } else if (t==0){
                id("sauna-light-button-off").disabled= true;
                id("sauna-light-button-on").disabled = true;
            }
        }else if(v==2){
            if(t==1){
                id("sauna-sauna-button-off").disabled= false;
                id("sauna-sauna-button-on").disabled = true;
            }else if(t==2){
                id("sauna-sauna-button-off").disabled= true;
                id("sauna-sauna-button-on").disabled = false;
            } else if (t==0){
                id("sauna-sauna-button-off").disabled= true;
                id("sauna-sauna-button-on").disabled = true;
            }
        }else if(v==3){
            if(t==1){
                id("sauna-vapor-button-off").disabled= false;
                id("sauna-vapor-button-on").disabled = true;
            }else if(t==2){
                id("sauna-vapor-button-off").disabled= true;
                id("sauna-vapor-button-on").disabled = false;
            } else if (t==0){
                id("sauna-vapor-button-off").disabled= true;
                id("sauna-vapor-button-on").disabled = true;
            }
        }
        //postSaunaConfig();		//ms_chg: don't send complete config
        //postSaunaAction(v,t);
    }

    function saunaState(v,t){

        saunaBtnDisplay(v,0);
        if(v==1){
            if(t==1){
                id("sauna-light-button-off").disabled= false;
                id("sauna-light-button-on").disabled = true;
            }else if(t==2){
                id("sauna-light-button-off").disabled= true;
                id("sauna-light-button-on").disabled = false;
            }
        }else if(v==2){
            if(t==1){
                id("sauna-sauna-button-off").disabled= false;
                id("sauna-sauna-button-on").disabled = true;
            }else if(t==2){
                id("sauna-sauna-button-off").disabled= true;
                id("sauna-sauna-button-on").disabled = false;
            }
        }else if(v==3){
            if(t==1){
                id("sauna-vapor-button-off").disabled= false;
                id("sauna-vapor-button-on").disabled = true;
            }else if(t==2){
                id("sauna-vapor-button-off").disabled= true;
                id("sauna-vapor-button-on").disabled = false;
            }
        }

        //postSaunaConfig();		//ms_chg: don't send complete config
        postSaunaAction(v,t);
    }

    function showLight() {
        if(id("setlight").style.visibility=="hidden"){
            id("setlightlabel").style.color = "#747d8d";
            id("sauna-setlight").style.visibility="visible";
            id("setlight").style.visibility="visible";
            var s = id("sauna-light").innerHTML;
            id("sauna-setlight").value= parseInt(s.substring(0,s.length-2));
        } else {
            id("setlightlabel").style.color = "#79b935";
            id("sauna-setlight").style.visibility="hidden";
            id("setlight").style.visibility="hidden";
        }
    }
    function showTemp() {
        if(id("settemp").style.visibility=="hidden"){
            id("settemplabel").style.color = "#747d8d";
            id("sauna-settemp").style.visibility="visible";
            id("settemp").style.visibility="visible";
            var s = id("sauna-tartemp").innerHTML;
            id("sauna-settemp").value= parseInt(s.substring(0,s.length-2));
        } else {
            id("settemplabel").style.color = "#79b935";
            id("sauna-settemp").style.visibility="hidden";
            id("settemp").style.visibility="hidden";
        }
    }
    function showHumi() {
        if(id("sethumi").style.visibility=="hidden"){
            id("sethumilabel").style.color = "#747d8d";
            id("sauna-sethumi").style.visibility="visible";
            id("sethumi").style.visibility="visible";
            var s = id("sauna-tarhumi").innerHTML;
            id("sauna-sethumi").value= parseInt(s.substring(0,s.length-2));
        } else {
            id("sethumilabel").style.color = "#79b935";
            id("sauna-sethumi").style.visibility="hidden";
            id("sethumi").style.visibility="hidden";
        }
    }


    function h2n() {
        window.open('http://www.home2net.com/en/');
    }

    function generateIPInput(parentElementId) {
        var parentElement = document.getElementById(parentElementId);
        if(!parentElement){
            console.log('generateIPInput: id not found ' + parentElementId);
            return;
        }
        var d = document.createElement('DIV');
        d.className = 'input-ip-wrapper';
        for(var i=1; i<=4; i++){
            var inp = document.createElement('INPUT');
            inp.id = parentElementId + '-' + i;
            inp.type = "text";
            inp.size = 3;
            inp.maxLength = 3;
            inp.addEventListener('keypress', ipMaskKeyPress);
            inp.addEventListener('change', ipMaskChange);
            d.appendChild(inp);
        }
        parentElement.appendChild(d);
    }

</script>
            <script type="text/javascript">
                generateIPInput("NET-ipAddr");
                generateIPInput("NET-maskAddr");
                generateIPInput("NET-gwAddr");
                generateIPInput("NET-DNS");
            </script>


    </body>
</html>
Bin für jede Hilfe dankbar ;-)
Dateianhänge
2020-02-29 19_08_02-WEB@Sauna Configuration.png
2020-02-29 19_08_02-WEB@Sauna Configuration.png (16.75 KiB) 2241 mal betrachtet

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Beitrag von alchy » 29.02.2020, 20:47

m21muc hat geschrieben:
29.02.2020, 19:14
Ist es möglich,
Mit hoher Wahrscheinlichkeit - ja-

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

m21muc
Beiträge: 9
Registriert: 21.04.2017, 22:47

Re: EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Beitrag von m21muc » 29.02.2020, 20:58

Danke, Alchy. Hast Du einen Tipp, wie's gehen könnte :) ?

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Beitrag von alchy » 29.02.2020, 21:11

das hast du ja nicht gefragt.

"alles was irgendwie mittels http abgefragt werden kann", ist auch integrierbar in die CCU.
das ist natürlich nur meine persönliche Erfahrung gestützt durch ca. 100 Projekte über PN.
in deinem Fall z.B. wget benutzen um die Rückgabe auszulesen

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: EOS Saunacontrol Webinterface auslesen und als Systemvariable in CCU2 schreiben

Beitrag von Black » 01.03.2020, 09:13

Die Seiteninformationen, wie alchy schon sagte, bekommst du mit wget. dann halt die Antwort auswerten.

Das Steuern wird wahrscheinlich auch gehen, dazu würde ich mir mit wireshark mal das telegramm ansehen, was der browser verschickt, wenn du einen der Knöppches drückst.
Wenn du es mitschneiden konntest, ist es eher nicht das problem, dieses nachzubauen.

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“