Skip to content

Commit

Permalink
Add Humidifier / Dehumidifier (#1)
Browse files Browse the repository at this point in the history
  • Loading branch information
Feilner committed Feb 26, 2021
1 parent d89d5ca commit 8c00374
Show file tree
Hide file tree
Showing 33 changed files with 413 additions and 33 deletions.
5 changes: 4 additions & 1 deletion ui/src/app/core/accessories/accessories.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ import { AirpurifierComponent } from './types/airpurifier/airpurifier.component'
import { AirpurifierManageComponent } from './types/airpurifier/airpurifier.manage.component';
import { HeaterCoolerComponent } from './types/heatercooler/heatercooler.component';
import { HeaterCoolerManageComponent } from './types/heatercooler/heatercooler.manage.component';

import { HumidifierDehumidifierComponent } from './types/humidifierdehumidifier/humidifierdehumidifier.component';
import { HumidifierDehumidifierManageComponent } from './types/humidifierdehumidifier/humidifierdehumidifier.manage.component';
import { InfoModalComponent } from './info-modal/info-modal.component';
import { AccessoryTileComponent } from './accessory-tile/accessory-tile.component';

Expand Down Expand Up @@ -115,6 +116,8 @@ import { AccessoryTileComponent } from './accessory-tile/accessory-tile.componen
AirpurifierManageComponent,
HeaterCoolerComponent,
HeaterCoolerManageComponent,
HumidifierDehumidifierComponent,
HumidifierDehumidifierManageComponent,
],
imports: [
CommonModule,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
</app-irrigationsystem>
<app-heatercooler *ngSwitchCase="'HeaterCooler'" [service]="service">Heater Cooler
</app-heatercooler>
<app-humidifierdehumidifier *ngSwitchCase="'HumidifierDehumidifier'" [service]="service">Humidifier Dehumidifier
</app-humidifierdehumidifier>
<app-statelessprogrammableswitch *ngSwitchCase="'StatelessProgrammableSwitch'" [service]="service">
Stateless Programmable Switch
</app-statelessprogrammableswitch>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<div class="accessory-box" [ngClass]="{'switch-on': service.values.Active === 1}" appLongclick
(longclick)="onLongClick()" (shortclick)="onClick()">
<div class="d-flex flex-column h-100">
<div class="humidity-drop humidity-drop-collapse"
[ngClass]="{
'dehumidifying': service.values.CurrentHumidifierDehumidifierState === 3 && service.values.Active === 1,
'humidifying': service.values.CurrentHumidifierDehumidifierState === 2 && service.values.Active === 1,
'no-current-state': service.values.CurrentHumidifierDehumidifierState === 1 && service.values.Active === 1
}">
<div class="humidity-drop-text" [innerText]="(service.values.CurrentRelativeHumidity) + '%'"></div>
</div>
<div class="accessory-label mt-auto">{{ service.customName || service.serviceName }}</div>
<div class="accessory-label grey-text" *ngIf="service.values.Active === 0">
{{ 'accessories.control.label_off' | translate }}
</div>
<div class="accessory-label grey-text"
*ngIf="service.values.Active === 1 && service.getCharacteristic('RelativeHumidityDehumidifierThreshold') && service.getCharacteristic('RelativeHumidityHumidifierThreshold')"
[ngSwitch]="service.values.TargetHumidifierDehumidifierState">
<span *ngSwitchCase="1">
{{ service.values.RelativeHumidityHumidifierThreshold }}%
</span>
<span *ngSwitchCase="2">
{{ service.values.RelativeHumidityDehumidifierThreshold }}%
</span>
<span *ngSwitchCase="0">
{{ service.values.RelativeHumidityHumidifierThreshold }}%-{{ service.values.RelativeHumidityDehumidifierThreshold }}%
</span>
</div>
<div class="accessory-label grey-text"
*ngIf="service.values.Active === 1 && (!service.getCharacteristic('RelativeHumidityDehumidifierThreshold') || !service.getCharacteristic('RelativeHumidityHumidifierThreshold'))">
{{ 'accessories.control.label_on' | translate }}
</div>
</div>

</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
.humidity-drop {
position: relative;
display: inline-block;
width: 50px;
height: 50px;
line-height: 50px;
border-radius: 5% 55% 70% 55%;
font-size: 15px;
text-align: center;
margin-bottom: 6px;
background-color: grey;
color: lightgrey;
transform: rotate(45deg);
}

.humidity-drop-collapse {
@media (max-width: 575px) {
width: 31px;
height: 31px;
line-height: 31px;
font-size: 10px;
margin-bottom: 7px;
}
}

.humidity-drop-text {
transform: rotate(-45deg);
}

.humidifying {
background-color: #33b5e5;
color: #FFF;
}

.dehumidifying {
background-color: #FF8800;
color: #FFF;
}

