Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADDIN without reaction #192

Open
Super-Harry opened this issue Jan 6, 2021 · 2 comments
Open

ADDIN without reaction #192

Super-Harry opened this issue Jan 6, 2021 · 2 comments

Comments

@Super-Harry
Copy link

Super-Harry commented Jan 6, 2021

Hi,

I changed something in the Thermostat ADD-In. Everything's looked good. I had reaction from KNX and also from HK.
I reinstalled the whole Homebridge and after that I don't get reaction from the KNX. (No entiries in the Protocol.)
I can't find my issue.
Could it be the permission of the Homebridge-user?

Many thanks in advance for your help.

This is my modified addins

/* ThermostatMode
 * 
 */
'use strict';

/**
 * @type {HandlerPattern}
var HandlerPattern = require('./handlerpattern.js');
var log = require('debug')('ThermostatMode');

/**
 * @class A custom handler for a ThermostatMode
 * @extends HandlerPattern
 */
class ThermostatMode extends HandlerPattern {


	/*******************************************************************************************************************
	 * onKNXValueChange is invoked if a Bus value for one of the bound addresses is received
	 * 
	 */
	onKNXValueChange(field, oldValue, knxValue) {
		// set LocalConstants
		this.debugName = this.myAPI.getLocalConstant("debugName");
		this.mode = this.myAPI.getLocalConstant("mode");
		this.tempsetting = this.myAPI.getLocalConstant("tempsetting");
		this.knxheatingon = this.myAPI.getLocalConstant("knxheatingon");
		this.basetemp = this.myAPI.getLocalConstant("basetemp");

		console.log('INFO ' + this.debugName + ': on KNX Value Change(' + field + ", old="+ oldValue + ", new="+ knxValue+ ")");

		if (field === "CurrentTemperature") {
			//Just set the value accordingly
			this.myAPI.setValue("CurrentTemperature", knxValue);
		} else if (field === "TargetTemperature") {
			//Just set the value accordingly
			this.myAPI.setValue("TargetTemperature", knxValue);
		} else if (field === "KNXHeatingCooling" && this.mode === "overknx") {
			//Just set the value accordingly

			// knx-heating on
			this.knxheatingon = this.myAPI.getLocalConstant("knxheatingon");

			if (knxValue === this.knxheatingon) {
				this.myAPI.setValue("CurrentHeatingCoolingState", 1);
				this.myAPI.setValue("TargetHeatingCoolingState", 1);
			} else {
				this.myAPI.setValue("CurrentHeatingCoolingState", 2);
				this.myAPI.setValue("TargetHeatingCoolingState", 2);
			}
		}

		var myCurrentTemperature = this.myAPI.getValue("CurrentTemperature");
		var myTargetTemperature = this.myAPI.getValue("TargetTemperature");

		// The value property of CurrentHeatingCoolingState must be one of the following:
		// Characteristic.CurrentHeatingCoolingState.OFF = 0;
		// Characteristic.CurrentHeatingCoolingState.HEAT = 1;
		// Characteristic.CurrentHeatingCoolingState.COOL = 2;

		if (this.mode === "heating"){
			if (myCurrentTemperature < myTargetTemperature) {
				this.myAPI.setValue("CurrentHeatingCoolingState", 1);
				this.myAPI.setValue("TargetHeatingCoolingState", 1);
			} else {
				this.myAPI.setValue("CurrentHeatingCoolingState", 0);
				this.myAPI.setValue("TargetHeatingCoolingState", 0);
			}
		} else if (this.mode === "cooling"){
			if (myCurrentTemperature > myTargetTemperature) {
				this.myAPI.setValue("CurrentHeatingCoolingState", 2);
				this.myAPI.setValue("TargetHeatingCoolingState", 2);
			} else {
				this.myAPI.setValue("CurrentHeatingCoolingState", 0);
				this.myAPI.setValue("TargetHeatingCoolingState", 0);
			}
		} 
		else if (this.mode === "auto"){
			// in iOS 13, setting temperature is only enabled if device is "on" -> set to auto 
			this.myAPI.setValue("TargetHeatingCoolingState", 3);
		}

	} // onBusValueChange
	
