MAN_Jay Geschrieben December 7, 2021 at 13:03 Share Geschrieben December 7, 2021 at 13:03 hallo, ich bin neu hier und auch was Javascript angeht noch grün hinter den Ohren. Ich steuere mein selbst ausgebautes Wohnmobil mit einem RasPi4 auf dem IoBroker läuft und einigen Tinkerforge Modulen. Das Ganze ist via Ethernet verbunden und funktioniert grundsätzlich ganz gut. Leider kommt es in der aktuellen Bastelphase schon mal vor, dass ich die Verbindung zu einzelnen Bricks und Bricklets verliere (Die 7/10 Pin Kabel machen viele Probleme). Ich würde das gerne auf meiner VIS von IoBroker als Fehlermeldung visualisieren aber bekomme das auf der JS Seite nicht hin. Hat jemand schon mal sowas gemacht und könnte mir bitte helfen? MfG Julien Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Backdraft007 Geschrieben December 8, 2021 at 12:55 Share Geschrieben December 8, 2021 at 12:55 Hallo Julien, kannst Du etwas konkreter werden, was die Verbindungsprobleme betrifft? Kommst Du beim Basteln an irgendwelche Stecker/Kabel wodurch die Verbindung der Bricklets verloren geht? Ich kenne mich jetzt nicht mit dem IoBroker aus. Wie sieht denn so ein Javascript von Dir aus? Grüße Chris Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
MAN_Jay Geschrieben January 3, 2022 at 17:11 Autor Share Geschrieben January 3, 2022 at 17:11 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); } ); Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Backdraft007 Geschrieben January 4, 2022 at 08:25 Share Geschrieben January 4, 2022 at 08:25 Hallo Julien, ich habe mir das Script jetzt nicht konkret im Detail angeschaut. Scheint aber nur der Tinkerforge-Teil zu sein, richtig? Wenn es einen "Verbindungsabbruch" gibt, musst Du dann an den Steckern nachstecken oder reicht ein Neustart des Systems aus? Generell würde ich aber empfehlen, Try-Catch für Deine einzelnen Funktionen zu implementieren. So kannst Du darauf reagieren, wenn ein Bricklet nicht mehr angesprochen werden kann und weißt genau, an welcher Stelle etwas nicht mehr funktioniert. https://www.w3schools.com/js/js_errors.asp Hilft natürlich nicht bei Bricklets, die einen Callback verwenden. Hier könnte aber unter Umständen ein Enumerate helfen, den man zyklisch aufruft und auswertet.https://www.tinkerforge.com/de/doc/Software/IPConnection_JavaScript.html Der gibt Dir nämlich alles zurück, was angeschlossen ist. Fehlt etwas, kannst Du auch entsprechend drauf reagieren. Grüße Chris Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
MAN_Jay Geschrieben January 28, 2022 at 17:06 Autor Share Geschrieben January 28, 2022 at 17:06 Hallo Backdraft007, endlich habe ich Zeit gefunden mich darum zu kümmern. Letztendlich habe ich mich für den Enumerate Callback entschieden. Als C++ Programmierer tue ich mich mit J-Script immer noch schwer aber es funktioniert. Die Schwierigkeit lag darin genau heraus zu bekommen welcher Teilnehmer ausgefallen ist. Der Callback sagt einem ja nur was da ist, er weiß nicht, wenn etwas fehlt. Mein Programm ist sicher nicht optimal aber im Grunde bekommt jede UID eine Variable die ich mit einer Zeitverzögerung vom Callback abfrage. Meinen Testcode hänge ich hier mal an, falls noch mal jemand auf die gleiche Problematik stößt: var Tinkerforge = require('tinkerforge'); var HOST = 'localhost'; var PORT = 4223; var UID7 = 'Qv8' //Temperature Bricklet 2.0 Port A MasterBrick 2 var UID11 = '6feC5Q' //MasterBrick 3 var UID12 = 'SWt' //Industrial In var ipcon = new Tinkerforge.IPConnection(); // Create IP connection var t = new Tinkerforge.BrickletTemperatureV2(UID7, ipcon); var ma3 = new Tinkerforge.BrickMaster(UID11, ipcon); //MasterBrick3 var device1; var device2; var device3; 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; } // Register Enumerate Callback ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, // Print incoming enumeration function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) { switch (uid) { case UID7: // Anweisungen werden ausgeführt, // falls expression mit value1 übereinstimmt device1=1; break; case UID11: // Anweisungen werden ausgeführt, // falls expression mit value2 übereinstimmt device2=1; break; case UID12: // Anweisungen werden ausgeführt, // falls expression mit value2 übereinstimmt device3=1; break; default: // Anweisungen werden ausgeführt, // falls keine der case-Klauseln mit expression übereinstimmt break; } } ); ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED, function (connectReason) { setInterval(function(){ device1=0; device2=0; device3=0; // Trigger Enumerate ipcon.enumerate(); setTimeout(function () { if(device1===0) { console.log('ERROR1'); } if(device2===0) { console.log('ERROR2'); } if(device3===0) { console.log('ERROR3'); } }, 800); },1000); } ); Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Backdraft007 Geschrieben January 29, 2022 at 13:19 Share Geschrieben January 29, 2022 at 13:19 Hi, Du kannst Dir ja ein ein konstantes Array erstellen, dass alle Bricklets enthält. Der Enemurate Callback kann das ja vergleichen und schon weißt Du, welches fehlt. Grüße Chris Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.