frontend/smart-hut/src/components/dashboard/devices/Thermostats.js

150 lines
4.1 KiB
JavaScript
Raw Normal View History

import React, { Component } from "react";
2020-05-02 09:11:21 +00:00
import { Checkbox, Icon } from "semantic-ui-react";
2020-04-23 14:02:02 +00:00
import { RemoteService } from "../../../remote";
import { connect } from "react-redux";
import "./Thermostat.css";
2020-05-02 09:11:21 +00:00
import Slider from "react-rangeslider";
import "react-rangeslider/lib/index.css";
2020-05-03 16:09:53 +00:00
import mapStateToProps from "../../../deviceProps";
2020-05-02 09:11:21 +00:00
import {
2020-04-24 21:34:01 +00:00
stateTag,
container,
deviceName,
targetTemperature,
toggle,
stateTagContainer,
} from "./ThermostatStyle";
2020-04-23 14:02:02 +00:00
class Thermostats extends Component {
2020-04-24 21:34:01 +00:00
constructor(props) {
super(props);
this.state = {
2020-05-02 11:58:02 +00:00
targetTemperature: this.props.device.targetTemperature,
mode: this.props.device.mode,
measuredTemperature: this.props.device.measuredTemperature,
useExternalSensors: this.props.device.useExternalSensors,
2020-04-23 14:02:02 +00:00
};
2020-04-24 21:34:01 +00:00
this.setMode = this.setMode.bind(this);
this.setTargetTemperature = this.setTargetTemperature.bind(this);
}
setMode(mode) {
if (this.state.timeout) {
clearTimeout(this.state.timeout);
}
//i came to the conclusion that is not possible to set mode.
2020-05-02 09:11:21 +00:00
// Good job Jacob (Claudio)
2020-04-24 21:34:01 +00:00
//this.mode = "HEATING";
const turnOn = mode;
2020-04-26 11:38:54 +00:00
if (this.props.tab === "Devices") {
2020-04-25 13:37:40 +00:00
this.props
2020-04-26 11:38:54 +00:00
.saveDevice({ ...this.props.stateOrDevice, turnOn })
.catch((err) => console.error("thermostat update error", err));
} else {
this.props.updateState(
2020-05-01 17:55:08 +00:00
{ id: this.props.stateOrDevice.id, on: turnOn },
2020-04-27 13:47:59 +00:00
this.props.stateOrDevice.kind
2020-04-26 11:38:54 +00:00
);
2020-04-25 13:37:40 +00:00
}
2020-04-24 21:34:01 +00:00
}
onClickDevice = () => {
const on = !this.turnedOn;
2020-04-26 11:38:54 +00:00
if (this.props.tab === "Devices") {
2020-04-25 13:37:40 +00:00
this.props
2020-04-26 11:38:54 +00:00
.saveDevice({ ...this.props.stateOrDevice, on })
.catch((err) => console.error("thermostat update error", err));
} else {
this.props.updateState(
2020-05-02 09:11:21 +00:00
{ id: this.props.stateOrDevice.id, on },
2020-04-27 13:47:59 +00:00
this.props.stateOrDevice.kind
2020-04-26 11:38:54 +00:00
);
2020-04-25 13:37:40 +00:00
}
2020-04-24 21:34:01 +00:00
};
saveTargetTemperature(targetTemperature) {
2020-05-02 09:11:21 +00:00
const turn = this.props.stateOrDevice.mode !== "OFF";
2020-04-26 11:38:54 +00:00
if (this.props.tab === "Devices") {
2020-04-25 13:37:40 +00:00
this.props
2020-04-27 17:24:21 +00:00
.saveDevice({
...this.props.stateOrDevice,
targetTemperature,
turnOn: turn,
})
2020-04-26 11:38:54 +00:00
.catch((err) => console.error("thermostat update error", err));
} else {
this.props.updateState(
2020-04-27 13:47:59 +00:00
{
id: this.props.stateOrDevice.id,
targetTemperature: targetTemperature,
},
this.props.stateOrDevice.kind
2020-04-26 11:38:54 +00:00
);
2020-04-25 13:37:40 +00:00
}
2020-04-24 21:34:01 +00:00
}
2020-05-02 09:11:21 +00:00
setTargetTemperature() {
this.saveTargetTemperature(this.state.targetTemperature);
2020-04-24 21:34:01 +00:00
}
handleChange = (value) => {
2020-05-02 09:11:21 +00:00
this.setState({ ...this.state, targetTemperature: value });
2020-04-24 21:34:01 +00:00
};
render() {
return (
<div style={container}>
2020-05-02 09:11:21 +00:00
<h3 style={deviceName}>
Thermostat
<Checkbox
2020-05-02 11:58:02 +00:00
checked={
this.props.tab === "Devices"
? this.props.device.mode !== "OFF"
: this.props.stateOrDevice.on
}
2020-05-02 09:11:21 +00:00
slider
style={toggle}
onChange={(e, val) => this.setMode(val.checked)}
/>
</h3>
<hr />
<div style={targetTemperature}>
<Icon name="thermometer half" />{" "}
{this.props.device.measuredTemperature} ºC <br />
2020-05-02 15:02:50 +00:00
<Icon name="target" />{" "}
{this.props.device.targetTemperature.toFixed(1)} ºC
2020-05-02 09:11:21 +00:00
</div>
{this.props.tab === "Devices" ? (
<Slider
min={10}
max={30}
step={0.1}
tooltip={false}
2020-05-01 17:55:08 +00:00
className="slider-css"
2020-05-02 09:11:21 +00:00
value={this.state.targetTemperature}
onChange={(event) => this.handleChange(event)}
onChangeComplete={() => this.setTargetTemperature()}
2020-05-01 17:55:08 +00:00
/>
) : null}
2020-04-24 21:34:01 +00:00
<div style={stateTagContainer}>
2020-05-02 11:58:02 +00:00
<span style={stateTag}>
{this.props.tab === "Devices"
? this.props.device.mode
: this.props.stateOrDevice.on
? "WILL TURN ON"
: "WILL TURN OFF"}
</span>
2020-04-24 21:34:01 +00:00
</div>
</div>
);
}
2020-04-23 14:02:02 +00:00
}
const ThermostatContainer = connect(
2020-04-24 21:34:01 +00:00
mapStateToProps,
RemoteService
)(Thermostats);
export default ThermostatContainer;