Page 1 of 1

Calculate with custom.js

Posted: Tuesday 21 April 2020 9:27
by KillerBENL
Hello all,

I want to know if it's possible to calculate with different block values and after that change the color of a block.
For example, if the value returned to grid(solar) is higher then used from grid, I want to change the color of the block "returned to grid" green. If I'm using more from the grid then solar is delivering I want to change the color of the block "used from grid" red.

Hope someone can help me in this....

Re: Calculate with custom.js

Posted: Tuesday 21 April 2020 10:20
by Lokonli
Example for a P1 smart meter.

First switch to the Dashticz beta branch.

Code: Select all

git checkout beta
git pull
My P1 smart meter has domoticz ID 43. My column definition is as follows:

Code: Select all

columns[4]['blocks'] = ['43_1', ]
This will show subdevice 1 of the P1 smart meter, which is the actual energy usage.

Then add the following to custom.js:

Code: Select all

 function getStatus_43_1(block) {
     var deliv = block.device.UsageDeliv;
     if (parseFloat(deliv) > 0) {
         block.icon = 'fas fa-sun'
         block.addClass = 'deliver'
     } else {
         block.icon = 'fas fa-plug';
         block.addClass = ''
     }
 }
The previous example changes the icon and applies a custom css class ('deliver') in case you deliver power to the grid.

You can define the deliver css class in custom.css:

Code: Select all

.mh.deliver {
    border-color: green
}
This will give a green border to the block.
Annotation 2020-04-21 101826.jpg
Annotation 2020-04-21 101826.jpg (7.51 KiB) Viewed 620 times

Re: Calculate with custom.js

Posted: Tuesday 21 April 2020 10:27
by KillerBENL
Lokonli,

Thanks for the quick response. I'm already using this option.
I want to go a step further and use 2 block values to compare, the result then used to change a block.

Re: Calculate with custom.js

Posted: Tuesday 21 April 2020 10:54
by Lokonli
KillerBENL wrote: Tuesday 21 April 2020 10:27 Lokonli,

Thanks for the quick response. I'm already using this option.
I want to go a step further and use 2 block values to compare, the result then used to change a block.
You have some js coding skills?

The function Domoticz.getAllDevices() return an array with all Domoticz devices.
With the function Dashticz.setBlock() you can update certain block settings.

You could add some code to the afterGetDevices function in custom.js, which will be called at every device update.
You have to do some debugging yourself, but it could look as follows:

Button example in CONFIG.js:

Code: Select all

blocks['custom'] = {
	title: 'not available yet ...'
}
and custom.js:

Code: Select all

function afterGetDevices() {

     var devices = Domoticz.getAllDevices();
     var device1=devices[123];
     var device2=devices[124];
     var value1=parseFloat(device1.Data);  //maybe you want to use a different field 
     var value2=parseFloat(device2.Data); //maybe you want to use a different field 
     var diff = value2 - value1;
     var newClass = '';
     if (diff>0) newClass = 'danger';
     Dashticz.setBlock('custom', { title: diff, addClass: newClass} );
 }
 
This will change the title for button 'custom' and applies a new class in case the difference between the two values is positive.

Again: I did not test this.
Let me know if you have something working, and then I'll add it as example to the documentation.

Re: Calculate with custom.js

Posted: Tuesday 21 April 2020 20:23
by KillerBENL
Thanx. It's working now

function afterGetDevices(){
var devices = Domoticz.getAllDevices();
var power=devices[108];
var value1=parseFloat(power.CounterDelivToday);
var value2=parseFloat(power.CounterToday);
var diff = value2 - value1;

if (diff > 0) { $('.block_108_2').addClass('warningred'); }
else { $('.block_108_5').addClass('warninggreen'); }
}

Re: Calculate with custom.js

Posted: Wednesday 22 April 2020 8:11
by KillerBENL
I have another question about custom.js.

Is it possible to change the value of a block? My temperature device is 0.5 degrees off because it's hanging in the wrong place. Can I correct the value somewhere in the custom.js ?
I tried "Dashticz.setBlock(178, { value, correct} );" but this does not change the data (correct is the new value)

Re: Calculate with custom.js

Posted: Wednesday 22 April 2020 9:33
by Lokonli
Maybe it's better to adjust the temperature in Domoticz: For most temperature devices you can fill in a temperature offset in Domoticz.

In Dashticz you could also do some tricks.

If you add the getStatus_178 function to custom.js, then this function is called when device 178 is updated. This function receives 'block' as parameter, which contains 'device'.
You can modify the device data.

So this is not officially supported, may change in the future, but I think the following will work (untested ...)

Code: Select all

function getStatus_178(block) {
   var device=block.device;
    device.Temp = device.Temp+ 0.5
}

Re: Calculate with custom.js

Posted: Thursday 23 April 2020 7:25
by KillerBENL
Thanx. I'm almost there. I've another question. (sry)
Is there a possibility to change title with text and values?
example: block.title = 'Temp is' valueX 'degrees';

Re: Calculate with custom.js

Posted: Thursday 23 April 2020 8:59
by lzwfkv
Yes, it is possible:
block.title = 'Temp is: ' + valueX + ' degrees'

Re: Calculate with custom.js

Posted: Thursday 23 April 2020 9:23
by Lokonli
KillerBENL wrote: Thursday 23 April 2020 7:25 Thanx. I'm almost there. I've another question. (sry)
Is there a possibility to change title with text and values?
example: block.title = 'Temp is' valueX 'degrees';
Try:

Code: Select all

function getStatus_178(block) {
   var device=block.device;
    block.title = 'Temp is ' + device.Temp + ' degrees';
}