mqtt: always send globally, always retain, thermostat und windowContact completed
This commit is contained in:
@ -7,14 +7,18 @@ import { MaxWindowContact } from './MaxWindowContact';
|
||||
const WINDOW_OPEN_TEMPERATURE = 4.5
|
||||
|
||||
|
||||
type WindowContactHolder = {
|
||||
windowContact : MaxWindowContact
|
||||
state : string
|
||||
}
|
||||
|
||||
export class MaxThermostat extends AHomematicItem {
|
||||
private actionTopic: string
|
||||
private deviceFeedbackTopic: string
|
||||
private temperatureFeedbackTopic: string
|
||||
private temperatureTopic: string
|
||||
private temperature: number
|
||||
private windowContacts: MaxWindowContact[]
|
||||
private windowContactTopics: string[]
|
||||
private windowContactMap: { [key:string]: WindowContactHolder }
|
||||
private windowOpen: boolean
|
||||
// Thermostat: homegear/instance1/set/3/1/SET_TEMPERATURE
|
||||
|
||||
@ -28,32 +32,34 @@ export class MaxThermostat extends AHomematicItem {
|
||||
this.temperatureTopic,
|
||||
this.deviceFeedbackTopic
|
||||
]
|
||||
this.windowContacts = windowContacts
|
||||
this.windowOpen = false
|
||||
this.windowContactTopics = []
|
||||
this.windowContacts.forEach((windowContact) => {
|
||||
this.windowContactMap = {}
|
||||
windowContacts.forEach((windowContact) => {
|
||||
this.subscribeTopics.push(windowContact.getStateFeedbackTopic())
|
||||
this.windowContactTopics.push(windowContact.getStateFeedbackTopic())
|
||||
this.windowContactMap[windowContact.getStateFeedbackTopic()] = { windowContact: windowContact, state: 'unknown' }
|
||||
})
|
||||
}
|
||||
|
||||
processMessage(topic: string, payload: string) : void {
|
||||
if (topic == this.temperatureTopic) {
|
||||
if ((topic == this.temperatureTopic) || (topic == this.deviceFeedbackTopic)) {
|
||||
this.temperature = parseFloat(payload)
|
||||
mqttHandler.send(this.temperatureFeedbackTopic, `${this.temperature}`)
|
||||
mqttHandler.send(this.actionTopic, `${this.temperature}`)
|
||||
} else if (topic == this.deviceFeedbackTopic) {
|
||||
this.temperature = parseFloat(payload)
|
||||
mqttHandler.send(this.temperatureFeedbackTopic, `${this.temperature}`)
|
||||
} else if (this.windowContactTopics.indexOf(topic) >= 0) {
|
||||
if (payload == 'CLOSED') {
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
} else if (topic in this.windowContactMap) {
|
||||
this.windowContactMap[topic].state = payload
|
||||
this.windowOpen = false
|
||||
Object.values(this.windowContactMap).forEach((w) => {
|
||||
if (w.state == 'OPEN') {
|
||||
this.windowOpen = true
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if (! this.windowOpen) {
|
||||
mqttHandler.send(this.temperatureFeedbackTopic, `${this.temperature}`)
|
||||
mqttHandler.send(this.actionTopic, `${this.temperature}`)
|
||||
} else {
|
||||
mqttHandler.send(this.temperatureFeedbackTopic, `${WINDOW_OPEN_TEMPERATURE}`)
|
||||
mqttHandler.send(this.actionTopic, `${WINDOW_OPEN_TEMPERATURE}`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user