Page 8 of 12

Re: Toon app: boiler status

Posted: Sat Sep 22, 2018 8:44 pm
by madpatrick
Hi,

I'm not able to install the app Boilerstatus on (rooted) Toon2.
Unfortunately i don't see an error or other message.

firmware : 4.19.10
toonstore : 2.0.1

Re: Toon app: boiler status

Posted: Sat Sep 22, 2018 8:51 pm
by TheHogNL
Did you also try a manual install (so not use toonstore?)

Re: Toon app: boiler status

Posted: Sat Sep 22, 2018 9:00 pm
by madpatrick
TheHogNL wrote:Did you also try a manual install (so not use toonstore?)
No, but i saw the reply from Toonz on my other post (domoticaforum.eu/viewtopic.php?f=101&am ... =30#p87585) he has the same problem.

Re: Toon app: boiler status

Posted: Sun Sep 23, 2018 5:11 pm
by Toonz
Hi all,

boilerstatus version 1.0.4 is available on ToonStore.

Changelog:
- installer and the Tile layout (reformatted) are now compatible with Toon 2.
no need to update for Toon 1 users (can't harm either)

Kind regardz,

Toonz

Re: Toon app: boiler status

Posted: Sun Sep 23, 2018 6:57 pm
by madpatrick
Toonz wrote:Hi all,

boilerstatus version 1.0.4 is available on ToonStore.

Changelog:
- installer and the Tile layout (reformatted) are now compatible with Toon 2.
no need to update for Toon 1 users (can't harm either)

Kind regardz,

Toonz
Great !!
Can you update ToonRepo.xml, because it is not available in the toonstore

Re: Toon app: boiler status

Posted: Sun Sep 23, 2018 7:23 pm
by Toonz
Press the refresh button.....

Re: Toon app: boiler status

Posted: Sun Sep 23, 2018 7:54 pm
by madpatrick
Installed !!

Re: Toon app: boiler status

Posted: Thu Oct 25, 2018 11:30 pm
by BOverdevest
Hi, great app!

In the Toon2, which i installed today I saw several items i would like to pull into Domoticz. (maybe also available in Toon1?)
Could these be added to the boiler app?

- Humidity (not a boiler property...)
- Boiler Max Temperature set point and degrees/hour increase allowed (Setting Verwarmingsinstallatie)
- warm water settings

Though humidity might be better placed in http://<ToonIP>/happ_thermstat?action=getThermostatInfo

Re: Toon app: boiler status

Posted: Fri Oct 26, 2018 9:17 am
by TheHogNL
BOverdevest wrote:Hi, great app!

Though humidity might be better placed in http://<ToonIP>/happ_thermstat?action=getThermostatInfo
Ask Eneco to do that :-) we can't modify that code.

Re: Toon app: boiler status

Posted: Fri Oct 26, 2018 1:05 pm
by Rudolf
Could writing a similar app that exposes the same thermostat (and additional) data via a web-page (just like boilerstatus) be a feasable solution?

Not sure how to gather the additional data from the Toon(2) though, might need some pointers on that before I start hacking something together.

Re: Toon app: boiler status

Posted: Fri Oct 26, 2018 1:12 pm
by Toonz
Basically all data available in the rra databases can be queried via Toon's own webserver (that's how the boiler app get its data as well).
Humidity is not stored in the rra databases as far as I know but that needs to be checked to be sure.

Re: Toon app: boiler status

Posted: Sun Nov 25, 2018 8:19 pm
by Ierlandfan
If I want to add more values to boilervalues.txt then I have to change BoilerstatusApp.qml right?
Probably need to extend the switch statement to include the names. (Among some other changes)
Something I not really get is the fact that the names in the switch differ from the config_hcb_rrd.xml. Can you explain that?
For example:

Code: Select all

 case "boilerInTemp":
boilerInTemp = resultValue;;
But the name, according to config_hcb_rrd.xml is "thermstat_boilerRetTemp" so I am little confused which name to use.
Can you clarify?

Re: Toon app: boiler status

Posted: Sun Nov 25, 2018 9:47 pm
by Toonz
You need to change BoilerstatusApp.qml indeed.
I changed the names from the rra files to make these a bit more user friendly in the JSON file, that's all.
Feel free to add more names (happy to publish a new version in ToonStore when you are done :-) )

