Add esper statistics

This commit is contained in:
uwap 2018-01-20 00:16:34 +01:00
parent 3ed861369e
commit 16d03ceacf
5 changed files with 209 additions and 136 deletions

View file

@ -7,7 +7,8 @@ const config : Config = {
color: "orange", color: "orange",
mqtt: "ws://map.rzl:1884" mqtt: "ws://map.rzl:1884"
}, },
topics: { topics: [
{
led_stahltraeger: { led_stahltraeger: {
state: "/service/openhab/out/pca301_ledstrips/state", state: "/service/openhab/out/pca301_ledstrips/state",
command: "/service/openhab/in/pca301_ledstrips/command", command: "/service/openhab/in/pca301_ledstrips/command",
@ -119,6 +120,9 @@ const config : Config = {
values: { on: "ON", off: "OFF" } values: { on: "ON", off: "OFF" }
} }
}, },
utils.esper_topics("afba40", "flyfry"),
utils.esper_topics("afba45", "alarm")
],
controls: { controls: {
led_stahltrager: { led_stahltrager: {
name: "LED Stahlträger", name: "LED Stahlträger",
@ -221,14 +225,14 @@ const config : Config = {
position: [450, 590], position: [450, 590],
icon: "fire", icon: "fire",
iconColor: ({flyfry}) => flyfry == "on" ? "#6666FF" : "#000000", iconColor: ({flyfry}) => flyfry == "on" ? "#6666FF" : "#000000",
ui: [ ui: utils.esper_statistics("flyfry", [
{ {
type: "toggle", type: "toggle",
text: "Fliegenbratgerät", text: "Fliegenbratgerät",
topic: "flyfry", topic: "flyfry",
icon: "power" icon: "power"
} }
] ])
}, },
artnet: { artnet: {
name: "Artnet", name: "Artnet",
@ -362,6 +366,13 @@ const config : Config = {
} }
] ]
}, },
alarm: {
name: "Alarm",
position: [340, 250],
icon: "alarm-bell",
iconColor: () => "#000000",
ui: utils.esper_statistics("alarm")
},
door: { door: {
name: "Tür", name: "Tür",
position: [455,350], position: [455,350],
@ -378,7 +389,7 @@ const config : Config = {
infoscreen: { infoscreen: {
name: "Infoscreen", name: "Infoscreen",
position: [255, 495], position: [255, 495],
icon: "television-guide", icon: "television-guide flip-v",
iconColor: ({infoscreen}) => infoscreen == "on" ? "#4444FF" : "#000000", iconColor: ({infoscreen}) => infoscreen == "on" ? "#4444FF" : "#000000",
ui: [ ui: [
{ {

View file

@ -3,27 +3,81 @@
export const rainbow = "rgba(200,120,120,0.5);" export const rainbow = "rgba(200,120,120,0.5);"
+ "--before-background: linear-gradient(40deg, #FF0000 0%, #00FF00 50%, #0000FF 70%, #FFFF00 100%);"; + "--before-background: linear-gradient(40deg, #FF0000 0%, #00FF00 50%, #0000FF 70%, #FFFF00 100%);";
export const esper_topics = (chip_id: string) => ({ export const esper_topics = (chip_id: string, name: string) => ({
[ `esper_${chip_id}_version` ]: { [ `esper_${name}_version` ]: {
state: `/service/esper/${chip_id}/info`, state: `/service/esper/${chip_id}/info`,
command: "", command: "",
defaultValue: "UNKNOWN", defaultValue: "UNKNOWN",
values: {}, values: {},
parseState: msg => JSON.parse(msg.toString()).version.esper parseState: msg => JSON.parse(msg.toString()).version.esper
},
[ `esper_${name}_ip` ]: {
state: `/service/esper/${chip_id}/info`,
command: "",
defaultValue: "UNKNOWN",
values: {},
parseState: msg => JSON.parse(msg.toString()).network.ip
},
[ `esper_${name}_rssi` ]: {
state: `/service/esper/${chip_id}/info`,
command: "",
defaultValue: "UNKNOWN",
values: {},
parseState: msg => JSON.parse(msg.toString()).wifi.rssi
},
[ `esper_${name}_uptime` ]: {
state: `/service/esper/${chip_id}/info`,
command: "",
defaultValue: "UNKNOWN",
values: {},
parseState: msg => new Date(JSON.parse(msg.toString()).time.startup * 1000)
.toLocaleString()
},
[ `esper_${name}_device` ]: {
state: `/service/esper/${chip_id}/info`,
command: "",
defaultValue: "UNKNOWN",
values: {},
parseState: msg => JSON.parse(msg.toString()).device
} }
}); });
export const esper_statistics = (chip_id: string, export const esper_statistics = (name: string,
prev_ui: Array<ControlUI> = []) => ( prev_ui: Array<ControlUI> = []) => (
prev_ui.concat([ prev_ui.concat([
{ {
type: "section", type: "section",
text: "Funkdose" text: "Funkdose"
}, },
{
type: "text",
text: "Device Variant",
icon: "chart-donut",
topic: `esper_${name}_device`
},
{ {
type: "text", type: "text",
text: "Version", text: "Version",
topic: `esper_${chip_id}_version` icon: "source-branch",
topic: `esper_${name}_version`
},
{
type: "text",
text: "IP",
icon: "access-point-network",
topic: `esper_${name}_ip`
},
{
type: "text",
text: "RSSI",
icon: "wifi",
topic: `esper_${name}_rssi`
},
{
type: "text",
text: "Running since…",
icon: "av-timer",
topic: `esper_${name}_uptime`
} }
]) ])
); );

View file

@ -35,7 +35,7 @@ class App extends React.Component<AppProps & Classes, AppState> {
this.state = { this.state = {
selectedControl: null, selectedControl: null,
drawerOpened: false, drawerOpened: false,
mqttState: _.mapValues(props.config.topics, (topic) => ({ mqttState: _.mapValues(this.topics, (topic) => ({
actual: topic.defaultValue, actual: topic.defaultValue,
internal: keyOf(topic.values, topic.defaultValue) internal: keyOf(topic.values, topic.defaultValue)
})), })),
@ -44,12 +44,17 @@ class App extends React.Component<AppProps & Classes, AppState> {
onConnect: () => this.setState({ mqttConnected: true }), onConnect: () => this.setState({ mqttConnected: true }),
onReconnect: () => this.setState({ mqttConnected: false }), onReconnect: () => this.setState({ mqttConnected: false }),
onDisconnect: () => this.setState({ mqttConnected: false }), onDisconnect: () => this.setState({ mqttConnected: false }),
subscribe: _.map(props.config.topics, (x) => x.state) subscribe: _.map(this.topics, (x) => x.state)
}), }),
mqttConnected: false mqttConnected: false
}; };
} }
get topics(): Topics {
return Array.isArray(this.props.config.topics) ?
Object.assign({}, ...this.props.config.topics) : this.props.config.topics;
}
static styles(_theme: Object) { static styles(_theme: Object) {
return { return {
drawerPaper: { drawerPaper: {
@ -67,21 +72,24 @@ class App extends React.Component<AppProps & Classes, AppState> {
} }
receiveMessage(rawTopic: string, message: Object) { receiveMessage(rawTopic: string, message: Object) {
const topic = _.findKey( const topics = _.filter(
this.props.config.topics, _.keys(this.topics),
(v) => v.state === rawTopic (k) => this.topics[k].state === rawTopic
); );
if (topic == null) { if (topics.length === 0) {
return; return;
} }
const parseValue = this.props.config.topics[topic].parseState; for (let i in topics) {
const value = parseValue == null ? message.toString() : parseValue(message); const topic = topics[i];
const parseValue = this.topics[topic].parseState;
const val = parseValue == null ? message.toString() : parseValue(message);
this.setState({mqttState: _.merge(this.state.mqttState, this.setState({mqttState: _.merge(this.state.mqttState,
{ [topic]: { { [topic]: {
actual: value, actual: val,
internal: keyOf(this.props.config.topics[topic].values, value) || value internal: keyOf(this.topics[topic].values, val) || val
}})}); }})});
} }
}
changeControl(control: ?Control = null) { changeControl(control: ?Control = null) {
this.setState({selectedControl: control, drawerOpened: control != null}); this.setState({selectedControl: control, drawerOpened: control != null});
@ -92,13 +100,13 @@ class App extends React.Component<AppProps & Classes, AppState> {
} }
changeState(topic: string, value: Actual) { changeState(topic: string, value: Actual) {
const rawTopic = this.props.config.topics[topic].command; const rawTopic = this.topics[topic].command;
if (rawTopic == null) { if (rawTopic == null) {
return; return;
} }
this.state.mqttSend( this.state.mqttSend(
rawTopic, rawTopic,
String(this.props.config.topics[topic].values[value] || value) String(this.topics[topic].values[value] || value)
); );
} }

View file

@ -209,8 +209,8 @@ export class Section extends UiItem<UISection> {
export class Text extends UiControl<UIText> { export class Text extends UiControl<UIText> {
render() { render() {
return [ return [
<ListItemText key="label" primary={this.props.item.text} />, <ListItemText key="label" secondary={this.props.item.text} />,
<ListItemText key="val" secondary={this.getValue().internal} /> <ListItemText key="vr" primary={this.getValue().internal} align="right" />
]; ];
} }
} }

View file

@ -111,7 +111,7 @@ declare type Controls = Map<string,Control>;
declare type Config = { declare type Config = {
space: Space, space: Space,
topics: Topics, topics: Topics | Array<Topics>,
controls: Controls, controls: Controls,
layers: Array<Layer> layers: Array<Layer>
}; };