Det finns ingen "mjukvara" kategori, men här är node.js
Posted: Fri Mar 17, 2023 9:45 am
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:
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".
Sen, istället för att sätta upp en listener för varje device valde jag att lyssna på allt:
Sen kan man börja kolla "data" objektet efter grejer, till exempel sensorer:
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:
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:
Så koden som verkligen gör något när det kommer in rätt event ser ut såhär:
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"
}
}
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"
}]
}
}
}
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];
}
}
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 :-)
}
}
Code: Select all
var actionList = sensor.actions[data.method];
if (null !== actionList) {
for (idx in actionList) {
var a = actionList[idx];
}
}
Code: Select all
[{
"method": "log",
"message": "Balkongdörren öppnades"
}, {
"method": "dbset",
"type": "door",
"key": "BalconyDoor",
"status": true,
"statusString": "öppen"
}]
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;
}
}
}