Re: Toon app: boiler status

Posted: Mon Nov 26, 2018 12:58 am
by Ierlandfan
I figured out where the conversion is done,
Here's my modified code. I only changed BoilerstatusApp.qml to write more values to boilervalues.txt.
For some reason the extended values aren't populated (Besides the default 0.1 value) Eventhough for example
http://192.168.1.11/hcb_rrd?action=getR ... llForNaN=1
Gives me output: ( The output is a few lines longer but for this example I just pasted the beginning and the end)

{ "28-10-2018 02:00:00": 11565.00,"29-10-2018 01:00:00": 11569.00,"30-10-2018 01:00:00": 11573.00,"31-10-2018 01:00:00": 11577.00,"
"25-11-2018 01:00:00": 11583.00,"26-11-2018 01:00:00": 11589.00,"27-11-2018 01:00:00": 11591.00}
Output in boilervalues.txt:

Code: Select all

{"sampleTime":"26-11-2018 13:18:00","boilerSetpoint":83.65,"roomTempSetpoint":22.5,"boilerPressure":1.39,"roomTemp":21.36,"boilerOutTemp":34,"boilerInTemp":28,"boilerModulationLevel":0,"boilerOperationMode":1,"boilerInternalSetpoint":22.5,"thermostatOffset":0,"boilerHotWaterBurnerHours":0.1,"boilerBurnerHours":0.1,"boilerPumpStarts":0.1,"boilerSuccessfullBurnerStarts":0.1,"boilerFailedBurnerStarts":0,"boilerHotWaterBurnerStarts":0.1,"boilerHeatingFactor":3.06}
Here's the modified BoilerstatusApp.qml:

Code: Select all

import QtQuick 1.1
import qb.components 1.0
import qb.base 1.0

/*
 * BoilerstatusApp.qml
 *
 * Toon application for boiler parameters display.
 * data is retrieved from the rra databases (used to be happ_thermstat)
 *
 * 20170117: marcelr, first draft
 * 20180118: Toonz, rewritten to use rra database as datasource
 */

