Jump to content

theobald

Members
  • Gesamte Inhalte

    31
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von theobald

  1. Hallo in die Runde... ich entwickle schon seit einer geraumen Zeit an einer größeren Wetterstation. Die ist seit letztem Sommer auch teilweise in Betrieb. Der dazu aufgebaute Stack mit einem RED und drei Master Bricks, Power Supply und PoE und vielen Sensoren befindet sich in einem Hutschinengehäuse an einem schlecht zugänglichen Ort. Nun habe ich zwischendurch mehrere Updates für den RED Brick gefahren, ohne dass irgendwelche Probleme aufgetreten sind. Heute nun war die Anlage abgestürzt und ich musste das Hutschinengehäuse aufsuchen. Nach einem Neustart des Stacks zeigt mir der Brick Viewer, dass ich ein Update aller Master vornehmen soll. Erstaunlicher Weise geht das nicht so einfach mit dem Brick Viewer. Daher meine Frage: Ich erhalte eine Anzeige, dass ich - ich staune nicht schlecht - für ein Update die gesamte Anlage zerlegen muss. Dann muss ich den Stack zerlegen. Erst danach kann ich ein Firmwareupdate auf jedem einzelnen Master per USB Kabel ausführen. Habe ich das richtig verstanden? Das ist eine Arbeit von ca. 8h! und bei diesem Wetter gar nicht durchführbar... Außerdem bedeutet das, dass bei jedem Firmware-Update die gesamte Wetterstation zerlegt werden muss. Das ist dauerhaft praktisch unmöglich... Kann das jmd. bestätigen? Gibt es wirklich kein Update via Netzwerkkabel? Grüße vom Theo
  2. theobald

    ESP32 Brick

    Hallo und guten Morgen :O) ich habe heute nur eine kurze Frage: Im vergangenen Jahr wurde mal ein ESP32 Brick angekündigt und er wird auch hier und da erwähnt. z.B. hier... Gibts den schon zu kaufen? Wenn ja, wo? Wenn nein, wann? Herzliche Grüße und eine entspannte Arbeitswoche wünscht Theo
  3. ok - danke! Das war mir bekannt. Aber ich bin fälschlicherweise davon ausgegangen, dass der RED Brick beim booten an einer Ethernet Extension deren IP Parameter automatisch übernimmt. Ich hatte leider übersehen, dass man auf dem RED Brick einmalig, das Interface und die IP Bezugsmethode (static/dhcp) noch einmal gesondert einstellen muss. Jetzt funktioniert alles, wie erwartet. Vielen Dank! vom Theo
  4. ok ich habe jetzt 1. den RED Brick unter den Stapel gesteckt, 2. den Stapel via PoE gestartet 3. den RED Brick parallel via USB->localhost angesprochen und ich kann den RED Brick steuern und der sieht eine PoE Extension leider bleibt die im lokalen Netzwerk unsichtbar, so lange der RED Brick unten steckt... ping geht nicht, nur wenn man den RED abzieht, dann bezieht die Extension eine IP Adresse...
  5. Moin moin, danke für die Antwort. Ich glaube das wird etwas kompliziert. Ich habe noch nicht genau verstanden, wie ich das machen soll. Steckt der RED Brick unter dem Stapel, dann bezieht der Stapel keine IP Adresse via PoE Extension mehr. Oder sollte ich den RED Brick vorher abziehen, den Stapel via PoE starten und danach den RED Brick an den laufenden Stapel anstecken? Ist das gesund für den RED Brick und den Stapel .. ? Viele Grüße. Theo.
  6. Hallo in die Runde, ich habe mehere Stacks laufen und nun einen weiteren für die Softwarentwicklung hinzugekauft. Die Stacks sind alle wie folgt (gemäß Stapelaufbau-Richtlinie) aufgebaut: oben Pos 3 Ethernet Ext PoE Pos 2 Master Pos 1 Red Brick unten Mein Problem: Der neu gekaufte Stack arbeitet nicht via Ethernet. 1. Wenn ich den Red Brick entferne arbeiten Pos 2 + 3 einwnadfrei und erkennen alle angeschlossenen Sensoren. 2. Wenn ich den Red Brick via USB betreibe, dann kann ich alles machen, es funktioniert auf dem Red Brick alles. 3. Stecke ich den Red Brick unter den Stapel, dann leuchten alle LEDs, aber nichts funktioniert. Der Stapel bezieht keine IP Adresse, ich bekomme keine Connection mit der IP-Adresse, die der Master ohne Red Brick vorher bezogen hatte, das daemon log logt nichts und es passiert auch sonst nichts. Löse ich den RED Brick wieder vom Stapel, dann fuktionieren die Komponenten einzeln wieder einwandfrei. Alle meine anderen Stapel sind genauso aufgebaut, nur dass sie zwischen dem RED Brick (unten) und der PoE Extension (oben) mehrere Master Bricks haben. Was kann ich da machen? Bei allen meinen Stapeln hatte ich diese Probleme bisher nicht. Liegt da möglw. ein Hardware-Fehler vor? Da der Daemon-Logger im Fehlerfall gar nichts logt, wo kann ich noch sehen, was schief läuft? Viele Grüße vom Theo
  7. OK vielen Dank! Ich dachte mir schon sowas in der Richtung... Das ist aber kein Problem... Viele Grüße. Theo
  8. Hallo TF-Team! kann man auch Kabel >2m für den Anschluss von Bricklets an den Master bei Euch bekommen? Ich habe Sensoren (Humidity) an einer größeren Wetterstation, die bestimmte Höhen über/unter dem Boden haben müssen, so dass ich einen in 1m in der Erde habe (Bodenfrost) einen 5cm über der Erde und einen in 2m/3m Höhe. Da bräuchte ich 3m/4m Kabel. Gibt es soetwas bei Euch? Viele Grüße. Theo
  9. Danke! Das werde ich gleich testen. Ich habe jetzt ca. 3000 Zeilen code für diese Projekt geschrieben und diese Verfahrensweise bisher nirgendwo beachtet. Steht das in der API-Beschreibung? Asche auf mein Haupt! 😀 Grüße und Danke. Theo
  10. Ja! Danke für die Antwort. Hier kommt mein Code... <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head> <title>Tinkerforge | JavaScript Example</title> </head> <body> <div style="text-align:center;"> <h1>IO-16 Bricklet 2.0 Interrupt Example</h1> <p> <input value="192.168.5.42" id="host" type="text" size="20">: <input value="4280" id="port" type="text" size="5">, <input value="2fYVua" id="uid" type="text" size="5"> <input value="Start Example" id="start" type="button" onclick="startExample();"> </p> <p> <textarea readonly id="text" cols="80" rows="24" style="resize:none;" >Press "Start Example" to begin ...</textarea> </p> </div> <script src="./js/tinkerforge/Tinkerforge.js" type='text/javascript'></script> <script type='text/javascript'> var ipcon; var textArea = document.getElementById("text"); function startExample() { textArea.value = ""; var HOST = document.getElementById("host").value; var PORT = parseInt(document.getElementById("port").value); var UID = document.getElementById("uid").value; if(ipcon !== undefined) { ipcon.disconnect(); } ipcon = new Tinkerforge.IPConnection(); // Create IP connection var io = new Tinkerforge.BrickletIO16V2(UID, ipcon); // Create device object ipcon.connect(HOST, PORT, function(error) { textArea.value += 'Error: ' + error + '\n'; } ); // Connect to brickd // Don't use device before ipcon is connected // ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED, function (connectReason) { // Set period for input value (channel 4) callback to 0.5s (500ms) // theobald ipcon.authenticate( "9Pttfnn9zh00i0uCQvNnnUedd", (ok) => { textArea.value += 'auth OK\n'; }, (err) => { textArea.value += 'auth ERR' + err + '\n'; } ); // theobald end // geändert auf chanel 1 also A1-GND io.setInputValueCallbackConfiguration(1, 500, false); } ); // Register input value callback io.on(Tinkerforge.BrickletIO16V2.CALLBACK_INPUT_VALUE, // Callback function for input value callback function (channel, changed, value) { textArea.value += 'Channel: ' + channel + '\n'; textArea.value += 'Changed: ' + changed + '\n'; textArea.value += 'Value: ' + value + '\n'; textArea.value += '\n'; textArea.scrollTop = textArea.scrollHeight; } ); } </script> </body> </html> Zudem habe ich gerade bemerkt, dass über das Websocket in der Developer Konsole von FF Daten alle 500ms fließen. Nur die kommen offs im Browser nicht an?? Das sieht so aus: Firmware ist v.2.0.2. OK! Danke benzüglich des Fehlercodes... Grüße Theo
  11. Hallo und guten Morgen... ich bin leider hier der Stammkunde! 😀 Ich hoffe, das nimmt mir niemand übel... Durch die intensive Nutzung von Tinkerforge-Baugruppen kommen selbstverständlich viele Fragen auf... Ich habe hier herumgelesen, dass es bei der Verwendung der Interrupte am IO-16V2 mitunter zu 'Verklemmungen' kommt. Ich habe meine Applikation nun schon mit Eurer Hilfe recht weit voranbringen können. Jetzt bin ich beim IO-16V2 und habe auch ein seltsames Problem. Ich habe Kanal 0 bereits mit einem EdgeCounter erfolgreich in Betrieb und wollte nun parallel den Kanal 1 mit einem Interrupt nutzen. Das schlägt fehl. Erst einmal ganz ohne Fehler. Ich habe dann den RED Brick neu gestartet und alle laufenden Programme (nodejs) beendet. Danach habe ich das Beispiel Download (ExampleInterrupt.js) für meine Umgebung lauffähig (Pfade/Ports etc..) gemacht. Jedoch liefert das Example auch keine Daten und keine Fehler. Ich habe dann mein node.js Script mit denselben Parametern konfiguriert, jedoch funktioniert das nicht und wirft auch keinen Error. Ich habe dann den Konfigurationsaufruf io.setInputValueCallbackConfiguration(1, 1000, false) so modifiziert, dass er einen ErrorCallback verwendet. Das ist zwar nicht explizit dokumentiert, aber sieht so aus... io.setInputValueCallbackConfiguration(1, 1000, false, () => { Logger.log('setInputValueCallbackConfiguration OK'); }, (err) => { Logger.log('setInputValueCallbackConfiguration ERROR', err); } ); Dieser Aufruf wirft einen Fehler 31. Nun steht bei diesem Callback in der Doku nichts davon, dass er einen Fehler Werfen kann und welchen. Ich gehe davon aus, dass es der allg. Fehler IPConnection.ERROR_TIMEOUT = 31 ist. (Eine detaillierte Dokumentation wäre hier sehr hilfreich! - auch die vom RED Brick steht seit 2015 auf 'nicht vollständig' - aber das nur am Rande... 😀) Was läuft hier falsch? Warum funktioniert dasselbe Script mit einem EdgeCounter sehr wohl und das mit dem Interrupt nicht? Wo muss ich weiter suchen? Gibt es noch diese bounce_time? Hat es was damit zu tun? Wo sollte man die bounce_time setzen? Beste Grüße vom Theo! PS: Ich hatte nicht erwähnt, dass am BrickViewer alle Pegeländerungen prima zu sehen sind. Der Interrupt wird halt nur nicht getriggert. Konfiguriert ist: io.setConfiguration(1, 'i', true);
  12. Danke! Das ist prima! Es ist viel einfacher, als mit promises. Ich bin davon ausgegangen, dass ich mit promises warten muss, bis die einzelnen Geräte antworten. Das schrittweise neue Timeout, bis das nächste Gerät antwortet, ist jedenfalls viel einfacher als mit promises. Vielen Dank!
  13. Moin moin, also ich muss mich etwas präziser ausdrücken: Genaugenommen habe ich zwei Probleme. 1. sauberen Code schreiben ->Callback-Chain oder Promise Chain und 2. die Ergebnisse der Enumerate-Callbacks für die Laufzeit der Main Loop in einem Array speichern oder beim Reconnect aktualisieren. besonders Nr. 2. liegt mir am Herzen und ich finde keine richtige Lösung... @rtrbtgibt es keinen Kontakt zu einem Entwickler, der die Bindings entworfen hat? Der könnte doch bestimmt zwei drei Tipps geben, in welcher Richtung man suchen muss.... das wäre echt nett 😀
  14. Hi! naja mein oben geposteter Code ist ja bereits die (nicht funktionierende) Erweiterung. Ich weiss leider nicht, wo ich ansetzen soll. Ich müsste/möchte die Ergebnisse der Callbacks verketten, aber das geht so nicht, wie ich es versucht habe. Ich versuche z.B. die Aufrufe des enumerate_callbacks in ein Promise-Array zur schreiben und dieses Array dann aufzulösen. Das funktioniert aber nicht. mein Promise.all wird fullfilled bevor das array geladen wurde. Ich weiss nicht, warum! Ich finde leider auch keine Beispiele...
  15. also ich muss noch weiter fragen. Ich verstehe das Konzept der Callbacks hier nicht so richtig. Da die Tinkerforge API weitgehend Callback-orientiert ist, sollten diese doch entsprechend den Konventionen implementiert sein. Ich habe nun versucht ipcon.on zu verketten, aber das geht nicht. ipcon.on() ist kein EventEmitter und daher kann man ihn nicht verketten mit ipcon.on(CONECCTED).on(ENUMERATE) Wäre das nicht essentiell? Denn nur wenn ipconn.on(Connected) erfolgreich wäre ist erst ipcon.authenticate() sinnvoll und danach ipcon.enumerate() und erst danach Bricklet.on(CALLBACK_HUMIDITY) etc. Wie ist es denn von Hause aus vorgesehen, diese Callbacks und ihre Rückgabewerte zu verketten?
  16. also mir ist es bisher leider nicht gelungen, das Problem zu lösen. Kann mir vielleicht ein JS-Profi etwas behilflich sein? Ich habe jetzt: var device_promises = []; und... // Register Connected Callback ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED, async function (connectReason) { await enumerateDevices(); } ); und später... ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, // Print incoming enumeration function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) { const dp = new Promise(resolve => { let device = {}; if (enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) { device = { uid: uid, enum_type: enumerationType, connectedUid: 0, position: 0, hardwareVersion: 0, firmwareVersion: 0, deviceIdentifier: 0 }; } else { device = { uid: uid, enum_type: enumerationType, connectedUid: connectedUid, position: position, hardwareVersion: hardwareVersion, firmwareVersion: firmwareVersion, deviceIdentifier: deviceIdentifier }; } //resolve(device); }); device_promises.push(dp); console.log(`${performance.now()} new Promise() `, dp); } ); im Hauptprogramm dann folgendes: function enumerateDevices() { ipcon.enumerate(); Promise.all(device_promises).then((values) => { console.log(`${performance.now()} Promise.all.then ${values}`); }); } bereits enumerateDevices() sollte ja mit Promise.all().then() alle pending promises abwarten, aber erstaunlicherweise wartet Promise.all() nicht, bis device_promises vorliegen, sondern bearbeitet das leere Array sofort ab und liefert keine Ergebnisse. es läuft so ungefähr... 824ms ipcon.connected ->OK 825ms enumerateDevices() ->leer 826ms Promise.all.then ->leer 844ms new Promise (pending) 846ms new Promise (pending) usw... STOP Kann mir da nochmal jmd. einen Tipp geben? Wo muss der Code berichtigt werden? Oder geht das so gar nicht? Grüße vom Theo.
  17. Moin rtrbt, danke! Ja genau! Man weiß nicht, wieviele Bricks/Bricklets sich zurückmelden... Ich werde mich mal in das Problem vertiefen... Wenn ich eine Lösung finde, dann schreibe ich nochmal... Grüße vom Theo
  18. Guten Morgen in die Runde! ich möchte die Daten aus dem Enumeration Callback (Javascript im Browser) in ein Array schreiben (was recht einfach ist). Allerdings kann ich das Array nicht weiter verwenden, da es asynchron erstellt wird. Während nun mein Hauptprogramm in Javascript (im Browser via WebSockets) weiter läuft und im nächsten Aufruf das Array (z.B. var devices = []) lesen will, so hat ipcon.enumerate() das Array aber noch nicht gefüllt, weil es nebenläufig ist. Das ist kniffliger, als ich dachte. Kann mir da jmd. einen Tipp geben? Was habe ich versucht - oder besser angedacht und verworfen? 1. ipcon.on(Enumerate... in ein Promise zu verlagern. Das scheint mir nicht sinnvoll, da es ja nur den Callback deklariert und nicht ausführt. 2. ipcon.enumerate() in ein Promise zu verlagern ->funktioniert aber nicht. 3. ipcon.enumerate() mit async await aufzurufen ->funktioniert auch nicht, da ipcon.enumerate() für jedes device (Brick, Bricklet etc.) erneut aufgerufen wird. Wie müsste ein robuster Ansatz lauten, um die Daten in Enumerate in ein Array zu schreiben und für die Laufzeit des Programms verfügbar zu machen. Das Array soll erst verfügbar sein, wenn enumerate() vollständig enumeriert hat? Kann mir ein Fachmann / eine Fachfrau nen Tipp geben? Viele Grüße. vom Theo
  19. Na das ist doch prima! Da warte ich auf den ESP32. Der Code vom 8266 läuft im Wesentlichen auf dem ESP32 - vielleicht sogar noch etwas robuster, denn der 8266 hat ja manchmal Probleme mit den Interrupts, wenn sie im falschen RAM liegen... Mir genügen zwei freie GPIO, um den Interrupt anzubinden. Da könnte ich gleich meinen Sensor weiter betreiben und den ESP dekodieren lassen... Danke! PS: Ist schon raus, wann der ESP-Brick ungefähr verfügbar sein wird??
  20. Hallo rtrbt, danke für Deine Tipps! (ja das Sampling-Theorem :O) Ich dachte immer der ARM auf dem Red Brick wäre (prinzipiell) schneller als der ESP8266 ? Auf dem ESP geht das dekodieren ganz leicht über einen Interrupt-Handler. Der Red Brick hat doch auch Interrupts oder? Sollte man da vielleicht direkt auf die GPIO gehen? (ja das habe ich schonmal gefragt im Januar 2020 oder so :O) Vielleicht könnte man dan einen Interrupt-Handler in C++ schreiben. Ich habe das auf dem ESP8266 gemacht. Da geht das recht gut...
  21. Moin, na ich möchte ein serielles Signal dekodieren. Es besteht aus 42 Bits, die nacheinander reinkommen (nicht konform, also kein RS232C etc). Sie müssen aber noch verrechnet werden (Prüfsumme, Addieren, Invertieren etc.)
  22. Hallo allseits, kann mir jmd. noch einen Tipp geben, mit welchem Bricklet ich ein digitales Signal mit einer Pulsbreite von ca. 1ms dekodieren könnte? In den Beispielen z.B. vom Industrial Digital IN 4 steht was von 10ms oder 100ms. Ich möchte gern ein Rechtecksignal mit 1ms dekodieren. Ein Red Brick solls dann berechnen... Ich bin auch für andere Empfehlungen dankbar. Viele Grüße. Theo
  23. Danke für die Antwort. Kein Problem! Man muss es nur wissen...
  24. ...alles OK. Hat sich von selbst erledigt. Das Update dauert bis zu den Ruby-Bindings ca. 30sec. Danach benötigt es ca. 90min. Das war mir nicht bewußt. Jetzt ist alles up to date!
×
×
  • Neu erstellen...