Skip to content
This repository has been archived by the owner on Sep 18, 2024. It is now read-only.

Commit

Permalink
some new features
Browse files Browse the repository at this point in the history
  • Loading branch information
treban committed Dec 16, 2017
1 parent 8a7d9d6 commit bc10caf
Show file tree
Hide file tree
Showing 5 changed files with 492 additions and 397 deletions.
8 changes: 4 additions & 4 deletions app/views/maxcul-heating-thermostat.jade
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ script#maxcul-heating-thermostat-template(type='text/template')
li.sortable.device.no-header.thermostat.maxcul(data-bind='css: {unsynced: !$data.synced()}')
label.device-label(data-bind="text: name, tooltip: $data.labelTooltipHtml")
.control-elements
<!-- ko if: $data.getConfig('guiShowValvePosition') -->
.valve-position
.valve-position-bar!='&nbsp'
<!-- /ko -->
.controls.no-carousel-slide
<!-- ko if: $data.getConfig('guiShowModeControl') -->
.button-control.ui-controlgroup.ui-controlgroup-horizontal.ui-corner-all.ui-mini.no-carousel-slide(data-role='controlgroup', data-type='horizontal', data-mini='true', data-enhanced='true')
Expand All @@ -31,6 +27,10 @@ script#maxcul-heating-thermostat-template(type='text/template')
a.ui-first-child.ui-last-child.ui-btn.ui-corner-all(name='transferConfigButton', data-bind='click: writeConfigToDevice') transfer config
<!-- /ko -->
.attributes
<!-- ko if: $data.getConfig('guiShowValvePosition') -->
.valve-position
.valve-position-bar!='&nbsp'
<!-- /ko -->
<!-- ko if: $data.getConfig('guiShowMeasuredTemperature') -->
span.measured-temperature(data-bind="template: {name: 'attribute-template', data: $data.device.getAttribute('measuredTemperature'), afterRender: $data.afterAttributeRender }")
<!-- /ko -->
Expand Down
113 changes: 66 additions & 47 deletions max-driver.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,14 @@ module.exports = (env) ->
#Holds the instance of the communication-layer
@comLayer

#Supportet device types
@deviceTypes = [
"Cube",
"HeatingThermostat",
"HeatingThermostatPlus",
"WallMountedThermostat",
"ShutterContact",
"PushButton"
]
@_waitingForReplyQueue = []
@msgCount
@pairModeEnabled

constructor: (baseAddress, pairModeEnabled, serialPortName, baudrate) ->
constructor: (baseAddress, serialPortName, baudrate) ->
@baseAddress = baseAddress
@msgCount = 0
@pairModeEnabled = pairModeEnabled
@pairModeEnabled = false

