Endlich habe ich eine Kostengünstige Lösung gefunden um ziemlich viele Druckknöpfen verwenden zu können ohne eine Riesenanzahl von Loxone Erweiterungen kaufen zu müssen. Mittlerweile gibt es jetzt auch eine reine Inputmodule von Loxone, aber ist noch ziemlich teuer wenn viele Inputs nötig sind.
Die Lösung besteht aus einem Raspberry Pi, und dann 16 Optocoupled input module von ERE, welche verbunden sind mit dem Raspberry Pi über I2C.
Damit habe ich 16 x 8 = 128 Inputs!
Auf dem Raspberry Pi habe ich nodeJS installiert mit einem Script das die I2C ausliest und dann über UDP weiterleitet an Loxone.
Raspberry PI mit Gehäuse: +/- 50 euro
ERE Modulen: +/- 600 euro
ERE Modulen habe ich hier gekauft:
Ich habe da 8 normale und 8 mit A gekauft. (Von einem Typ können nur 8 auf eine Bus, die A hat eine andere Busreferenz, somit man dann bis auf 16 gehen kann).
Die Inputs sind einfach auf 24V verbunden. Ich brauchte die höhere Voltage da wir CAT5 Kabel verwendet hatten (not shielded), und somit auf niedrigen Voltages (wie 5 oder 3.3) würden wir zu viele Falschsignale bekommen.
Hier einige Bilder und mein node Script:
Node Script:
#!/usr/bin/env node var PCF8574 = require('pcf8574').PCF8574; var i2cBus = require('i2c-bus').openSync(1); var Promise = require('bluebird'); var dgram = require('dgram'); var client = dgram.createSocket('udp4'); var LoxPort = '7000'; var LoxHost = '192.168.1.100'; var pcfSlaves = i2cBus.scanSync(); var pcfs = []; var pins = []; pcfSlaves.forEach(function(pcfSlave) { pcfs.push(new PCF8574(i2cBus, pcfSlave, true)); }); var callLoxone = function(pcf, pin){ //console.log('PCF ' + pcf.toString() + ': pushed on button: ' + pin.toString()); var message = new Buffer('input_' + pcf.toString() + '_' + pin.toString()); client.send(message, 0, message.length, LoxPort, LoxHost, function(err, bytes) { if (err) throw err; }); }; console.log('Starting...'); for (var pcf = 0; pcf < pcfs.length; pcf++) { pcfs[pcf].enableInterrupt(17); !function outer(pcfNr) { pcfs[pcf].on('input', function(data){ if (data.value === false) callLoxone(pcfNr, data.pin); }); }(pcf) for (var pin = 0; pin < 8; pin++) { pins.push({ pin: pin, pcf: pcfs[pcf] }); } } Promise.mapSeries(pins, function(pin) { return pin.pcf.inputPin(pin.pin, false); }).then(function(result){ console.log('READY'); }); process.on('SIGINT', function(){ client.close(); for(var pcf=0; pcf<pcfs.length; pcf++) { pcfs[pcf].removeAllListeners(); pcfs[pcf].disableInterrupt(); } });
Grüsse,
Reno
Kommentar