EnergieID / smappy

Python client for Smappee
MIT License
21 stars 8 forks source link

Additional local smappee REST API #16

Open stefferber opened 7 years ago

stefferber commented 7 years ago

With Google Chrome I was able to find additional details in:

advancedpublic.html
configpublic.html
commandcontrolpublic.html
waveformdisplay.html
logbrowser.html
stefferber commented 7 years ago

snipplet from advancedpublic.html

        var baseURL = "/gateway/apipublic";

        $(document).ready(function(){
            loadConfig();
        });

        function resetActivePowerPeaks() {
            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/resetActivePowerPeaks";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("resetActivePowerPeaks success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("resetActivePowerPeaks error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
             }      

        }

        function resetIPScanCache() {
            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/resetIPScanCache";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("resetIPScanCache success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("resetIPScanCache error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
             }      

        }

        function resetSensorCache() {
            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/resetSensorCache";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("resetSensorCache success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("resetSensorCache error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
             }      

        }

        function clearData() {

            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/clearData";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("clearData success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("clearData error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
             }
        }

        function clearAppliances() {

            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/clearAppliances";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("clearAppliances success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("clearAppliances error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
             }
        }

        function restartSmappee() {

            if (!authenticated) setHeaderError("Error not authenticated. Use Logon first!");
            else {

            var url = baseURL + "/restartSmappee?action=2";
            $.ajax(
                    {
                         async : true,
                         type:'GET',
                         contentType: 'application/json',
                         url: url,
                         data: '',
                         dataType: 'son',

                         success: function(data) {  
                            if (data.error) {
                                $("#advanced").hide();
                                setHeaderError(data.error);
                            }
                            else {
                                $("#advanced").show();
                                console.log("restartSmappee success");
                                setHeader("Advanced Smappee tools...");
                                setContentInfo(data.content);
                                setHeaderSuccess(data.response);
                            }   
                         },

                         error: function(data) {   
                             console.log("ledcontrol error");
                             alert("Error, "+data.responseText);
                         }
                     }
                 ); 
            }
        }

        function loadConfig() {
            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data:"load",
                         dataType: 'son',

                         success: function(models) {  
                            console.log("config load success");
                            setHeader("Monitor configuration");
                            if (models.error) {
                                setHeaderError(models.error);
                            }
                            else {

                                for (var i = 0; i < models.length; i++) {
                                    var logRecord = models[i];
                                    if (logRecord.key == "webPortalPassword") $("#webPortalPassword").val(logRecord.value);
                                    if (logRecord.key == "activePowerLimitHigh") $("#activePowerLimitHigh").val(logRecord.value);
                                    if (logRecord.key == "activePowerLimitLow") $("#activePowerLimitLow").val(logRecord.value);
                                    if (logRecord.key == "mdnsHostName") $("#mdnsHostName").val(logRecord.value);
                                    if (logRecord.key == "kWhDayBegin") $("#kWhDayBegin").val(logRecord.value);
                                    if (logRecord.key == "kWhDayEnd") $("#kWhDayEnd").val(logRecord.value);
                                    if (logRecord.key == "kWhNightBegin") $("#kWhNightBegin").val(logRecord.value);
                                    if (logRecord.key == "kWhNightEnd") $("#kWhNightEnd").val(logRecord.value);
                                    if (logRecord.key == "solarBegin") $("#solarBegin").val(logRecord.value);
                                    if (logRecord.key == "solarEnd") $("#solarEnd").val(logRecord.value);
                                    if (logRecord.key == "enableGreenBreathing") {
                                        if (logRecord.value=="1") {
                                            $('input:checkbox[name=enableGreenBreathing]')[0].checked = true;
                                        }
                                        else {
                                            $('input:checkbox[name=enableGreenBreathing]')[0].checked = false;
                                        }   
                                    }
                                    if (logRecord.key == "enableLookAheadScheduleRecover") {
                                        if (logRecord.value=="1") {
                                            $('input:checkbox[name=enableLookAheadScheduleRecover]')[0].checked = true;
                                        }
                                        else {
                                            $('input:checkbox[name=enableLookAheadScheduleRecover]')[0].checked = false;
                                        }   
                                    }

                                    if (logRecord.key == "enableMacAddressScanning") {
                                        if (logRecord.value=="1") {
                                            $('input:checkbox[name=enableMacAddressScanning]')[0].checked = true;
                                            $("#arpScanParameters").parents("tr").show();
                                        }
                                        else {
                                            $('input:checkbox[name=enableMacAddressScanning]')[0].checked = false;
                                            $("#arpScanParameters").parents("tr").hide();
                                        }   
                                    }           

                                    if (logRecord.key == "arpScanParameters") $("#arpScanParameters").val(logRecord.value);

                                }

                            }                           

                         },

                         error: function(data) {   
                             console.log("config load error");
                             alert("Error, "+data.response);
                         }
                     }
                 ); 

        }

        function updateAndRestartEMeter() {

            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,

                         data:"save,webPortalPassword="+$("#webPortalPassword").val()+",arpScanParameters="+encodeURIComponent($("#arpScanParameters").val())+",mdnsHostName="+$("#mdnsHostName").val()+",activePowerLimitLow="+$("#activePowerLimitLow").val()+",activePowerLimitHigh="+$("#activePowerLimitHigh").val(),

                         dataType: 'son',

                         success: function(data) {  
                            clearRefreshInterval();
                            console.log("config save success");
                            setHeader(data.header);
                            if (data.errror) setHeaderError(data.error);
                            if (data.success) setHeaderSuccess(data.success);
                         },

                         error: function(data) {   
                             console.log("config save error");
                             alert("Error, "+data.response);
                         }
                     }
                 ); 
        }

        function autoCommissioningValidation(command) {

            updateMeterIndexes();

            console.log("stopAutoCommissioningValidation: "+command);

            var url = baseURL + "/advancedConfigPublic";

            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,

                         data:""+command+"",

                         dataType: 'son',

                         success: function(data) {  
                            console.log("config save success");
                            setHeader(data.header);
                            if (data.errror) setHeaderError(data.error);
                            if (data.success) setHeaderSuccess(data.success);
                         },

                         error: function(data) {   
                             console.log("config save error");      
                             alert("Error, "+data.response);
                         }
                     }
                 );         
        }

        function restartAutoCommissioningCyclus(command) {

            updateMeterIndexes();

            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,

                         data:""+command+"",

                         dataType: 'son',

                         success: function(data) {  
                            console.log("config save success");
                            setHeader(data.header);
                            if (data.errror) setHeaderError(data.error);
                            if (data.success) setHeaderSuccess(data.success);
                         },

                         error: function(data) {   
                             console.log("config save error");
                             alert("Error, "+data.response);
                         }
                     }
                 );         

        }

        function updateMeterIndexes() {
            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"updateMeterIndexes,kWhDayBegin="+$("#kWhDayBegin").val()+",kWhDayEnd="+$("#kWhDayEnd").val()+",kWhNightBegin="+$("#kWhNightBegin").val()+",kWhNightEnd="+$("#kWhNightEnd").val()+",solarBegin="+$("#solarBegin").val()+",solarEnd="+$("#solarEnd").val(),

                     dataType: 'son',

                     success: function(data) {  
                        clearRefreshInterval();
                        console.log("config save success");
                        setHeader(data.header);
                        if (data.errror) setHeaderError(data.error);
                        if (data.success) setHeaderSuccess(data.success);
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             );         
        }

        function enableGreenBreathing() {

            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"saveWithoutRestarting,enableGreenBreathing="+$("#enableGreenBreathing").prop("checked"),
                     dataType: 'son',

                     success: function(models) {  
                        console.log("enableGreenBreathing");

                                    if (models.error) {
                                        setHeaderError(models.error);
                                    }
                     },

                     error: function(data) {   
                         console.log("enableGreenBreathing error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }

        function enableLookAheadScheduleRecover() {

            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"saveWithoutRestarting,enableLookAheadScheduleRecover="+$("#enableLookAheadScheduleRecover").prop("checked"),
                     dataType: 'son',

                     success: function(models) {  
                        console.log("enableLookAheadScheduleRecover");

                                    if (models.error) {
                                        setHeaderError(models.error);
                                    }
                     },

                     error: function(data) {   
                         console.log("enableLookAheadScheduleRecover error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }
        function enableMacAddressScanning() {

            var url = baseURL + "/advancedConfigPublic";
            $.ajax(
                    {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"saveWithoutRestarting,enableMacAddressScanning="+$("#enableMacAddressScanning").prop("checked"),
                     dataType: 'son',

                     success: function(models) {  
                        console.log("enableMacAddressScanning");

                                    if (models.error) {
                                        setHeaderError(models.error);
                                    }
                     },

                     error: function(data) {   
                         console.log("enableMacAddressScanning error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }

    </script>

  </head>
stefferber commented 7 years ago

snipplet from configpublic.html

    function refreshInstantaneous(){

            $("#wfuDiv").hide();

            var url = baseURL + "/instantaneous";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data:"loadInstantaneous",
                         dataType: 'son',

                         success: function(models) {  

                            setHeader("Monitor configuration");
                            if (models.error) {
                                setHeaderError(models.error);
                            }

[...]

            var url = baseURL + "/configPublic";
            $.ajax(
                    {
                         async : true,
                         type:'POST',
                         contentType: 'application/json',
                         url: url,
                         data:"load",
                         dataType: 'son', 

                         success: function(models) {  
                            console.log("config load success");
                            setHeader("Monitor configuration");
                            if (models.error) {
                                setHeaderError(models.error);

                            }

[...]

            var url = baseURL + "/configPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

data:"save,currentReverser0="+$("#currentReverser0").prop("checked")+",currentReverser1="+$("#currentReverser1").prop("checked")+",currentReverser2="+$("#currentReverser2").prop("checked")+",currentReverser3="+$("#currentReverser3").prop("checked")+",currentReverser4="+$("#currentReverser4").prop("checked")+",currentReverser5="+$("#currentReverser5").prop("checked")+",autoDetection="+$("#autoDetection").prop("checked")+",solarCTConfig="+$('input[name=solarCTConfig]:radio:checked').val()+",singleVoltageShift="+$('input[name=singleVoltageShift]:radio:checked').val()+",mainsFrequency="+$('input[name=mainsFrequency]:radio:checked').val()+",emeterConfiguration="+emeterConfigurationState+",phaseMapping="+getPhaseMapping()+",3PhaseConfig="+$('input[name=3PhaseConfig]:radio:checked').val(),

                     dataType: 'son',

                     success: function(data) {  
                        testConfigUsed=false;
                        //clearRefreshInterval();
                        console.log("config save success");
                        setHeader(data.header);
                        if (data.errror) setHeaderError(data.error);
                        if (data.success) {
                            //setHeaderSuccess(data.success);

                            $('#contentArea').empty();
                            $('#contentArea').load('configpublic.html');
                            pleaseWaitApp.hidePleaseWait();

                        }
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
stefferber commented 7 years ago

snipplet from commandcontrolpublic.html

        function loadConfig() {
            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,
                     data:"load",
                     dataType: 'json',

                     success: function(models) {  

                        $("#commandControlDiv").show();

                        console.log("config load success");
                        setHeader("Monitor configuration");
                           if (models.error) {
                            setHeaderError(models.error);
                            $("#commandControlDiv").hide();
                           }
                           else {

                                $("#commandControlDiv").show();
                               buildControls(models);
                        }                           

                     },

                     error: function(data) {   
                         console.log("config load error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }

        function buildControls(models) {

            //******************************************************* AngulerJs begin *******************************************************
            // call the function in the controller scope to control the view
            angular.element($('#controlDiv')).scope().bind(models);
            angular.element($('#controlDiv')).scope().$apply();

            //angular.element($('#controlDivTimed')).scope().bind(models);
            //angular.element($('#controlDivTimed')).scope().$apply();
            //******************************************************* AngulerJs end *******************************************************

        }

        function sendGroup() {
            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"controlGroup",

                     dataType: 'json',

                     success: function(data) {  
                        console.log("control onOff success");
                        setHeader(data.header);
                        if (data.errror) setHeaderError(data.error);
                        if (data.success) setHeaderSuccess(data.success);
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             );         
        }

        function onOffCommandControl(val) {

            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"control,controlId="+val.id,

                     dataType: 'json',

                     success: function(data) {  
                        console.log("control onOff success");
                        setHeader(data.header);
                        if (data.errror) setHeaderError(data.error);
                        if (data.success) setHeaderSuccess(data.success);
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }

        function addCommandControl() {
            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"add,identifier="+$("#identifierChar").val()+$("#identifierNum").val()+",description="+$("#description").val()+",type="+$("#commandControlType").val(),

                     dataType: 'json',

                     success: function(models) {  
                        console.log("add success");
                        if (models.error) {
                           setHeaderError(models.error);
                        }
                        else {
                           buildControls(models);
                        }
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 

        }

        function deleteCommandControl(val) {
            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"delete,controlId="+val.id,

                     dataType: 'json',

                     success: function(models) {  
                        console.log("delete success");
                        if (models.error) {
                           setHeaderError(models.error);
                        }
                        else {
                           buildControls(models);
                        }
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 

        }       
        function deleteCommandControlTimers(val) {
            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"deleteTimers,controlId="+val.id,

                     dataType: 'json',

                     success: function(models) {  
                        console.log("delete success");
                        if (models.error) {
                           setHeaderError(models.error);
                        }
                        else {
                           buildControls(models);
                        }
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 

        }           
        function addCommandControlTimed() {

            var selectedControl = $("#commandControlTypeTimed").val();

            var url = baseURL + "/commandControlPublic";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,

                     data:"addTimed,commandControlId="+$("#commandControlTypeTimed").val()+",hour="+$("#hour").val()+",min="+$("#min").val()+",day="+$("#day").val()+",act="+$("#act").val(),

                     dataType: 'json',

                     success: function(models) {  
                        console.log("add success");
                        if (models.error) {
                           setHeaderError(models.error);
                        }
                        else {
                           buildControls(models);
                           $("#commandControlTypeTimed").val(selectedControl);
                        }
                     },

                     error: function(data) {   
                         console.log("config save error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 

        }
stefferber commented 7 years ago

snipplet from waveformdisplay.html

        function loadWaveform() {

            buildWaveformFilter();

            var url = baseURL + "/waveformDisplay";
            $.ajax(
                {
                     async : true,
                     type:'POST',
                     contentType: 'application/json',
                     url: url,
                     data:"load,"+waveformFilter,
                     dataType: 'son',

                     success: function(models) {  
                         buildVoltageGraph(models.voltageGraphData);
                         buildCurrentGraph(models.currentGraphData);
                     },

                     error: function(data) {   
                         console.log("config load error");
                         alert("Error, "+data.response);
                     }
                 }
             ); 
        }
stefferber commented 7 years ago

snipplet from logbrowser.html

    $(document).ready(function() {
        //logFileList();
        angular.element($('#controlDiv')).scope().logFileList();
    });

    var root='';    

    (function() {
        var app = angular.module('logBrowserApp', []);

        app.controller('logBrowserController', function ($scope, $http, $log) {

            $scope.logFileList = function() {

                $http({
                       method: 'POST',
                       url: root+'/gateway/apipublic/logBrowser',
                       data: 'logFileList',
                       headers: {
                           'Content-Type': 'application/json'

                       }
                    }).then(function successCallback(response) {
                        $log.log(response.data);
                        if (response.data.error) {
                            alert(response.data.error);
                        }
                        else {
                            $scope.logFileList = response.data;
                        }

                    }, function errorCallback(response) {
                        alert("Error requesting data..."+response);
                        $log.log(response);
                    });     
            }

            $scope.logFileSelect = function(logFile) {
                $http({
                       method: 'POST',
                       url: root+'/gateway/apipublic/logBrowser',
                       data: 'logFileSelect,'+logFile,
                       headers: {
                           'Content-Type': 'application/json'
                       }
                    }).then(function successCallback(response) {

                        if (response.data.error) {
                            alert(response.data.error);
                        }
                        else {
                            var link = document.createElement("a");
                            link.download = response.data.logFileName;
                            if (logFile.indexOf("/")==0) {
                                link.href = logFile; // smappee
                            }
                            else {
                                link.href = "/"+logFile; // windows and mac testing
                            }
                            link.click();
                        }
                    }, function errorCallback(response) {
                        alert("Error requesting data..."+response);
                        $log.log(response);
                    }); 

            }

        });

    })();
JrtPec commented 7 years ago

I have added basically all functions listed above (except for refreshInstantaneous, which is identical to loadInstantaneous)

Check them out in f80b59c

All are untested, because I don't own a Smappee in my own local network.

The more complex calls, which require many input values that I don't know or don't understand yet, are added as placeholders and will raise a NotImplementedError.

@stefferber would you like to test some?