Skip to content

Commit

Permalink
fix(dingz): Fix for blinds not working after refactoring
Browse files Browse the repository at this point in the history
Fixes #11 – Thanks @mabu4ch for helping with debugging this!
  • Loading branch information
johannrichard committed Jun 1, 2020
1 parent c6de553 commit 1926110
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 26 deletions.
56 changes: 31 additions & 25 deletions src/dingzAccessory.ts
Expand Up @@ -30,8 +30,8 @@ import {
DingzMotionData,
DingzState,
WindowCoveringId,
WindowCoveringState,
WindowCoveringTimer,
WindowCoveringStates,
} from './util/dingzTypes';
import {
ButtonAction,
Expand Down Expand Up @@ -89,7 +89,7 @@ export class DingzDaAccessory extends EventEmitter {
// FIXME: Make structure less hardware-like
// Outputs
Dimmers: [] as DimmerState[],
WindowCovers: [] as WindowCoveringState[],
WindowCovers: [] as WindowCoveringStates[],
LED: {
on: false,
hsv: '0;0;100',
Expand Down Expand Up @@ -194,6 +194,7 @@ export class DingzDaAccessory extends EventEmitter {
// Outputs
this.dingzStates.Dimmers = state.dimmers;
this.dingzStates.LED = state.led;
// FIXME: Not the same structure here
this.dingzStates.WindowCovers = state.blinds;
// Sensors
this.dingzStates.Temperature = state.sensors.room_temperature;
Expand Down Expand Up @@ -813,21 +814,23 @@ export class DingzDaAccessory extends EventEmitter {
}

private updateWindowCoveringState(id: WindowCoveringId, service: Service) {
const state: WindowCoveringState = this.dingzStates.WindowCovers[id];
service
.getCharacteristic(this.platform.Characteristic.TargetPosition)
.updateValue(state.target.blind);
service
.getCharacteristic(this.platform.Characteristic.TargetHorizontalTiltAngle)
.updateValue(state.target.lamella);
const state: WindowCoveringStates = this.dingzStates.WindowCovers[id];

// FIXME: Different structure
// service
// .getCharacteristic(this.platform.Characteristic.TargetPosition)
// .updateValue(state.target.blind);
// service
// .getCharacteristic(this.platform.Characteristic.TargetHorizontalTiltAngle)
// .updateValue(state.target.lamella);
service
.getCharacteristic(this.platform.Characteristic.CurrentPosition)
.updateValue(state.current.blind);
.updateValue(state.position);
service
.getCharacteristic(
this.platform.Characteristic.CurrentHorizontalTiltAngle,
)
.updateValue(state.current.lamella);
.updateValue((state.lamella / 100) * 90); // Set in °, Get in % (...)
}

private async setPosition(
Expand All @@ -836,8 +839,9 @@ export class DingzDaAccessory extends EventEmitter {
callback: CharacteristicSetCallback,
) {
const blind: number = value as number;
const lamella: number = this.dingzStates.WindowCovers[id].target.lamella;
this.dingzStates.WindowCovers[id].target.blind = blind;
const lamella: number = this.dingzStates.WindowCovers[id].lamella;
// const lamella: number = this.dingzStates.WindowCovers[id].target.lamella;
this.dingzStates.WindowCovers[id].position = blind;

await this.setWindowCovering(id, blind, lamella);
callback(null);
Expand All @@ -851,7 +855,7 @@ export class DingzDaAccessory extends EventEmitter {
'WindowCoverings: ',
JSON.stringify(this.dingzStates.WindowCovers),
);
const position: number = this.dingzStates.WindowCovers[id].current.blind;
const position: number = this.dingzStates.WindowCovers[id].position;

this.platform.log.debug(
'Get Characteristic for WindowCovering',
Expand All @@ -868,9 +872,10 @@ export class DingzDaAccessory extends EventEmitter {
value: CharacteristicValue,
callback: CharacteristicSetCallback,
) {
const blind: number = this.dingzStates.WindowCovers[id].target.blind;
// const blind: number = this.dingzStates.WindowCovers[id].target.blind;
const blind: number = this.dingzStates.WindowCovers[id].position;
const lamella: number = value as number;
this.dingzStates.WindowCovers[id].target.lamella = lamella;
this.dingzStates.WindowCovers[id].lamella = lamella;

this.platform.log.debug(
'Set Characteristic TargetHorizontalTiltAngle on ',
Expand All @@ -893,7 +898,7 @@ export class DingzDaAccessory extends EventEmitter {
'WindowCoverings: ',
JSON.stringify(this.dingzStates.WindowCovers),
);
const tiltAngle: number = this.dingzStates.WindowCovers[id].current.lamella;
const tiltAngle: number = this.dingzStates.WindowCovers[id].lamella;

this.platform.log.debug(
'Get Characteristic for WindowCovering',
Expand Down Expand Up @@ -1195,7 +1200,8 @@ export class DingzDaAccessory extends EventEmitter {
) {
this.dingzStates.LED.on = value as boolean;
const state = this.dingzStates.LED;
this.setDeviceLED({ isOn: state.on });
const color = `${state.hue};${state.saturation};${state.value}`;
this.setDeviceLED({ isOn: state.on, color: color });
callback(null);
}

Expand Down Expand Up @@ -1305,8 +1311,8 @@ export class DingzDaAccessory extends EventEmitter {
// Set individual dimmer
private async setWindowCovering(
id: WindowCoveringId,
blind?: number,
lamella?: number,
blind: number,
lamella: number,
): Promise<void> {
// {{ip}}/api/v1/shade/0?blind=<value>&lamella=<value>
const setWindowCoveringUrl = `${this.baseUrl}/api/v1/shade/${id}/`;
Expand All @@ -1316,8 +1322,8 @@ export class DingzDaAccessory extends EventEmitter {
token: this.device.token,
body: qs.stringify(
{
blind: blind ?? undefined,
lamella: lamella ?? undefined,
blind: blind,
lamella: lamella,
},
{ encode: false },
),
Expand All @@ -1330,7 +1336,7 @@ export class DingzDaAccessory extends EventEmitter {
color,
}: {
isOn: boolean;
color?: string;
color: string;
}): Promise<void> {
const setLEDUrl = `${this.baseUrl}/api/v1/led/set`;
await this.platform.fetch({
Expand All @@ -1340,8 +1346,8 @@ export class DingzDaAccessory extends EventEmitter {
body: qs.stringify(
{
action: isOn ? 'on' : 'off',
color: color ?? undefined,
mode: color ? 'hsv' : undefined,
color: color,
mode: 'hsv', // Fixed for the time being
ramp: 150,
},
{ encode: false },
Expand Down
13 changes: 12 additions & 1 deletion src/util/dingzTypes.ts
Expand Up @@ -113,13 +113,24 @@ export interface WindowCoveringState {
target: WindowCoveringPositon;
current: WindowCoveringPositon;
}

export interface WindowCoveringStates {
moving: string;
position: number;
lamella: number;
readonly: boolean;
index?: {
relative: number;
absolute: number;
};
}
export type WindowCoveringProps = Record<WindowCoveringId, WindowCoveringState>;

// FIXME: Replace dispersed data gathering with `api/v1/state` endpoint

export interface DingzState {
dimmers: DimmerState[];
blinds: WindowCoveringState[];
blinds: WindowCoveringStates[];
led: DingzLEDState;
sensors: {
brightness: number;
Expand Down

0 comments on commit 1926110

Please sign in to comment.