Jump to content

Recommended Posts

Geschrieben

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

Geschrieben

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

  • 4 weeks later...
Geschrieben

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); 
    }
);

 

Geschrieben

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

  • 4 weeks later...
Geschrieben

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); 
    }
);

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...