This commit is contained in:
britea 2020-05-02 17:01:39 +02:00
commit 87922f689d
14 changed files with 84 additions and 89 deletions

View file

@ -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);

View file

@ -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>

View file

@ -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" }}>

View file

@ -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>
} }

View file

@ -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>
); );
} }
} }

View file

@ -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>

View file

@ -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
) { ) {

View file

@ -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;

View file

@ -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>
); );

View file

@ -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;

View file

@ -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;
} }
} }

View file

@ -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",

View file

@ -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,

View file

@ -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"}