.no-current-state {
background-color: #42d672;
color: #FFF;
-webkit-transition: all .15 ease-in-out;
transition: all .15 ease-in-out;
}

.humidity-mode-control {
.btn {
font-size: 1.4rem;
text-transform: initial;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Component, OnInit, Input } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { ServiceTypeX } from '../../accessories.interfaces';

import { HumidifierDehumidifierManageComponent } from './humidifierdehumidifier.manage.component';

@Component({
selector: 'app-humidifierdehumidifier',
templateUrl: './humidifierdehumidifier.component.html',
styleUrls: ['./humidifierdehumidifier.component.scss'],
})
export class HumidifierDehumidifierComponent implements OnInit {
@Input() public service: ServiceTypeX;
model = 1;

constructor(
private modalService: NgbModal,
) { }

ngOnInit() {
}

onClick() {
this.service.getCharacteristic('Active').setValue(!this.service.values.Active);
}

onLongClick() {
const ref = this.modalService.open(HumidifierDehumidifierManageComponent, {
size: 'sm',
});
ref.componentInstance.service = this.service;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" [innerText]="service.customName || service.serviceName"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"
(click)="activeModal.dismiss('Cross click')">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body text-center">

<div class="humidity-drop mb-3"
[ngClass]="{
'dehumidifying': service.values.CurrentHumidifierDehumidifierState === 3 && service.values.Active === 1,
'humidifying': service.values.CurrentHumidifierDehumidifierState === 2 && service.values.Active === 1,
'no-current-state': service.values.CurrentHumidifierDehumidifierState === 1 && service.values.Active === 1
}">
<div class="humidity-drop-text"
[innerText]="(service.values.CurrentRelativeHumidity) + '%'"></div></div>

<div class="humidity-mode-control btn-group-vertical btn-group-toggle d-flex justify-content-center mb-4"
ngbRadioGroup name="radioBasic" [(ngModel)]="targetMode" (change)="onTargetStateChange()">
<label ngbButtonLabel class="btn-primary m-0">
<input ngbButton type="radio" [value]="0"> {{ 'accessories.control.label_auto' | translate }}
</label>
<label ngbButtonLabel class="btn-primary m-0">
<input ngbButton type="radio" [value]="1"> {{ 'accessories.control.label_humidifying' | translate }}
</label>
<label ngbButtonLabel class="btn-primary m-0">
<input ngbButton type="radio" [value]="2"> {{ 'accessories.control.label_dehumidifying' | translate }}
</label>
<label ngbButtonLabel class="btn-primary m-0">
<input ngbButton type="radio" [value]="'off'"> {{ 'accessories.control.label_off' | translate }}
</label>
</div>

<div *ngIf="service.values.Active === 1 && RelativeHumidityHumidifierThreshold && RelativeHumidityDehumidifierThreshold">
<h5>{{ 'accessories.control.label_target_humidity' | translate }}</h5>

<div [ngSwitch]="targetMode">
<div *ngSwitchCase="0">
<p>
{{ autoHumidity[0] }}% -
{{ autoHumidity[1] }}%
</p>
<nouislider [min]="RelativeHumidityHumidifierThreshold.minValue" [max]="RelativeHumidityDehumidifierThreshold.maxValue"
[step]="RelativeHumidityDehumidifierThreshold.minStep" [(ngModel)]="autoHumidity"
(ngModelChange)="onHumidityStateChange()">
</nouislider>
</div>
<div *ngSwitchCase="1">
<p>{{ targetHumidifierHumidity }}%</p>
<nouislider [min]="RelativeHumidityHumidifierThreshold.minValue" [max]="RelativeHumidityHumidifierThreshold.maxValue"
[step]="RelativeHumidityHumidifierThreshold.minStep" [(ngModel)]="targetHumidifierHumidity"
(ngModelChange)="onHumidityStateChange()">
</nouislider>
</div>
<div *ngSwitchCase="2">
<p>{{ targetDehumidifierHumidity }}%</p>
<nouislider [min]="RelativeHumidityDehumidifierThreshold.minValue" [max]="RelativeHumidityDehumidifierThreshold.maxValue"
[step]="RelativeHumidityDehumidifierThreshold.minStep" [(ngModel)]="targetDehumidifierHumidity"
(ngModelChange)="onHumidityStateChange()">
</nouislider>
</div>
</div>
</div>

</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { Component, OnInit, Input } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { ServiceTypeX } from '../../accessories.interfaces';

import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';

@Component({
selector: 'app-humidifierdehumidifier-manage',
templateUrl: './humidifierdehumidifier.manage.component.html',
styleUrls: ['./humidifierdehumidifier.component.scss'],
})
export class HumidifierDehumidifierManageComponent implements OnInit {
@Input() public service: ServiceTypeX;
public targetMode: any;
public targetHumidity: any;
public targetHumidityChanged: Subject<any> = new Subject<any>();

public RelativeHumidityDehumidifierThreshold;
public RelativeHumidityHumidifierThreshold;

public targetDehumidifierHumidity: number;
public targetHumidifierHumidity: number;
public autoHumidity: [number, number];

constructor(
public activeModal: NgbActiveModal,
) {
this.targetHumidityChanged
.pipe(
debounceTime(300),
)
.subscribe((value) => {
switch (this.targetMode) {
case 0:
// auto
this.service.getCharacteristic('RelativeHumidityHumidifierThreshold').setValue(this.autoHumidity[0]);
this.service.getCharacteristic('RelativeHumidityDehumidifierThreshold').setValue(this.autoHumidity[1]);
break;
case 1:
// humidifier
this.service.getCharacteristic('RelativeHumidityHumidifierThreshold').setValue(this.targetHumidifierHumidity);
break;
case 2:
// dehumidifier
this.service.getCharacteristic('RelativeHumidityDehumidifierThreshold').setValue(this.targetDehumidifierHumidity);
break;
}
});
}

ngOnInit() {
this.targetMode = this.service.values.Active ? this.service.values.TargetHumidifierDehumidifierState : 'off';

this.RelativeHumidityDehumidifierThreshold = this.service.getCharacteristic('RelativeHumidityDehumidifierThreshold');
this.RelativeHumidityHumidifierThreshold = this.service.getCharacteristic('RelativeHumidityHumidifierThreshold');

this.loadTargetHumidity();
}

loadTargetHumidity() {
this.targetDehumidifierHumidity = this.service.getCharacteristic('RelativeHumidityDehumidifierThreshold')?.value as number;
this.targetHumidifierHumidity = this.service.getCharacteristic('RelativeHumidityHumidifierThreshold')?.value as number;
this.autoHumidity = [this.targetHumidifierHumidity, this.targetDehumidifierHumidity];
}

onTargetStateChange() {
if (this.targetMode === 'off') {
this.service.getCharacteristic('Active').setValue(0);
} else {
if (this.service.getCharacteristic('Active').value === 0) {
this.service.getCharacteristic('Active').setValue(1);
}
this.service.getCharacteristic('TargetHumidifierDehumidifierState').setValue(this.targetMode);
}

this.loadTargetHumidity();
}

onHumidityStateChange() {
this.targetHumidityChanged.next();
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<div class="accessory-box">
<div class="d-flex flex-column h-100">
<div [inlineSVG]="'/assets/hap-icons/humidity.svg'" aria-label="Humidity Sensor" class="accessory-svg"></div>
<div class="humidity-drop humidity-drop-collapse">
<div class="humidity-drop-text" [innerText]="(service.values.CurrentRelativeHumidity) + '%'"></div>
</div>
<div class="accessory-label mt-auto">{{ service.customName || service.serviceName }}</div>
<div class="accessory-label grey-text">{{ service.values.CurrentRelativeHumidity }}%</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
.humidity-drop {
position: relative;
display: inline-block;
width: 50px;
height: 50px;
line-height: 50px;
border-radius: 5% 55% 70% 55%;
font-size: 15px;
text-align: center;
margin-bottom: 6px;
background-color: grey;
color: lightgrey;
transform: rotate(45deg);
}

.humidity-drop-collapse {
@media (max-width: 575px) {
width: 31px;
height: 31px;
line-height: 31px;
font-size: 10px;
margin-bottom: 7px;
}
}

.humidity-drop-text {
transform: rotate(-45deg);
}
5 changes: 4 additions & 1 deletion ui/src/i18n/bg.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
"accessories.control.label_closing": "Затваряне",
"accessories.control.label_cool": "Охлаждане",
"accessories.control.label_default_running_time": "Default Running Time",
"accessories.control.label_dehumidifying": "Dehumidifying",
"accessories.control.label_fan": "Вентилатор",
"accessories.control.label_heat": "Затопляне",
"accessories.control.label_home": "Home",
"accessories.control.label_humidifying": "Humidifying",
"accessories.control.label_jammed": "Заседнал",
"accessories.control.label_light": "Осветление",
"accessories.control.label_locked": "Заключено",
Expand All @@ -34,6 +36,7 @@
"accessories.control.label_speaker_volume": "Сила на звука",
"accessories.control.label_stopped": "Спряно",
"accessories.control.label_target": "Цел",
"accessories.control.label_target_humidity": "Target Humidity",
"accessories.control.label_target_temperature": "Желана температура",
"accessories.control.label_triggered": "Задействан",
"accessories.control.label_unknown": "Непознат",
Expand Down Expand Up @@ -377,4 +380,4 @@
"users.toast_failed_to_update_user": "Неуспешно обновяване на потребителя",
"users.toast_updated_user": "Потребителя е обновен",
"users.toast_user_deleted": "Потребителя е изтрит"
}
}
Loading

0 comments on commit 8c00374

Please sign in to comment.