Det finns ingen "mjukvara" kategori, men här är node.js

Moderator: Telldus

Post Reply
joche
Posts: 11
Joined: Fri Mar 17, 2023 9:45 am

Det finns ingen "mjukvara" kategori, men här är node.js

Post by joche »

Jag tänkte dela med mig, det här forumet känns inte så aktivt, men de flesta frågorna har faktiskt fått svar. Om det är någon mer som gör sin egen mjukvara och som vet ett annat forum där man kan diskutera just telldus relaterade mjukvarusaker så tipsa mig gärna. Annats hjälper jag gärna till med node.js & rPI relaterade frågor.

Mitt system byggs i en raspberry PI med node.js som webserver och MongoDB som databas. Jag har kring tio enheter som jag använder men det är fortfarande i sin linda.

Min tellstick.conf ser ut som de flestas:

Code: Select all

device {
  id = 1
  name = "Hallampa"
  controller = 0
  protocol = "arctech"
  model = "selflearning-dimmer"
  parameters {
    house = "1245618"
    unit = "11"
  }
}
Sen har jag i min serverapp (server.js) ytterligaren en abstraktionsnivå för de enheter som så behöver. I exemplet nedan är det min enda väggsändare som är en-kanalig, därav det "unika" namnet "white single switch". De spännande med koden är två saker:
a) Jag indexerar på house + "-" + unit för att hitta rätt device, detta eftersom jag lyssnar på alla raw-events, mer om det nedan
b) Notera "actions"-objectet. Det innehåller saker som skall ske när de olika metoderna för sändaren kommer, i det här fallet har vi "turnon" och "turnoff". Dessa i sin tur innehåller en array med actions (method) som skall göras när de triggas. Methods i denna config är "log" och "dbset".

Code: Select all

devices = {
	'12547754-16': {
		"name": "Balkongdörren",
		"actions": {
			"turnon": [{
				"method": "log",
				"message": "Balkongdörren öppnades"
			}, {
				"method": "dbset",
				"type": "door",
				"key": "BalconyDoor",
				"status": true,
				"statusString": "öppen"
			}],
			"turnoff": [{
				"method": "log",
				"message": "Balkongdörren stängdes"
			}, {
				"method": "dbset",
				"type": "door",
				"key": "BalconyDoor",
				"status": false,
				"statusString": "stäng"
			}]
		}
	}
}
Sen, istället för att sätta upp en listener för varje device valde jag att lyssna på allt:

Code: Select all

var listener = telldus.addRawDeviceEventListener(function(deviceId, data) {
	var pairs = data.split(";");
	var data = {};
	for (idx in pairs) {
		var s = pairs[idx].split(":");
		data[s[0]] = s[1];
	}
}
Sen kan man börja kolla "data" objektet efter grejer, till exempel sensorer:

Code: Select all

if (data.protocol == 'fineoffset') {
	global.temp[data.model] = data.temp;
   } else {
	// Check if it's in our list of devices
	var sensor = devices[data.house + "-" + data.unit];
	if (sensor != null) {
                  // Här händer det grejer :-)
    }
}
Som syns i koden ovan håller jag isär mina sensorer från mina enheter: är det ingen sensor så kollar jag om house +"-" + unit finns i mitt devices-objekt. OM det gör det kan det se ut såhär:

Code: Select all

var actionList = sensor.actions[data.method];
if (null !== actionList) {
	for (idx in actionList) {
		var a = actionList[idx];
	}
}
Actionlist här är då allt som skall ske, i exemplet vi följer är det "log" och "dbset" som är de olika actions vi vill om du minns från ovan:

Code: Select all

[{
	"method": "log",
	"message": "Balkongdörren öppnades"
}, {
	"method": "dbset",
	"type": "door",
	"key": "BalconyDoor",
	"status": true,
	"statusString": "öppen"
}]
Så koden som verkligen gör något när det kommer in rätt event ser ut såhär:

Code: Select all

if (null !== actionList) {
	for (idx in actionList) {
		var a = actionList[idx];
		switch (a.method) {
			case "off": {
				telldus.turnOff(a.id, function(err) {
					if (err) {
						console.log("Error:" + err)
					} else {
						console.log("Turned off device id" + a.id);
					}
				})
			}
			break;

			case "dbset" : {
				db.collection("anothercollection").update({
					"key": a.key
				}, {
					"date": new Date(),
					"status": a.status,
					"statusString": a.statusString,
					"key": a.key
				}, {
					upsert: true
				}, function(err) {
					if (err) console.log(err);
				})

			}
			break;
		}
	}
}
Post Reply