RFLink binding

After upgrade to 2.1.0-SNAPSHOT Build #839 I’ve got Serial binding working again and I want to share my quite simple setup.

Currently I’m interested only in temperature readings from my outdoor LaCrosse sensor. Other devices like neighbor’s doorbells could be added easily :wink:
Items:

String RFLinkRaw	"RFLink raw data [%s]" <text> { serial="/dev/ttyUSB0@57600" }
Number TemperatureOut "Outside temperature (RFLink) [%.1f °C]" <temperature>

Rules:

// Lambda to convert temperature readings
val Functions$Function1<Number, BigDecimal> convertTemp = [ tempData |
	if (tempData < 32768) { tempData/10 }
	else { (32768 - tempData)/10 }
]

rule "RFLink"
when
    Item RFLinkRaw received update
then
	logInfo("RFLink", "raw data received: " + RFLinkRaw.state)
	val RFbuffer = RFLinkRaw.state.toString.split(";")
//	val RFprefix = RFbuffer.get(0)
//	val RFstamp = RFbuffer.get(1)
	val RFvendor = RFbuffer.get(2)
	val RFidLong = RFbuffer.get(3)
	val RFdata = RFbuffer.get(4)
	val RFidHex = transform("REGEX", "ID=([0-9a-fA-F]*)", RFidLong)

	switch (RFvendor + " " + RFidHex) {
  		case "LaCrosse 0400" : {
			var String tempHex = transform("REGEX", "TEMP=([0-9a-f]{4})", RFdata)
			var int tempDec = Integer::parseInt(tempHex, 16)
			TemperatureOut.postUpdate(convertTemp.apply(tempDec)) }
		case "SomeDevice 0000" : {
			logInfo("RFLink", "some data received from " + RFvendor) }
  		default : logInfo("RFLink", "completely irrelevant data received from " + RFvendor)
		}
end
3 Likes