@comLayer = new CommunicationServiceLayer(baudrate, serialPortName, @baseAddress)
@comLayer.on("culDataReceived", (data) =>
Expand All @@ -52,9 +43,26 @@ module.exports = (env) ->
connect: () ->
return @comLayer.connect()

enablePairMode: () ->
@pairModeEnabled = true
setTimeout =>
@pairModeEnabled = false
, 1000 * 30

disconnect: ->
return @comLayer.disconnect()

getDeviceId: (dev) ->
#Supportet device types
@deviceTypes =
Cube : 0
HeatingThermostat : 1
HeatingThermostatPlus : 2
WallMountedThermostat : 3
ShutterContact : 4
PushButton : 5
return if dev of @deviceTypes then @deviceTypes[dev] else 255

decodeCmdId: (id) ->
key = "cmd"+id
@commandList =
Expand Down Expand Up @@ -226,20 +234,27 @@ module.exports = (env) ->
@sendMsg("03",@baseAddress,dest,payload,"00","04",deviceType);

sendGroup: (dest, groupId, deviceType) ->
<<<<<<< HEAD
@sendMsg("22",@baseAddress,dest,groupId,"00","00",deviceType);

sendPair: (dest, pairId, pairTyp, deviceType) ->
payload = Sprintf('%s%02x',pairId,pairTyp)
env.logger.debug "send Pair packet #{payload} "
removeGroup: (dest, groupId, deviceType) ->
@sendMsg("23",@baseAddress,dest,"00","00","00",deviceType);

sendPair: (dest, pairId, pairType, deviceType) ->
type= @getDeviceId(pairType)
payload = Sprintf('%s%02x',pairId,type)
@sendMsg("20",@baseAddress,dest,payload,"00","00",deviceType);
=======
payload = Sprintf('%02x', groupId)
@sendMsg("22",@baseAddress,dest,payload,"00","00",deviceType);

sendPair: (dest, pairId, deviceType) ->
@sendMsg("20",@baseAddress,dest,pairId,"00","00",deviceType);
>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe
removePair: (dest, pairId, pairType, deviceType) ->
type= @getDeviceId(pairType)
payload = Sprintf('%s%02x',pairId,type)
@sendMsg("21",@baseAddress,dest,payload,"00","00",deviceType);

sendDisplayMode: (dest, dmode, deviceType) ->
state = if dmode then "04" else "00"
@sendMsg("82",@baseAddress,dest,state,"00","00",deviceType);

sendFactoryReset: (dest, deviceType) ->
@sendMsg("F0",@baseAddress,dest,"","00","00",deviceType);

sendConfig: (dest,comfortTemperature,ecoTemperature,minimumTemperature,maximumTemperature,offset,windowOpenTime,windowOpenTemperature,deviceType) ->
comfortTemperatureValue = Sprintf('%02x',(comfortTemperature*2))
Expand All @@ -254,6 +269,35 @@ module.exports = (env) ->
@sendMsg("11",@baseAddress,dest,payload,"00","00",deviceType)
return Promise.resolve true

sendShutterMessage: (dest, src, event, groupId, deviceType) ->
state = if event then "10" else "12"
if groupId == "00"
return @sendMsg("30",src,dest,state,"00","00",deviceType);
else
return @sendMsg("30",src,dest,state,groupId,"06",deviceType);

sendTemperatureMessage: (dest, measuredTemp, desiredTemp, groupId, deviceType) ->

if measuredTemp < 0
measuredTemp = 0
if measuredTemp > 51
measuredTemp = 51

if desiredTemp <= 4.5
desiredTemp = 4.5
if desiredTemp >= 30.5
desiredTemp = 30.5

val2 = measuredTemp * 10
val1 = ((val2 & 0x100)>>1) | ((desiredTemp * 2) & 0x7F)
val2 = val2 & 0xFF
payload = Sprintf('%02x%02x',$val1,$val2)

if groupId == "00"
return @sendMsg("42",@baseAddress,dest,payload,"00","00",deviceType);
else
return @sendMsg("42",@baseAddress,dest,payload,groupId,"04",deviceType);

sendDesiredTemperature: (dest,temperature,mode,groupId,deviceType) ->
modeBin = switch mode
when 'auto'
Expand Down Expand Up @@ -293,8 +337,6 @@ module.exports = (env) ->
else
return @sendMsg("40",@baseAddress,dest,payloadHex,groupId,"04",deviceType);

#return Promise.resolve true

parseTemperature: (temperature) ->
if temperature == 'on'
return 30.5
Expand All @@ -319,6 +361,7 @@ module.exports = (env) ->
else if ( packet.getDest() == "000000" ) #The device is new and needs a full pair
env.logger.debug "beginn pairing of a new device with deviceId #{packet.getSource()}"
@sendMsg("01", @baseAddress, packet.getSource(), "00", "00", "00", "")
@.emit('NewDevice',packet.getSource())
else
env.logger.debug ", but pairing is disabled so ignore"

Expand Down Expand Up @@ -358,7 +401,6 @@ module.exports = (env) ->
env.logger.debug "got data from push button #{packet.getSource()} #{rawBitData.toString()}"
@.emit('PushButtonStateRecieved',pushButtonState)


WallThermostatState: (packet) ->
env.logger.debug "got data from wallthermostat state #{packet.getSource()} with payload #{packet.getRawPayload()}"

Expand All @@ -376,11 +418,7 @@ module.exports = (env) ->
WallthermostatState =
src : packet.getSource()
mode : rawBitData.getRange(0,1)
<<<<<<< HEAD
desiredTemperature : (('0x'+(packet.getRawPayload().substr(4,2))) & 0x7F) / 2.0
=======
desiredTemperature : ('0x'+(packet.getRawPayload().substr(4,2))) & 0x7F) / 2.0
>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe
measuredTemperature : 0
dstSetting : rawBitData.get(3)
langateway : rawBitData.get(4)
Expand All @@ -393,47 +431,28 @@ module.exports = (env) ->
desiredRaw = '0x'+(packet.getRawPayload().substr(0,2))
measuredRaw = '0x'+(packet.getRawPayload().substr(2,2))
desired = (desiredRaw & 0x7F) / 2.0
<<<<<<< HEAD
measured = ((((desiredRaw & 0x80)*1)<<1) | (measuredRaw)*1) / 10.0

env.logger.debug "got data from wallthermostat #{packet.getSource()} desired temp: #{desired} - measured temp: #{measured}"
=======
measured = ((((desiredRaw & 0x80)*1)<<1) | (measuredRaw)*1)
env.logger.debug parseInt(measured) / 10
>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe

WallThermostatControl =
src : packet.getSource()
desired : desired
measured : measured
<<<<<<< HEAD
@.emit('WallThermostatControlRecieved',WallThermostatControl)
=======
@.emit('WallThermostatControlRecieved',wallSetTemp)

env.logger.debug "got data from wallthermostat #{packet.getSource()} desired temp: #{desired} - measured temp: #{measured}"
>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe

WallThermostatSetTemp: (packet) ->
setTemp = ('0x'+packet.getRawPayload() & 0x3f) / 2.0
mode = ('0x'+packet.getRawPayload())>>6

<<<<<<< HEAD
env.logger.debug "got data from wallthermostat #{packet.getSource()} set new temp #{setTemp} mode #{mode}"

=======
>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe
wallSetTemp =
src : packet.getSource()
mode : mode
temp : setTemp
@.emit('WallThermostatSetTempRecieved',wallSetTemp)

<<<<<<< HEAD
=======
env.logger.debug "got data from wallthermostat #{packet.getSource()} set new temp #{setTemp} mode #{mode}"

>>>>>>> 115f3a030020738f8744f2d1492d7f768c6763fe
ThermostatState: (packet) ->
env.logger.debug "got data from heatingelement #{packet.getSource()} with payload #{packet.getRawPayload()}"

Expand Down
4 changes: 0 additions & 4 deletions maxcul-config-schema.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@ module.exports = {
doc: "The Address of this basestation in the MAX! System Default (123456)"
type: "string"
default: "123456"
enablePairMode:
doc: "Enabled the pair mode, should be false for production because it could interfere with your neighbours"
type: "boolean"
default: false
debug:
doc: "Enabled debug messages"
type: "boolean"
Expand Down
Loading

0 comments on commit bc10caf

Please sign in to comment.