App {
    id: boilerStatusApp
    
   
    property url tileUrl : "BoilerstatusTile.qml"
    property url thumbnailIcon: "./drawables/boilerstatus.png"

    /* boiler status parameters */

    property real boilerSetpoint
    property real roomTempSetpoint
    property real boilerPressure
    property real roomTemp
    property real boilerOutTemp
    property real boilerInTemp
    property real boilerOperationMode
    property real boilerInternalSetpoint
    property real thermostatOffset
    property real boilerHotWaterBurnerHours
    property real boilerBurnerHours
    property real boilerPumpStarts
    property real boilerSuccessfullBurnerStarts
    property real boilerFailedBurnerStarts
    property real boilerHotWaterBurnerStarts
    property real boilerHeatingFactor
    property real boilerModulationLevel : 1
    property string sampleTime
    property bool showPressureInDimState : true
    property string fullDateStr
 
    property string ipToon : "127.0.0.1"  //can put any external Toon ip address as well for testing purposes
   
    function init() {
	registry.registerWidget( "tile", tileUrl, this, null, 
				 { thumbLabel: qsTr("Ketel status"), 
				   thumbIcon: thumbnailIcon, 
				   thumbCategory: "general", 
				   thumbWeight: 30, 
				   baseTileWeight: 10, 
				   thumbIconVAlignment: "center" } );
	}

	Component.onCompleted: {
 		datetimeTimer.start();
		readDefaults();
	}

	function readDefaults() {
		var doc4 = new XMLHttpRequest();
		doc4.onreadystatechange = function() {
			if (doc4.readyState == XMLHttpRequest.DONE) {
				if (doc4.responseText.length > 2) {
					showPressureInDimState = (doc4.responseText == "true");
				}
			}
		}  		
		doc4.open("GET", "file:///HCBv2/qml/apps/boilerstatus/showPressureInDimState.txt", true);
		doc4.send();
	}

	function saveShowPressureInDimState() {

   		var doc2 = new XMLHttpRequest();
		doc2.open("PUT", "file:///HCBv2/qml/apps/boilerstatus/showPressureInDimState.txt");
		doc2.send(showPressureInDimState);
	}

    function getBoilerParameter(loggerName, variableName) {
	
	var xmlhttp = new XMLHttpRequest();
	var infoJson = {};
	var resultValue = 0.1;

	xmlhttp.onreadystatechange = function() {
		if  ( xmlhttp.readyState == 4 ) {
			if  ( xmlhttp.status == 200  ) {

		   		infoJson = JSON.parse( xmlhttp.responseText );
				for (var props in infoJson ) {
					resultValue = parseFloat(infoJson [props]);  //only interested in the last one == most recent
					sampleTime = props;
				}
				switch(variableName) {
					case "boilerSetpoint":
						boilerSetpoint = resultValue;
						break;
					case "roomTempSetpoint":
						roomTempSetpoint = resultValue;
						break;
					case "boilerPressure":
						boilerPressure = resultValue;
						break;
					case "roomTemp":
						roomTemp = resultValue;
						break;
					case "boilerOutTemp":
						boilerOutTemp = resultValue;
						break;
					case "boilerInTemp":
						boilerInTemp = resultValue;
						break;
				        case "boilerOperationMode":
  				                boilerOperationMode = resultValue;
  						break;
					case "boilerInternalSetpoint":
  						boilerInternalSetpoint = resultValue;
  						break;
					case "thermostatOffset":
  						thermostatOffset = resultValue;
  						break; 
					case "boilerHotWaterBurnerHours":
  						boilerHotWaterBurnerHours = resultValue;
  						break; 
					case "boilerBurnerHours":
  						boilerBurnerHours = resultValue;
  						break; 
					case "boilerPumpStarts":
  						boilerPumpStarts = resultValue;
  						break; 
					case "boilerSuccessfullBurnerStarts":
  						boilerSuccessfullBurnerStarts = resultValue;
  						break; 
					case "boilerFailedBurnerStarts":
  						boilerFailedBurnerStarts = resultValue;
  						break; 
					case "boilerHotWaterBurnerStarts":
						boilerHotWaterBurnerStarts = resultValue;
					  	break; 
					case "boilerHeatingFactor":
  						boilerHeatingFactor = resultValue;
  						break;
					default:
						break;
				}
			}
	    	}
	}
	xmlhttp.open( "GET", "http://" + ipToon + "/hcb_rrd?action=getRrdData&loggerName=" + loggerName + "&rra=30days&readableTime=1&nullForNaN=1&from=" + fullDateStr, true );
	xmlhttp.send();
    }

    function getThermostatInfo() {
	
	var xmlhttp = new XMLHttpRequest();
	var infoJson = {};
	var resultValue = 0.1;

	xmlhttp.onreadystatechange = function() {
		if  ( xmlhttp.readyState == 4 ) {
			if  ( xmlhttp.status == 200  ) {
		   		infoJson = JSON.parse( xmlhttp.responseText );
				boilerModulationLevel = parseFloat(infoJson ["currentModulationLevel"]);
				writeBoilerValues();
			}
	    	}
	}
	xmlhttp.open( "GET", "http://" + ipToon + "/happ_thermstat?action=getThermostatInfo", true );
	xmlhttp.send();
    }
      
	function writeBoilerValues() {
		var infoJSson = {};
		infoJSson["sampleTime"] = sampleTime;
		infoJSson["boilerSetpoint"] = boilerSetpoint;
		infoJSson["roomTempSetpoint"] = roomTempSetpoint;
		infoJSson["boilerPressure"] = boilerPressure;
		infoJSson["roomTemp"] = roomTemp;
		infoJSson["boilerOutTemp"] = boilerOutTemp;
		infoJSson["boilerInTemp"] = boilerInTemp;
		infoJSson["boilerModulationLevel"] = boilerModulationLevel;
                infoJSson["boilerOperationMode"] = boilerOperationMode;
		infoJSson["boilerInternalSetpoint"] = boilerInternalSetpoint;
		infoJSson["thermostatOffset"] = thermostatOffset;
		infoJSson["boilerHotWaterBurnerHours"] = boilerHotWaterBurnerHours;
		infoJSson["boilerBurnerHours"] = boilerBurnerHours;
		infoJSson["boilerPumpStarts"] = boilerPumpStarts;
		infoJSson["boilerSuccessfullBurnerStarts"] = boilerSuccessfullBurnerStarts;
		infoJSson["boilerFailedBurnerStarts"] = boilerFailedBurnerStarts;
		infoJSson["boilerHotWaterBurnerStarts"] = boilerHotWaterBurnerStarts;
		infoJSson["boilerHeatingFactor"] = boilerHeatingFactor;
	 	var doc2 = new XMLHttpRequest();
   		doc2.open("PUT", "file:///var/volatile/tmp/boilervalues.txt");
   		doc2.send(JSON.stringify(infoJSson));
	}


    Timer {
	id: datetimeTimer
	interval: 60000  // update every minute 
	triggeredOnStart: false
	running: false
	repeat: true
	onTriggered: {
		var now = new Date().getTime() - 3000;
		fullDateStr = i18n.dateTime(now, i18n.cent_yes) + " " + i18n.dateTime(now, i18n.time_yes);
		getBoilerParameter("thermstat_realTemps", "roomTemp");
		getBoilerParameter("thermstat_boilerRetTemp", "boilerInTemp");
		getBoilerParameter("thermstat_boilerTemp", "boilerOutTemp");
		getBoilerParameter("thermstat_boilerSetpoint", "boilerSetpoint");
		getBoilerParameter("thermstat_boilerChPressure", "boilerPressure");
		getBoilerParameter("thermstat_setpoint", "roomTempSetpoint");
                getBoilerParameter("thermstat_outsideRate", "boilerOutsideRate");
		getBoilerParameter("thermstat_boilerOpMode", "boilerOperationMode");
		getBoilerParameter("thermstat_internalSetpoint", "boilerInternalSetpoint");
		getBoilerParameter("thermstat_longTermOffset", "ThermostatOffset");
		getBoilerParameter("thermstat_boilerDhwBurnerHours", "boilerHotWaterBurnerHours");
		getBoilerParameter("thermstat_boilerBurnerHours", "boilerBurnerHours");
		getBoilerParameter("thermstat_boilerPumpStarts", "boilerPumpStarts");
		getBoilerParameter("thermstat_boilerSuccesfulBurnerStarts", "boilerSuccessfullBurnerStarts");
		getBoilerParameter("thermstat_boilerFailedBurnerStarts", "boilerFailedBurnerStarts");
		getBoilerParameter("thermstat_dhwBurnerStarts", "boilerHotWaterBurnerStarts");
		getBoilerParameter("thermstat_heatingFactor", "boilerHeatingFactor");
                getThermostatInfo();
	
                }
	}
}

Re: Toon app: boiler status

Posted: Sat Dec 01, 2018 4:25 pm
by Rudolf
Is 'boilerOperationMode' 2.0 when Dhw is being used?

I'd like to enable my fan when this is true for some time (over a minute).
Any other values I should look into?