	/*******************************************************************************************************************
	 * onHKValueChange is invoked if HomeKit is changing characteristic values
	 * 
	 */
	onHKValueChange(field, oldValue, newValue) {

		// set LocalConstants
		this.debugName = this.myAPI.getLocalConstant("debugName");
		this.mode = this.myAPI.getLocalConstant("mode");
		this.tempsetting = this.myAPI.getLocalConstant("tempsetting");
		this.knxheatingon = this.myAPI.getLocalConstant("knxheatingon");
		this.basetemp = this.myAPI.getLocalConstant("basetemp");

		console.log("INFO " + this.debugName + ": on HK Value Change(" + field + ", old="+ oldValue + ", new="+ newValue+ "), tempsetting=" + this.tempsetting + ", mode=" + this.mode + ", knxheatingon=" + this.knxheatingon + ", basetemp=" + this.basetemp);

		if (field === "TargetTemperature") {
			//Just set the value accordingly
			// Potential extension: Set the KNX-Mode accordingly, use base-comfort-temp as config parameter

			if (this.tempsetting === "relative"){
				// Calculate and set
				var basetemp = this.basetemp;

				// upate basetemp if cooling
				if (this.mode === "cooling"){
					basetemp = basetemp + 2;
				}

				newValue = newValue - basetemp;
				newValue = newValue * 10;

				// convert signed int to unsinged int (8bit)
				if (newValue < 0 && newValue >= -127){
					newValue = -newValue + 128;
				}
				else if (newValue >= 0 && newValue <= 127){
					// do nothing
					newValue = newValue;
				}
				else if (newValue > 127) {
					newValue = 127;
				}
				else if (newValue < -127) {
					newValue = -127;
				}

				// This is actually DPT6, but this is currently not supported
				this.myAPI.knxWrite("KNXRelTemp", newValue, "DPT5");

				console.log('INFO ' + this.debugName + ': on HK Value Change(' + field + ", base="+ basetemp + ", new="+ newValue+ ")");

			} else {
				this.myAPI.knxWrite("TargetTemperature", newValue, "DPT9"); 
			}

			var myCurrentTemperature = this.myAPI.getValue("CurrentTemperature");
			var myTargetTemperature = this.myAPI.getValue("TargetTemperature");

			// The value property of CurrentHeatingCoolingState must be one of the following:
			// Characteristic.CurrentHeatingCoolingState.OFF = 0;
			// Characteristic.CurrentHeatingCoolingState.HEAT = 1;
			// Characteristic.CurrentHeatingCoolingState.COOL = 2;

			if (this.mode === "heating"){
				if (myCurrentTemperature < myTargetTemperature) {
					this.myAPI.setValue("CurrentHeatingCoolingState", 1);
					this.myAPI.setValue("TargetHeatingCoolingState", 1);
				} else {
					this.myAPI.setValue("CurrentHeatingCoolingState", 0);
					this.myAPI.setValue("TargetHeatingCoolingState", 0);
				}
			} else if (this.mode === "cooling"){
				if (myCurrentTemperature > myTargetTemperature) {
					this.myAPI.setValue("CurrentHeatingCoolingState", 2);
					this.myAPI.setValue("TargetHeatingCoolingState", 2);
				} else {
					this.myAPI.setValue("CurrentHeatingCoolingState", 0);
					this.myAPI.setValue("TargetHeatingCoolingState", 0);
				}
			} 
			else if (this.mode === "auto"){
				// in iOS 13, setting temperature is only enabled if device is "on" -> set to auto 
				this.myAPI.setValue("TargetHeatingCoolingState", 3);
			}

		} else if (field === "TargetHeatingCoolingState") {
			//Just set the value accordingly
			
			
			if (this.mode === "sendtoknx"){
				// if send to KNX is needed

				// knx-heating on
				this.knxheatingon = this.myAPI.getLocalConstant("knxheatingon");

				// Characteristic.CurrentHeatingCoolingState.COOL = 0?
				if (newValue === 0) { 
					this.mode = "cooling";
					this.myAPI.knxWrite("KNXHeatingCooling", !this.knxheatingon, "DPT1"); 
					this.myAPI.setValue("TargetHeatingCoolingState", 2);
				} else {
					// else: always heating
					this.mode = "heating";
					this.myAPI.knxWrite("KNXHeatingCooling", this.knxheatingon, "DPT1"); 
					this.myAPI.setValue("TargetHeatingCoolingState", 1);
				}
			} else if (this.mode === "auto") {
				this.myAPI.setValue("TargetHeatingCoolingState", 3);
			}
			else {
				// not allowed if not "sendtoknx" -> set back to original
				setTimeout(function(){
					console.log('INFO ' + this.debugName + ': Resetting TargetHeatingCoolingState');
					this.myAPI.setValue("TargetHeatingCoolingState", this.myAPI.getValue("CurrentHeatingCoolingState"));
				}.bind(this), 500);	

			}
		}

		
	} // onHKValueChange
} // class

module.exports =	ThermostatMode;
@snowdd1
Copy link
Owner

snowdd1 commented Jan 15, 2021

Could it be the permission of the Homebridge-user?

That is really hard to tell from remote...

@Super-Harry
Copy link
Author

No. I checked the permission. I assigned "root" authorization to the homebridge User

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants