Hi Chris,
das Problem besteht weniger beim basteln als viel mehr beim Fahren mit dem Offroadmobil. Durch Vibrationen kann es immer zu einem Verbindungsabbruch kommen und ich merke das nur dadurch, dass zum Beispiel das Licht nicht mehr geht. Es wäre schön, wenn ich hier eine Fehlermeldung auf meinem IO-Broker generieren könnte indem das Javascrip eine Variable im Fehlerfall ändert.
Ich bin eher der C++ Programmierer, daher habe ich Javascript sicher falsch verwendet. Ich würde mich sehr darüber freuen, wenn mir jemand helfen könnte.
var Tinkerforge = require('tinkerforge');
var HOST = '192.168.0.20';
var PORT = 4223;
var UID1 = 'Mkj' //Industrial Dual Analog In Bricklet 2.0 Port C MasterBrick 2
var UID2 = 'Mmh' //Industrial Dual Analog In Bricklet 2.0 Port D MasterBrick 2
var UID3 = 'H2J'; // Industrial Digital Out 4 Bricklet 2.0 Port D MasterBrick 1
var UID4 = 'H3C'; // Industrial Digital Out 4 Bricklet 2.0 Port C MasterBrick 1
var UID5 = 'Q6m'; // IO-16 Bricklet 2.0 Port A MasterBrick 1
var UID6 = '2gaETX'; // IO-16 Bricklet 2.0 Port B MasterBrick 1
var UID7 = 'Qvu' //Temperature Bricklet 2.0 Port A MasterBrick 2
var UID8 = 'R2J' //LCD 128x64 Bricklet Port B MasterBrick 2
var UID9 = '6KTNip' //MasterBrick 1
var UID10 = '69DeZc' //MasterBrick 2
var UID11 = '6feC5Q' //MasterBrick 3
var UID12 = 'R2V'; // Change XYZ to the UID of your OLED 128x64 Bricklet
var UID13 = 'RzB'; // Industrial quad relais Bricklet
var UID14 = '6CQzJH'; //IMU Bricklet
var SCREEN_WIDTH = 128;
var SCREEN_HEIGHT = 64;
var A0duty = 0;
var A1duty = 0;
var A2duty = 0;
var A3duty = 0;
var A4duty = 0;
var A5duty = 0;
var A6duty = 0;
var A7duty = 0;
var m1;
var m2;
var m3;
var BalkenFWlinks;
var ProzentFWlinks;
var BalkenFWrechts;
var ProzentFWrechts;
var BalkenAbwasser;
var ProzentAbwasser;
var m1_1;
var m2_1;
var m3_1;
var ipcon = new Tinkerforge.IPConnection(); // Create IP connection
var idai1 = new Tinkerforge.BrickletIndustrialDualAnalogInV2(UID1, ipcon); // Create device object
var idai2 = new Tinkerforge.BrickletIndustrialDualAnalogInV2(UID2, ipcon); // Create device object
var ido1 = new Tinkerforge.BrickletIndustrialDigitalOut4V2(UID3, ipcon); // Create device object
var ido2 = new Tinkerforge.BrickletIndustrialDigitalOut4V2(UID4, ipcon); // Create device object
var ido3 = new Tinkerforge.BrickletIO16V2(UID5, ipcon); // Create device object
var ido4 = new Tinkerforge.BrickletIO16V2(UID6, ipcon); // Create device object
var t = new Tinkerforge.BrickletTemperatureV2(UID7, ipcon);
var ma1 = new Tinkerforge.BrickMaster(UID9, ipcon); //MasterBrick1
var ma2 = new Tinkerforge.BrickMaster(UID10, ipcon); //MasterBrick2
var ma3 = new Tinkerforge.BrickMaster(UID11, ipcon); //MasterBrick3
var lcd = new Tinkerforge.BrickletLCD128x64(UID12, ipcon); // Create device object
var iqr = new Tinkerforge.BrickletIndustrialQuadRelayV2(UID13, ipcon); // Create device object
var imu = new Tinkerforge.BrickIMUV2(UID14, ipcon); // Create device object
ipcon.connect(HOST, PORT,
function (error) {
console.log('Error: ' + error);
}
);
function roundTo(value, places){
var power = Math.pow(10, places);
return Math.round(value * power) / power;
}
ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
function (connectReason) {
//IO16 Als Ausgänge setzen
// Outputs 0-7 als Ausgang mit Startwert "true" konfigurieren
//Outputs Wasserventile Steuerung
ido3.setConfiguration(0, 'o', true);
ido3.setConfiguration(1, 'o', true);
ido3.setConfiguration(2, 'o', true);
ido3.setConfiguration(3, 'o', true);
ido3.setConfiguration(4, 'o', true);
ido3.setConfiguration(5, 'o', true);
ido3.setConfiguration(6, 'o', true);
//Outputs Druckwasserpumpe
ido3.setConfiguration(7, 'o', true);
//Eingänge Schalter nr. 1 Seitenklappe links
ido3.setConfiguration(8, 'i', true);
ido3.setInputValueCallbackConfiguration(8, 100, true);
//Eingänge Schalter nr. 2 Seitenklappe links
ido3.setConfiguration(9, 'i', true);
ido3.setInputValueCallbackConfiguration(9, 100, true);
//Eingänge Schalter nr. 3 Seitenklappe links
ido3.setConfiguration(10, 'i', true);
ido3.setInputValueCallbackConfiguration(10, 100, true);
//Eingänge Schalter nr. 4 Seitenklappe links
ido3.setConfiguration(11, 'i', true);
ido3.setInputValueCallbackConfiguration(11, 100, true);
//Eingänge Schalter nr. 5 Seitenklappe links
ido3.setConfiguration(12, 'i', true);
ido3.setInputValueCallbackConfiguration(12, 100, true);
//Eingänge Schalter nr. 6 Seitenklappe links
ido3.setConfiguration(13, 'i', true);
ido3.setInputValueCallbackConfiguration(13, 100, true);
//Eingänge Schalter nr. 7 Seitenklappe links
ido3.setConfiguration(14, 'i', true);
ido3.setInputValueCallbackConfiguration(14, 100, true);
//Eingänge Schalter nr. 8 Seitenklappe links
ido3.setConfiguration(15, 'i', true);
ido3.setInputValueCallbackConfiguration(15, 100, true);
//Eingänge Schalter nr. 9 Seitenklappe links
ido4.setConfiguration(0, 'i', true);
ido4.setInputValueCallbackConfiguration(0, 100, true);
//Eingänge Eingangstür Reedkontakt
ido4.setConfiguration(1, 'i', true);
ido4.setInputValueCallbackConfiguration(1, 100, true);
//Eingänge Bedienpanel
ido4.setConfiguration(3, 'i', true);
ido4.setInputValueCallbackConfiguration(3, 100, true);
ido4.setConfiguration(4, 'i', true);
ido4.setInputValueCallbackConfiguration(4, 100, true);
ido4.setConfiguration(5, 'i', true);
ido4.setInputValueCallbackConfiguration(5, 100, true);
ido4.setConfiguration(6, 'i', true);
ido4.setInputValueCallbackConfiguration(6, 100, true);
ido4.setConfiguration(7, 'i', true);
ido4.setInputValueCallbackConfiguration(7, 100, true);
//Eingänge abfragen
// Register input value callback
ido3.on(Tinkerforge.BrickletIO16V2.CALLBACK_INPUT_VALUE,
// Callback function for input value callback
function (channel, changed, value) {
if(channel === 8){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter1'/*Schalter1*/,!value);
}
if(channel === 9){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter2'/*Schalter2*/,!value);
}
if(channel === 10){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter3'/*Schalter3*/,!value);
}
if(channel === 11){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter4'/*Schalter4*/,!value);
}
if(channel === 12){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter5'/*Schalter5*/,!value);
}
if(channel === 13){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter6'/*Schalter6*/,!value);
}
if(channel === 14){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter7'/*Schalter7*/,!value);
}
if(channel === 15){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter8'/*Schalter8*/,!value);
}
}
);
//Callbackeingänge 16IO
ido4.on(Tinkerforge.BrickletIO16V2.CALLBACK_INPUT_VALUE,
// Callback function for input value callback
function (channel, changed, value) {
if(channel === 0){
setState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter9'/*Schalter9*/,!value);
}
if(channel === 1){
setState('0_userdata.0.Tinkerforge.Eingangstür.Reedkontakt'/*Reedkontakt*/,!value);
}
if(channel === 3){
setState('0_userdata.0.Tinkerforge.Bedienpanel.BedienpanelSchalter1'/*BedienpanelSchalter1*/,!value);
}
if(channel === 4){
setState('0_userdata.0.Tinkerforge.Bedienpanel.BedienpanelSchalter2'/*BedienpanelSchalter2*/,!value);
}
if(channel === 5){
setState('0_userdata.0.Tinkerforge.Bedienpanel.BedienpanelSchalter3'/*BedienpanelSchalter3*/,!value);
}
if(channel === 6){
setState('0_userdata.0.Tinkerforge.Bedienpanel.BedienpanelSchalter4'/*BedienpanelSchalter4*/,!value);
}
if(channel === 7){
setState('0_userdata.0.Tinkerforge.Bedienpanel.BedienpanelSchalterLandstrom'/*BedienpanelSchalterLandstrom*/,!value);
}
}
);
setInterval(function(){
//Temperatursensor am Bedienpanel
t.getTemperature(function (temperature) {
setState('0_userdata.0.Tinkerforge.Bedienpanel.Temperatur1'/*Temperatur1*/,roundTo((temperature/100.0)-0.5, 1));
},
);
//Diagnose LEDs
if(getState('0_userdata.0.Tinkerforge.Diagnose').val ===true) {
lcd.setStatusLEDConfig(1);
ma1.enableStatusLED();
ma2.enableStatusLED();
ma3.enableStatusLED();
ido1.setStatusLEDConfig(1);
ido2.setStatusLEDConfig(1);
ido3.setStatusLEDConfig(1);
ido4.setStatusLEDConfig(1);
t.setStatusLEDConfig(1);
ido1.setChannelLEDConfig(0,3);
ido1.setChannelLEDConfig(1,3);
ido1.setChannelLEDConfig(2,3);
ido1.setChannelLEDConfig(3,3);
ido2.setChannelLEDConfig(0,3);
ido2.setChannelLEDConfig(1,3);
ido2.setChannelLEDConfig(2,3);
ido2.setChannelLEDConfig(3,3);
idai1.setChannelLEDConfig(0,1);
idai1.setChannelLEDConfig(1,1);
idai2.setChannelLEDConfig(0,1);
idai2.setChannelLEDConfig(1,1);
idai1.setStatusLEDConfig(1);
idai2.setStatusLEDConfig(1);
//iqr.setStatusLEDConfig(1);
iqr.setChannelLEDConfig(0,3);
iqr.setChannelLEDConfig(1,3);
iqr.setChannelLEDConfig(2,3);
iqr.setChannelLEDConfig(3,3);
}
if(getState('0_userdata.0.Tinkerforge.Diagnose').val ===false) {
lcd.setStatusLEDConfig(0);
ma1.disableStatusLED();
ma2.disableStatusLED();
ma3.disableStatusLED();
ido1.setStatusLEDConfig(0);
ido2.setStatusLEDConfig(0);
ido3.setStatusLEDConfig(0);
ido4.setStatusLEDConfig(0);
t.setStatusLEDConfig(0);
ido1.setChannelLEDConfig(0,0);
ido1.setChannelLEDConfig(1,0);
ido1.setChannelLEDConfig(2,0);
ido1.setChannelLEDConfig(3,0);
ido2.setChannelLEDConfig(0,0);
ido2.setChannelLEDConfig(1,0);
ido2.setChannelLEDConfig(2,0);
ido2.setChannelLEDConfig(3,0);
idai1.setChannelLEDConfig(0,0);
idai1.setChannelLEDConfig(1,0);
idai2.setChannelLEDConfig(0,0);
idai2.setChannelLEDConfig(1,0);
idai1.setStatusLEDConfig(0);
idai2.setStatusLEDConfig(0);
//iqr.setStatusLEDConfig(0);
iqr.setChannelLEDConfig(0,0);
iqr.setChannelLEDConfig(1,0);
iqr.setChannelLEDConfig(2,0);
iqr.setChannelLEDConfig(3,0);
}
//230V Steuerung
if(getState('0_userdata.0.Tinkerforge.230V.230VChanel1'/*230VChanel1*/).val ===true){
iqr.setSelectedValue(0, true);
}
else{
iqr.setSelectedValue(0, false);
}
if(getState('0_userdata.0.Tinkerforge.230V.230VChanel2'/*230VChanel2*/).val ===true){
iqr.setSelectedValue(1, true);
}
else{
iqr.setSelectedValue(1, false);
}
if(getState('0_userdata.0.Tinkerforge.230V.230VChanel3'/*230VChanel3*/).val ===true){
iqr.setSelectedValue(2, true);
}
else{
iqr.setSelectedValue(2, false);
}
if(getState('0_userdata.0.Tinkerforge.230V.230VChanel4'/*230VChanel4*/).val ===true){
iqr.setSelectedValue(3, true);
}
else{
iqr.setSelectedValue(3, false);
}
//Schreibt die Dutycyclelänge auf die Variable oder 0 wenn das Licht aus geschaltet ist
if(getState('0_userdata.0.Tinkerforge.A0').val ===true){
A0duty = getState('0_userdata.0.Tinkerforge.IOc1A0duty').val;
}
else{
A0duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A1').val ===true){
A1duty = getState('0_userdata.0.Tinkerforge.IOc1A1duty').val;
}
else{
A1duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A2').val ===true){
A2duty = getState('0_userdata.0.Tinkerforge.IOc1A2duty').val;
}
else{
A2duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A3').val ===true){
A3duty = getState('0_userdata.0.Tinkerforge.IOc1A3duty').val;
}
else{
A3duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A4').val ===true){
A4duty = getState('0_userdata.0.Tinkerforge.IOc1A4duty').val;
}
else{
A4duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A5').val ===true){
A5duty = getState('0_userdata.0.Tinkerforge.IOc1A5duty').val;
}
else{
A5duty = 0;
}
if(getState('0_userdata.0.Tinkerforge.A6').val ===true){
A6duty = getState('0_userdata.0.Tinkerforge.IOc1A6duty').val;
}
else{
A6duty = 0;
}
//Steuerung Lüfter in Hecktüren
if(getState('0_userdata.0.Tinkerforge.A7').val ===true){
A7duty = getState('0_userdata.0.Tinkerforge.IOc1A7duty').val;
}
else{
A7duty = 0;
}
//Konfiguration Industrial Out Bricklet als PWM
//Bricklet IndustrialDo4 an Port C
ido1.setPWMConfiguration(0, 10000, A0duty);
ido1.setPWMConfiguration(1, 10000, A1duty);
ido1.setPWMConfiguration(2, 10000, A2duty);
ido1.setPWMConfiguration(3, 10000, A3duty);
ido2.setPWMConfiguration(0, 10000, A4duty);
//ido2.setPWMConfiguration(1, 10000, A5duty);
//ido2.setPWMConfiguration(2, 10000, A6duty);
ido2.setPWMConfiguration(3,210000, A7duty);
//IO16 Bricklets
// Steuerung Wasserventile als Output
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil1Öffnen').val ===true){
ido3.setSelectedValue(0, false);
}
else{
ido3.setSelectedValue(0, true);
}
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil2Öffnen').val ===true){
ido3.setSelectedValue(1, false);
}
else{
ido3.setSelectedValue(1, true);
}
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil3Öffnen').val ===true){
ido3.setSelectedValue(2, false);
}
else{
ido3.setSelectedValue(2, true);
}
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil4Öffnen').val ===true){
ido3.setSelectedValue(3, false);
}
else{
ido3.setSelectedValue(3, true);
}
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil5Öffnen').val ===true){
ido3.setSelectedValue(4, false);
}
else{
ido3.setSelectedValue(4, true);
}
if(getState('0_userdata.0.Tinkerforge.Ventile.Ventil6Öffnen').val ===true){
ido3.setSelectedValue(5, false);
}
else{
ido3.setSelectedValue(5, true);
}
//Alle Ventile mit Ground verbinden
if(getState('0_userdata.0.Tinkerforge.Ventile.VentileEinschalten'/*VentileEinschalten*/).val ===true){
ido3.setSelectedValue(6, false);
}
else{
ido3.setSelectedValue(6, true);
}
//Druckpumpe einschalten
if(getState('0_userdata.0.Tinkerforge.Ventile.PumpeEinschalten'/*PumpeEinschalten*/).val ===true){
ido3.setSelectedValue(7, false);
}
else{
ido3.setSelectedValue(7, true);
}
//Analoge Wassertanksensoren
//Auslesen der Tanksensoren
idai1.getVoltage(0,function (voltage) {
setState('0_userdata.0.Tinkerforge.Wassertanks.FrischwasserLinksSpannung'/*FrischwasserLinksSpannung*/,voltage/1000.0);
},
);
idai2.getVoltage(1,function (voltage) {
setState('0_userdata.0.Tinkerforge.Wassertanks.FrischwasserRechtsSpannung'/*FrischwasserLinksSpannung*/,voltage/1000.0);
},
);
idai2.getVoltage(0,function (voltage) {
setState('0_userdata.0.Tinkerforge.Wassertanks.AbwasserSpannung'/*AbwasserSpannung*/,voltage/1000.0);
},
);
m1 = (getState('0_userdata.0.Tinkerforge.Wassertanks.FrischwasserLinksSpannung'/*FrischwasserLinksSpannung*/).val - 0) / (2.2 - 0);
BalkenFWlinks=m1 * (125 - 2) + 2;
ProzentFWlinks=m1 * (100 - 0) + 0;
setState('0_userdata.0.Tinkerforge.Wassertanks.Prozent_FrischwasserLinks'/*Prozent FrischwasserLinks*/,Math.round(m1 * (100 - 0) + 0));
setState('0_userdata.0.Tinkerforge.Wassertanks.LiterFrischwasserLinks'/*LiterFrischwasserLinks*/,Math.round(m1 * (105 - 0) + 0));
m2 = (getState('0_userdata.0.Tinkerforge.Wassertanks.FrischwasserRechtsSpannung'/*FrischwasserLinksSpannung*/).val - 0) / (2.2 - 0);
BalkenFWrechts=m2 * (125 - 2) + 2;
ProzentFWrechts=m2 * (100 - 0) + 0;
setState('0_userdata.0.Tinkerforge.Wassertanks.Prozent_FrischwasserRechts'/*Prozent FrischwasserRechts*/,Math.round(m2 * (100 - 0) + 0));
setState('0_userdata.0.Tinkerforge.Wassertanks.LiterFrischwasserRechts'/*LiterFrischwasserRechts*/,Math.round(m2 * (105 - 0) + 0));
m3 = (getState('0_userdata.0.Tinkerforge.Wassertanks.AbwasserSpannung'/*AbwasserSpannung*/).val - 0) / (2.2 - 0);
BalkenAbwasser=m3 * (125 - 2) + 2;
ProzentAbwasser=m3 * (100 - 0) + 0;
setState('0_userdata.0.Tinkerforge.Wassertanks.Prozent_Abwasser'/*Prozent Abwasser*/,Math.round(m3 * (100 - 0) + 0));
setState('0_userdata.0.Tinkerforge.Wassertanks.LiterAbwasser'/*LiterAbwasser*/,Math.round(m3 * (75 - 0) + 0));
//Steuerung LCD Display Seiteklappe
if(getState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter1').val ===true) {
lcd.setDisplayConfiguration(15, 100, false, true);
}
else {
lcd.setDisplayConfiguration(0, 0, false, true);
lcd.clearDisplay();
m1_1=-1;
m2_1=-1;
m3_1=-1;
}
if(((m1!=m1_1)||(m2!=m2_1)||(m3!=m3_1))&&(getState('0_userdata.0.Tinkerforge.SeitenklappeLinks.Schalter1').val ===true)) {
lcd.clearDisplay();
lcd.drawText(64, 0,0,1, Math.round(ProzentFWlinks)+'%');
lcd.drawText(1, 0,0,1, 'FW links');
lcd.drawBox(1, 8, 126, 16, false, true);
lcd.drawBox(2, 9, BalkenFWlinks, 15, true, true);
lcd.drawText(64, 22,0,1, Math.round(ProzentFWrechts)+'%');
lcd.drawText(1, 22,0,1, 'FW rechts');
lcd.drawBox(1, 30, 126, 38, false, true);
lcd.drawBox(2, 31, BalkenFWrechts, 37, true, true);
lcd.drawText(64, 44,0,1, Math.round(ProzentAbwasser)+'%');
lcd.drawText(1, 44,0,1, 'Abwasser');
lcd.drawBox(1, 53, 126, 61, false, true);
lcd.drawBox(2, 52, BalkenAbwasser, 60, true, true);
m1_1=m1;
m2_1=m2;
m3_1=m3;
}
},100);
}
);