Merge branch 'dev' of https://lab.si.usi.ch/sa4-2020/the-sanmarinoes/frontend into dev
This commit is contained in:
commit
87922f689d
14 changed files with 84 additions and 89 deletions
|
@ -17,8 +17,6 @@ class SceneModal extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = this.initialState;
|
this.state = this.initialState;
|
||||||
this.setInitialState();
|
|
||||||
|
|
||||||
this.addSceneModal = this.addSceneModal.bind(this);
|
this.addSceneModal = this.addSceneModal.bind(this);
|
||||||
this.modifySceneModal = this.modifySceneModal.bind(this);
|
this.modifySceneModal = this.modifySceneModal.bind(this);
|
||||||
this.deleteScene = this.deleteScene.bind(this);
|
this.deleteScene = this.deleteScene.bind(this);
|
||||||
|
|
|
@ -71,6 +71,7 @@ const Automation = ({ automation, devices, scenes, removeAutomation }) => {
|
||||||
const sceneData = scenes.filter(
|
const sceneData = scenes.filter(
|
||||||
(s) => s.id === sp.sceneId
|
(s) => s.id === sp.sceneId
|
||||||
)[0];
|
)[0];
|
||||||
|
if (!sceneData) return "";
|
||||||
return (
|
return (
|
||||||
<Menu key={sceneData.id} compact>
|
<Menu key={sceneData.id} compact>
|
||||||
<Menu.Item as="span">{sceneData.name}</Menu.Item>
|
<Menu.Item as="span">{sceneData.name}</Menu.Item>
|
||||||
|
|
|
@ -26,7 +26,7 @@ class DevicePanel extends Component {
|
||||||
return (
|
return (
|
||||||
<Card.Group centered style={{ paddingTop: "3rem" }}>
|
<Card.Group centered style={{ paddingTop: "3rem" }}>
|
||||||
{this.props.devices.map((e, i) => {
|
{this.props.devices.map((e, i) => {
|
||||||
return <Device tab={this.props.tab} id={e.id} />;
|
return <Device key={i} tab={this.props.tab} id={e.id} />;
|
||||||
})}
|
})}
|
||||||
{!this.props.isActiveRoomHome ? (
|
{!this.props.isActiveRoomHome ? (
|
||||||
<Card style={{ height: "23em" }}>
|
<Card style={{ height: "23em" }}>
|
||||||
|
|
|
@ -63,7 +63,6 @@ class NewSceneDevice extends Component {
|
||||||
|
|
||||||
createState() {
|
createState() {
|
||||||
for (let i = 0; i < this.state.devicesAttached.length; i++) {
|
for (let i = 0; i < this.state.devicesAttached.length; i++) {
|
||||||
console.log("DIOPORCO", i, this.state.devicesAttached[i]);
|
|
||||||
let device = this.props.devices.filter(
|
let device = this.props.devices.filter(
|
||||||
(e) => this.state.devicesAttached[i] === e.id
|
(e) => this.state.devicesAttached[i] === e.id
|
||||||
);
|
);
|
||||||
|
@ -98,7 +97,14 @@ class NewSceneDevice extends Component {
|
||||||
open={this.state.openModal}
|
open={this.state.openModal}
|
||||||
onClose={this.resetState}
|
onClose={this.resetState}
|
||||||
trigger={
|
trigger={
|
||||||
<StyledDiv onClick={this.handleOpen}>
|
<StyledDiv
|
||||||
|
onClick={this.handleOpen}
|
||||||
|
style={{
|
||||||
|
position: "relative",
|
||||||
|
top: "calc(50% - 5rem)",
|
||||||
|
left: "calc(50% - 5rem)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
<Image src="/img/add.svg" style={{ filter: "invert()" }} />
|
<Image src="/img/add.svg" style={{ filter: "invert()" }} />
|
||||||
</StyledDiv>
|
</StyledDiv>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { connect } from "react-redux";
|
||||||
import { RemoteService } from "../../remote";
|
import { RemoteService } from "../../remote";
|
||||||
import Device from "./devices/Device";
|
import Device from "./devices/Device";
|
||||||
import NewSceneDevice from "./NewSceneDevice";
|
import NewSceneDevice from "./NewSceneDevice";
|
||||||
import { Grid, Button } from "semantic-ui-react";
|
import { Grid, Button, Card, Segment, Header } from "semantic-ui-react";
|
||||||
|
|
||||||
class ScenesPanel extends Component {
|
class ScenesPanel extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -12,39 +12,44 @@ class ScenesPanel extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
applyScene() {
|
applyScene() {
|
||||||
console.log(this.props.activeScene);
|
this.props
|
||||||
this.props.sceneApply(this.props.activeScene).then(() => {
|
.sceneApply(this.props.activeScene)
|
||||||
|
.then(() => {
|
||||||
alert("Scene applied.");
|
alert("Scene applied.");
|
||||||
});
|
})
|
||||||
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<Grid doubling columns={2} divided="vertically">
|
<Card.Group centered style={{ paddingTop: "3rem" }}>
|
||||||
{!this.props.isActiveDefaultScene ? (
|
{!this.props.isActiveDefaultScene ? (
|
||||||
<Grid.Row centered>
|
<Card style={{ height: "27em" }}>
|
||||||
|
<Card.Content>
|
||||||
|
<Card.Header textAlign="center">
|
||||||
|
<Header as="h3">Add devices - Apply Scene</Header>
|
||||||
|
</Card.Header>
|
||||||
|
<Segment basic style={{ width: "100%", height: "100%" }}>
|
||||||
|
<NewSceneDevice />
|
||||||
|
</Segment>
|
||||||
|
</Card.Content>
|
||||||
|
<Card.Content extra>
|
||||||
|
<div className="ui two buttons">
|
||||||
<Button color="blue" onClick={this.applyScene}>
|
<Button color="blue" onClick={this.applyScene}>
|
||||||
Apply Scene
|
Apply Scene
|
||||||
</Button>
|
</Button>
|
||||||
</Grid.Row>
|
</div>
|
||||||
) : null}
|
</Card.Content>
|
||||||
{!this.props.isActiveDefaultScene
|
</Card>
|
||||||
? this.props.sceneStates.map((e, i) => {
|
|
||||||
return (
|
|
||||||
<Grid.Column key={i}>
|
|
||||||
<Device tab={this.props.tab} id={e.id} />
|
|
||||||
</Grid.Column>
|
|
||||||
);
|
|
||||||
})
|
|
||||||
: null}
|
|
||||||
{!this.props.isActiveDefaultScene ? (
|
|
||||||
<Grid.Column>
|
|
||||||
<NewSceneDevice />
|
|
||||||
</Grid.Column>
|
|
||||||
) : (
|
) : (
|
||||||
<Grid.Column>Welcome to the Scene View, you add a Scene</Grid.Column>
|
<Grid.Column>Welcome to the Scene View, you add a Scene</Grid.Column>
|
||||||
)}
|
)}
|
||||||
</Grid>
|
{!this.props.isActiveDefaultScene
|
||||||
|
? this.props.sceneStates.map((e, i) => {
|
||||||
|
return <Device key={i} tab={this.props.tab} id={e.id} />;
|
||||||
|
})
|
||||||
|
: null}
|
||||||
|
</Card.Group>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,8 @@ class Device extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteState() {
|
deleteState() {
|
||||||
//console.log("alpaca "+this.props);
|
console.log("alpaca ", this.props);
|
||||||
this.props.deleteState(this.props.id, this.props.type);
|
this.props.deleteState(this.props.id, this.props.stateOrDevice.kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderDeviceComponent() {
|
renderDeviceComponent() {
|
||||||
|
@ -136,7 +136,7 @@ class Device extends React.Component {
|
||||||
|
|
||||||
stateDescription() {
|
stateDescription() {
|
||||||
return (
|
return (
|
||||||
<div class="ui one button">
|
<div className="ui two buttons">
|
||||||
<Button
|
<Button
|
||||||
color="red"
|
color="red"
|
||||||
icon
|
icon
|
||||||
|
@ -159,7 +159,9 @@ class Device extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
<Card style={{ height: "23em" }}>
|
<Card
|
||||||
|
style={{ height: this.props.tab === "Devices" ? "23em" : "27em" }}
|
||||||
|
>
|
||||||
<Card.Content>
|
<Card.Content>
|
||||||
<Card.Header textAlign="center">
|
<Card.Header textAlign="center">
|
||||||
<Header as="h3">{this.deviceName}</Header>
|
<Header as="h3">{this.deviceName}</Header>
|
||||||
|
|
|
@ -46,7 +46,7 @@ class Light extends Component {
|
||||||
this.setIntensity = this.setIntensity.bind(this);
|
this.setIntensity = this.setIntensity.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps, prevState) {
|
componentDidUpdate(prevProps) {
|
||||||
if (
|
if (
|
||||||
this.props.stateOrDevice.intensity !== prevProps.stateOrDevice.intensity
|
this.props.stateOrDevice.intensity !== prevProps.stateOrDevice.intensity
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -28,7 +28,7 @@ class SmartPlug extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
get energyConsumed() {
|
get energyConsumed() {
|
||||||
return (this.props.stateOrDevice.totalConsumption / 1000).toFixed(3);
|
return (this.props.device.totalConsumption / 1000).toFixed(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
onClickDevice = () => {
|
onClickDevice = () => {
|
||||||
|
@ -78,6 +78,13 @@ const mapStateToProps = (state, ownProps) => ({
|
||||||
return state.sceneStates[ownProps.id];
|
return state.sceneStates[ownProps.id];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
get device() {
|
||||||
|
if (state.active.activeTab === "Devices") {
|
||||||
|
return state.devices[ownProps.id];
|
||||||
|
} else {
|
||||||
|
return state.devices[state.sceneStates[ownProps.id].deviceId];
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
const SmartPlugContainer = connect(mapStateToProps, RemoteService)(SmartPlug);
|
const SmartPlugContainer = connect(mapStateToProps, RemoteService)(SmartPlug);
|
||||||
export default SmartPlugContainer;
|
export default SmartPlugContainer;
|
||||||
|
|
|
@ -15,39 +15,21 @@ import {
|
||||||
stateTagContainer,
|
stateTagContainer,
|
||||||
} from "./ThermostatStyle";
|
} from "./ThermostatStyle";
|
||||||
|
|
||||||
//not quite working yet
|
|
||||||
class Thermostats extends Component {
|
class Thermostats extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
targetTemperature: this.props.stateOrDevice.targetTemperature,
|
targetTemperature: this.props.device.targetTemperature,
|
||||||
mode: this.props.stateOrDevice.mode,
|
mode: this.props.device.mode,
|
||||||
measuredTemperature: this.props.stateOrDevice.measuredTemperature,
|
measuredTemperature: this.props.device.measuredTemperature,
|
||||||
useExternalSensors: this.props.stateOrDevice.useExternalSensors,
|
useExternalSensors: this.props.device.useExternalSensors,
|
||||||
timeout: null,
|
|
||||||
};
|
};
|
||||||
|
console.log(this.state);
|
||||||
this.setMode = this.setMode.bind(this);
|
this.setMode = this.setMode.bind(this);
|
||||||
this.setTargetTemperature = this.setTargetTemperature.bind(this);
|
this.setTargetTemperature = this.setTargetTemperature.bind(this);
|
||||||
this.setTargetTemperature = this.setTargetTemperature.bind(this);
|
this.setTargetTemperature = this.setTargetTemperature.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//getters
|
|
||||||
get getMode() {
|
|
||||||
return this.props.stateOrDevice.mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
get getTargetTemperature() {
|
|
||||||
return this.props.stateOrDevice.targetTemperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
get getMeasuredTemperature() {
|
|
||||||
return this.props.stateOrDevice.measuredTemperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
get getUseExternalSensors() {
|
|
||||||
return this.props.stateOrDevice.useExternalSensors;
|
|
||||||
}
|
|
||||||
|
|
||||||
setMode(mode) {
|
setMode(mode) {
|
||||||
if (this.state.timeout) {
|
if (this.state.timeout) {
|
||||||
clearTimeout(this.state.timeout);
|
clearTimeout(this.state.timeout);
|
||||||
|
@ -85,7 +67,6 @@ class Thermostats extends Component {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//It seems to work
|
|
||||||
saveTargetTemperature(targetTemperature) {
|
saveTargetTemperature(targetTemperature) {
|
||||||
const turn = this.props.stateOrDevice.mode !== "OFF";
|
const turn = this.props.stateOrDevice.mode !== "OFF";
|
||||||
if (this.props.tab === "Devices") {
|
if (this.props.tab === "Devices") {
|
||||||
|
@ -124,8 +105,6 @@ class Thermostats extends Component {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//I have no idea why it doesn't want to update the temperature
|
|
||||||
// Maybe ask yourself some questions
|
|
||||||
saveTargetTemperature(targetTemperature) {
|
saveTargetTemperature(targetTemperature) {
|
||||||
if (this.props.tab === "Devices") {
|
if (this.props.tab === "Devices") {
|
||||||
this.props
|
this.props
|
||||||
|
@ -160,7 +139,11 @@ class Thermostats extends Component {
|
||||||
<h3 style={deviceName}>
|
<h3 style={deviceName}>
|
||||||
Thermostat
|
Thermostat
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={this.props.stateOrDevice.mode !== "OFF" ? true : false}
|
checked={
|
||||||
|
this.props.tab === "Devices"
|
||||||
|
? this.props.device.mode !== "OFF"
|
||||||
|
: this.props.stateOrDevice.on
|
||||||
|
}
|
||||||
slider
|
slider
|
||||||
style={toggle}
|
style={toggle}
|
||||||
onChange={(e, val) => this.setMode(val.checked)}
|
onChange={(e, val) => this.setMode(val.checked)}
|
||||||
|
@ -185,7 +168,13 @@ class Thermostats extends Component {
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
<div style={stateTagContainer}>
|
<div style={stateTagContainer}>
|
||||||
<span style={stateTag}>{this.props.stateOrDevice.mode}</span>
|
<span style={stateTag}>
|
||||||
|
{this.props.tab === "Devices"
|
||||||
|
? this.props.device.mode
|
||||||
|
: this.props.stateOrDevice.on
|
||||||
|
? "WILL TURN ON"
|
||||||
|
: "WILL TURN OFF"}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -59,7 +59,11 @@ class Videocam extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = (state, ownProps) => ({
|
const mapStateToProps = (state, ownProps) => ({
|
||||||
device: state.devices[ownProps.id],
|
device:
|
||||||
|
ownProps.tab === "Devices"
|
||||||
|
? state.devices[ownProps.id]
|
||||||
|
: state.devices[state.sceneStates[ownProps.id].deviceId],
|
||||||
|
state: state.sceneStates[ownProps.id],
|
||||||
});
|
});
|
||||||
const VideocamContainer = connect(mapStateToProps, RemoteService)(Videocam);
|
const VideocamContainer = connect(mapStateToProps, RemoteService)(Videocam);
|
||||||
export default VideocamContainer;
|
export default VideocamContainer;
|
||||||
|
|
|
@ -13,7 +13,11 @@ class RemoteError extends Error {
|
||||||
messages;
|
messages;
|
||||||
|
|
||||||
constructor(messages) {
|
constructor(messages) {
|
||||||
super(messages.join(" - "));
|
super(
|
||||||
|
messages && Array.isArray(messages)
|
||||||
|
? messages.join(" - ")
|
||||||
|
: JSON.stringify(messages, null, 2)
|
||||||
|
);
|
||||||
this.messages = messages;
|
this.messages = messages;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,7 +301,6 @@ function reducer(previousState, action) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "AUTOMATION_SAVE":
|
case "AUTOMATION_SAVE":
|
||||||
console.log("ID: ", action.automation.id);
|
|
||||||
change = {
|
change = {
|
||||||
automations: { [action.automation.id]: { $set: action.automation } },
|
automations: { [action.automation.id]: { $set: action.automation } },
|
||||||
};
|
};
|
||||||
|
@ -316,7 +315,6 @@ function reducer(previousState, action) {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (previousState.scenes[action.sceneState.sceneId]) {
|
if (previousState.scenes[action.sceneState.sceneId]) {
|
||||||
console.log("PREVSTATE", change, previousState);
|
|
||||||
change.scenes = {
|
change.scenes = {
|
||||||
[action.sceneState.sceneId]: {
|
[action.sceneState.sceneId]: {
|
||||||
sceneStates: {
|
sceneStates: {
|
||||||
|
@ -334,7 +332,6 @@ function reducer(previousState, action) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
newState = update(previousState, change);
|
newState = update(previousState, change);
|
||||||
console.log("NEWSTATE ", newState);
|
|
||||||
break;
|
break;
|
||||||
case "ROOM_DELETE":
|
case "ROOM_DELETE":
|
||||||
if (!(action.roomId in previousState.rooms)) {
|
if (!(action.roomId in previousState.rooms)) {
|
||||||
|
@ -365,13 +362,9 @@ function reducer(previousState, action) {
|
||||||
automations: { $unset: [action.id] },
|
automations: { $unset: [action.id] },
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log("CHANGE ", change);
|
|
||||||
console.log("Action id: ", action.id);
|
|
||||||
newState = update(previousState, change);
|
newState = update(previousState, change);
|
||||||
console.log("NEW STATE ", newState);
|
|
||||||
break;
|
break;
|
||||||
case "SCENE_DELETE":
|
case "SCENE_DELETE":
|
||||||
console.log("SCENE", action.sceneId);
|
|
||||||
if (!(action.sceneId in previousState.scenes)) {
|
if (!(action.sceneId in previousState.scenes)) {
|
||||||
console.warn(`Scene to delete ${action.sceneId} does not exist`);
|
console.warn(`Scene to delete ${action.sceneId} does not exist`);
|
||||||
break;
|
break;
|
||||||
|
@ -417,15 +410,6 @@ function reducer(previousState, action) {
|
||||||
newState = update(previousState, change);
|
newState = update(previousState, change);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "SCENE_APPLY":
|
|
||||||
console.log(action);
|
|
||||||
//checking that the scene actually exists
|
|
||||||
/*if (!(action.sceneId in previousState.scenes)) {
|
|
||||||
console.warn(`Scene ${action.sceneId} does not exist`);
|
|
||||||
break;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
break;
|
|
||||||
case "DEVICE_DELETE":
|
case "DEVICE_DELETE":
|
||||||
if (!(action.deviceId in previousState.devices)) {
|
if (!(action.deviceId in previousState.devices)) {
|
||||||
console.warn(`Device to delete ${action.deviceId} does not exist`);
|
console.warn(`Device to delete ${action.deviceId} does not exist`);
|
||||||
|
@ -487,6 +471,7 @@ function reducer(previousState, action) {
|
||||||
break;
|
break;
|
||||||
case "REDUX_WEBSOCKET::MESSAGE":
|
case "REDUX_WEBSOCKET::MESSAGE":
|
||||||
const devices = JSON.parse(action.payload.message);
|
const devices = JSON.parse(action.payload.message);
|
||||||
|
//console.log("socket", JSON.stringify(devices, null, 2));
|
||||||
|
|
||||||
newState = reducer(previousState, {
|
newState = reducer(previousState, {
|
||||||
type: "DEVICES_UPDATE",
|
type: "DEVICES_UPDATE",
|
||||||
|
|
|
@ -62,10 +62,6 @@ const actions = {
|
||||||
type: "STATE_DELETE",
|
type: "STATE_DELETE",
|
||||||
stateId,
|
stateId,
|
||||||
}),
|
}),
|
||||||
sceneApply: (sceneId) => ({
|
|
||||||
type: "SCENE_APPLY",
|
|
||||||
sceneId,
|
|
||||||
}),
|
|
||||||
deviceOperationUpdate: (devices) => ({
|
deviceOperationUpdate: (devices) => ({
|
||||||
type: "DEVICES_UPDATE",
|
type: "DEVICES_UPDATE",
|
||||||
devices,
|
devices,
|
||||||
|
|
|
@ -89,14 +89,12 @@ class Dashboard extends Component {
|
||||||
<Grid.Column textAlign="center" width={16}>
|
<Grid.Column textAlign="center" width={16}>
|
||||||
<Menu fluid widths={3} inverted color="grey">
|
<Menu fluid widths={3} inverted color="grey">
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
basic
|
|
||||||
name="Devices"
|
name="Devices"
|
||||||
content="Devices"
|
content="Devices"
|
||||||
active={this.activeTab === "Devices"}
|
active={this.activeTab === "Devices"}
|
||||||
onClick={this.selectTab}
|
onClick={this.selectTab}
|
||||||
/>
|
/>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
basic
|
|
||||||
name="Scenes"
|
name="Scenes"
|
||||||
content="Scenes"
|
content="Scenes"
|
||||||
active={this.activeTab === "Scenes"}
|
active={this.activeTab === "Scenes"}
|
||||||
|
|
Loading…
Reference in a new issue