Jump to content

BOBmoraine

Members
  • Gesamte Inhalte

    42
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von BOBmoraine

  1. Moin, ich versuche mich gerade daran mit meinen Stacks per TCP/IP zu kommunizieren via SPS (Codesys). Nun stehe ich vor dem Problem das bei TCP/IP das Packet Layout die UID als uint32 vor sieht. Docu TCP/IP Meine UIDs sind aber Strings, kein uint32 was ja ein Zahlenformat ist. Wie geht das? Wie wandel ich z.B. meine UID 6JKUg4 in einen uint32 um? Oder kann ich den dazugehörigen Zahlenwert irgendwo im BrickViewer finden?
  2. Moin, die ursprüngliche Version kann ich nicht genau sagen, aber es war die Version vom Auslieferungszustand (Bestellung 19. Aug. 2016). Von da direktes Update auf 2.0.3 da ich den SSID-Namen dort auch schon nicht verändern konnte. Als Modus hatte ich erst Client & AP, momentan nur AP, WPA/WPA2 mit DHCP.
  3. Moin, ich habe zwar das aktuellste WiFi2.0-Update nun drauf, aber ich habe immernoch 2 Sachen die nicht funktionieren: 1. Die W-Lan- SSID wird nicht richtig angezeigt, da steht nach dem Update nun "ESP_F9F3D3",vor dem Update stand immer der Standardname dort. Auch wenn die Konfiguration erfolgreich gespeichert wurde, und der Brick neu gestartet, ändert sich der Name nicht in das was ich gerne hätte. 2. In der Konfiguration habe ich DHCP mit passwort angegeben, und auch ein Passwort eingegeben. Doch momentan kann sich jeder verbinden, auch ohne Passwort (P.S. AccessPoint-Mode) EDIT: Alle Einstellungen habe ich über brickv und Windows gemacht.
  4. Moin, ja viele Schreibzugriffe auf die SD-Karte sind Kritisch zu sehen, aber warum möchtest du den Server von NUC auf RED umziehen lassen? Der NUC kann ja weiterhin der "Server" sein, und der RED nur die Schnittstelle zur Tinkerforge-Welt. Und mit der Stabilität von RED & RPi hatte ich bisher keine Probleme, meisst war ich selbst (oder eher meine Programme) das Problem. -->CUT--------------------------------------------------------------------------- Zu der Antwort habe ich aber noch ein weiteres Problem, und zwar eines mit dem Binding vom Segment Display 4x7 Bricklet: ITEMs: Number UhrzeitAsNumber "Uhrzeit [%f]" <clock> (UG_Flur) Number TF_Segment7 "Segment7" (TF_Cube) {tinkerforge="uid=PPP" } RULEs: var Number time_hour var Number time_minute //Die beiden Variablen werden in einer Regel als "cron" dann mit Werten belegt rule "Zeit in Variablen" when Time cron "30 * * * * ?" then time_hour = current_time.get(java::util::Calendar::HOUR_OF_DAY) time_minute = current_time.get(java::util::Calendar::MINUTE) var timeUpdate = (time_hour * 100) + time_minute postUpdate(UhrzeitAsNumber, timeUpdate) end /* Ausgabe */ rule "UhrzeitAsNumber in TF_Segment7" when Item UhrzeitAsNumber received update then sendCommand(TF_Segment7, UhrzeitAsNumber.state as DecimalType) end Bei folgendem Aufbau habe ich das Problem das die Minutenzahl im Segment7-Bricklet immer 2 mehr anzeigt als die Variable "UhrzeitAsNumber" gerade beinhaltet. Wenn die Zeit nun momentan "1040" wäre, zeigt das Segment7 nun aber leider "1042" an. Kann das jemand nachvollziehen und mir evtl. einen Hinweis geben wo der Fehler liegt?
  5. Moin, danke für den Tip. Wenn ich den Switches/Relais eine zusätzliche Gruppe zuweise kann ich tatsächlich mit "sendCommand(neueGruppe, OFF)" die komplette Gruppe schalten.
  6. Moin, erstmal danke für die tolle Arbeit. Gibt es die Möglichkeit mit deinen Bindings ein Industrial-Quad-Relay "komplett" anzusprechen. Sprich sowas wie "setValue(valueMask)" aus der TF-Doku? Link Ich habe mir für den Anfang eine Binärkodierung zu meiner LOGO aufgebaut (weil ich noch keine Softwareverbindung zustande gebracht habe) und benutze dort das IQ-Relay. Nun habe ich aber das Problem das meisst ein Relay "nach hängt". Mein Code bei OpenHAB sieht so aus: Items: Switch hmF_QR1 "hmF_QR1" (TF_hidden) {tinkerforge="uid=hmF, subid=relay0"} Switch hmF_QR2 "hmF_QR2" (TF_hidden) {tinkerforge="uid=hmF, subid=relay1"} Switch hmF_QR3 "hmF_QR3" (TF_hidden) {tinkerforge="uid=hmF, subid=relay2"} Switch hmF_QR4 "hmF_QR4" (TF_hidden) {tinkerforge="uid=hmF, subid=relay3"} Switch B10_Switch "Reset all" (TF_Hauptverteiler) Rules: rule "Change B5" when Item B5_Switch changed then if (B5_Switch.state == ON && B5_ON_timer == null && B10_Switch.state == OFF) { sendCommand(hmF_QR1, ON) sendCommand(hmF_QR2, OFF) sendCommand(hmF_QR3, OFF) sendCommand(hmF_QR4, ON) B5_ON_timer = createTimer(now.plusSeconds(1)) [| sendCommand(hmF_QR1, OFF) sendCommand(hmF_QR2, OFF) sendCommand(hmF_QR3, OFF) sendCommand(hmF_QR4, OFF) B5_ON_timer = null ] } else if (B5_Switch.state == OFF && B5_OFF_timer == null && B10_Switch.state == OFF) { sendCommand(hmF_QR1, ON) sendCommand(hmF_QR2, OFF) sendCommand(hmF_QR3, OFF) sendCommand(hmF_QR4, ON) B5_OFF_timer = createTimer(now.plusSeconds(1)) [| sendCommand(hmF_QR1, OFF) sendCommand(hmF_QR2, OFF) sendCommand(hmF_QR3, OFF) sendCommand(hmF_QR4, OFF) B5_OFF_timer = null ] } end rule "Change B10" when Item B10_Switch changed then if (B10_Switch.state == ON && B10_ON_timer == null) { sendCommand(hmF_QR1, ON) sendCommand(hmF_QR2, ON) sendCommand(hmF_QR3, ON) sendCommand(hmF_QR4, ON) B10_ON_timer = createTimer(now.plusSeconds(1)) [| sendCommand(hmF_QR1, OFF) sendCommand(hmF_QR2, OFF) sendCommand(hmF_QR3, OFF) sendCommand(hmF_QR4, OFF) B10_ON_timer = null B1_Switch.state = OFF B2_Switch.state = OFF B3_Switch.state = OFF B4_Switch.state = OFF B5_Switch.state = OFF B6_Switch.state = OFF B7_Switch.state = OFF B8_Switch.state = OFF B9_Switch.state = OFF B10_Switch.state = OFF ] } end Wenn nun B10 ausgeführt wird kommt es öfters vor das "sendCommand(hmF_QR4, OFF)" hinterher hinkt und damit dann wieder Bin_4 aktiviert wird. Daher meine Frage ob ich die vier "sendCommand(Relay, Status)" irgendwie zusammen fassen kann damit alle 4 auf einmal abgehandelt werden.
  7. Moin, ich wollte bei meinem RED mit OpenHAB noch das addon "rrd4j" nachinstallieren, doch ich kann nichtmal ein fehlerfreies "apt-get upgrade" machen, folgend die Ausgaben: tf@TF_RED:~$ sudo apt-get upgrade Reading package lists... Done Building dependency tree Reading state information... Done You might want to run 'apt-get -f install' to correct these. The following packages have unmet dependencies: perl : Depends: perl-base (= 5.20.2-3+deb8u1) but 5.20.2-3+deb8u2 is installed Recommends: rename but it is not installed E: Unmet dependencies. Try using -f. tf@TF_RED:~$ sudo apt-get -f install Reading package lists... Done Building dependency tree Reading state information... Done Correcting dependencies... Done The following extra packages will be installed: perl perl-modules Suggested packages: libb-lint-perl libcpanplus-dist-build-perl libcpanplus-perl libfile-checktree-perl liblog-message-simple-perl liblog-message-perl libobject-accessor-perl Recommended packages: rename libarchive-extract-perl libmodule-pluggable-perl libpod-latex-perl libterm-ui-perl libtext-soundex-perl libcgi-pm-perl libpackage-constants-perl The following packages will be upgraded: perl perl-modules 2 upgraded, 0 newly installed, 0 to remove and 274 not upgraded. 6 not fully installed or removed. Need to get 0 B/4,622 kB of archives. After this operation, 501 kB disk space will be freed. Do you want to continue? [Y/n] y (Reading database ... 143407 files and directories currently installed.) Preparing to unpack .../perl_5.20.2-3+deb8u2_armhf.deb ... Unpacking perl (5.20.2-3+deb8u2) over (5.20.2-3+deb8u1) ... dpkg: error processing archive /var/cache/apt/archives/perl_5.20.2-3+deb8u2_armhf.deb (--unpack): trying to overwrite '/usr/bin/perldoc', which is also in package perl-doc 5.20.2-3+deb8u1 dpkg-deb: error: subprocess paste was killed by signal (Broken pipe) Processing triggers for man-db (2.7.0.2-5) ... Errors were encountered while processing: /var/cache/apt/archives/perl_5.20.2-3+deb8u2_armhf.deb E: Sub-process /usr/bin/dpkg returned an error code (1) Ich habe leider nicht so die Linuxkenntnisse, daher wollte ich fragen ob mir jemand helfen kann das zu "reparieren". Die Linux-Version ist die vom "red_image_1_7_full.img".
  8. Moin, habe noch am selben Abend die angebotene Firmware installiert. Bisher kein Effekt. Habe den beiden Mastern jeweils ein WiFi angebaut. Der eine Stack stabil. Der andere Stack zeigt immer noch die selben Symptome. (LEDs ganz normal wie der andere auch, aber nicht erreichbar per WiFi/USB) Ich werd am Wochenende mal die WiFi-Extensions tauschen und schauen was passiert. EDIT: Habe nun alles durch; Extension, Master und StepDown nacheinander getauscht, leider immer wieder Abstürze. Selbst die Bricklets habe ich nacheinander abgezogen und den Stack betrieben, selbes Ergebnis. Ich vermute nun EMV-Probleme. Werde bei Gelegenheit mal das Netzteil nach aussen verlegen, vielleicht hilft das. Habe nochmal ein Bild vom Aufbau angehängt, vielleicht fällt ja jemandem was auf.
  9. Moin, ich möchte mich mal hier einklinken, da ich mit einem meiner Stacks ein ähnliches Problem habe. Allerdings war das ursprünglich ein WiFi-Stack der irgendwann nicht mehr erreichbar war. Meist brach die Verbindung nach unterschiedlichen Zeitabständen zusammen. Mal wars ne halbe Stunde, konnte aber auch mal zwei Tage sein. Dachte erst es war die Stromversorgung, aber es wurde nach tausch dieser nicht besser. WiFi-Extension wars auch nicht, die hab ich auch schon ausgetauscht. Beim Testen habe ich den Stack inzwischen abgebaut und zu mir geholt, wenn der Stack nicht mehr per WiFi erreichbar ist, dann ist er auch nicht mehr per USB-Kabel verfügbar (Stromversorgung über StepDown). Erst ein Stack-Reset macht den Stack wieder verfügbar. Stack-LEDs leuchten ganz normal wie im Betrieb auch. Stack besteht aus 2 Master v1.0 mit aktueller Firmware. Werde die Tage den Stack nochmal trennen und testen und schauen ob es auf einen der beiden Master zurück zu führen ist.
  10. Moin, ich noch mal, habe die Lösung falls es jemanden interessiert Das Problem lag wohl nicht an der HashMap oder der Iteration, sondern an meiner eigenen Werte Objekt Klasse "BrickletWert.java". Ich musste daraus ein "immutable" Objekt machen. Ich habe mich dabei an diese Seite gehalten: http://www.torsten-horn.de/techdocs/java-concurrency.htm#Fehlschlagende-Synchronisationsversuche-Collections
  11. Moin, Die HashMap hole ich mit getHashMap über eine Methode in eine Andere Klasse. Da wird dann auch entrySet() angewendet. return hashMap.clone() hat leider auch nix gebracht, und ich habs auch nicht hinbekommen die HashMap manuell zu synchronisieren. Hashtable klappt, werde wohl diesen Weg weiter verfolgen. Danke für die Denkanstöße.
  12. Moin, ConncurrentHashMap hab ich versucht, leider ohne Änderung. Ich hab meinen Listener nochmal verändert und ein PreparedStatement hinzugefügt: @Override public void temperature(short temperature) { list_brickletWerte.put(this.uid, new BrickletWert(this.uid, "Temperatur", "" + temperature/100.0, "°C")); System.out.println(this.uid + " Temperature: " + temperature/100.0 + " °C"); //test try { java.sql.Connection connect = MysqlConnection.getConnection(); PreparedStatement preparedStatement; preparedStatement = (PreparedStatement) connect.prepareStatement("insert into BrickletWert (brickletUID, brickletDescription, brickletWert, brickletWertMasseinheit) values (?, ?, ?, ?) ON DUPLICATE KEY UPDATE BrickletWert=?"); preparedStatement.setString(1, this.uid); preparedStatement.setString(2, "Temperatur"); preparedStatement.setString(3, "" + temperature/100.0); preparedStatement.setString(4, "°C"); preparedStatement.setString(5, "" + temperature/100.0); preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } //test } Komischerweise stehen in der Mysql-Tabelle die Werte entsprechend richtig. Nur das mit der HashMap funktioniert nicht so wie ich das möchte. Wie würdet ihr das denn lösen? Ihr habt nen Host/Stack mit unbekannter Anzahl (in diesem Falle TempBricklets). Wenn der Stack verbunden ist sollen die tempListener den Temperaturwert in einer Variablen aktuell halten so das man anhand der BrickletUID die Temperatur aus der Variablen auslesen kann.
  13. Moin, ich habe ein Problem mit HashMaps und Listenern: public class EListener_Impl_EnumerateListener implements IPConnection.EnumerateListener { private String hostname; /** * Konstruktor des EnumerateListeners mit Angabe des auslösenden Hostnamens * @param hostname Hostname */ public EListener_Impl_EnumerateListener(String hostname) { this.hostname = hostname; } @Override public void enumerate(String uid, String connectedUid, char position, short[] hardwareVersion, short[] firmwareVersion, int deviceIdentifier, short enumerationType) { switch(enumerationType) { case IPConnection.ENUMERATION_TYPE_AVAILABLE: //(0): Gerät ist verfügbar (Enumerierung vom Benutzer ausgelöst). System.out.println("ENUMERATION_TYPE_AVAILABLE " + this.hostname + ":" + uid + ":" +enumerationType); TF_StackManager.addBricklet(uid, new Bricklet(hostname, uid, connectedUid, position, firmwareVersion, firmwareVersion, deviceIdentifier)); break; case IPConnection.ENUMERATION_TYPE_CONNECTED: // (1): Gerät wurde neu verbunden (Automatisch vom Brick gesendet nachdem die Kommunikation aufgebaut wurde). Dies kann bedeuten, dass das Gerät die vorher eingestellte Konfiguration verloren hat und neu konfiguriert werden muss. System.out.println("ENUMERATION_TYPE_CONNECTED " + this.hostname + ":" + uid + ":" +enumerationType); TF_StackManager.addBricklet(uid, new Bricklet(hostname, uid, connectedUid, position, firmwareVersion, firmwareVersion, deviceIdentifier)); break; case IPConnection.ENUMERATION_TYPE_DISCONNECTED: //(2): Gerät wurde getrennt (Nur bei USB-Verbindungen möglich). In diesem Fall haben nur uid und enumerationType einen gültigen Wert. System.out.println("ENUMERATION_TYPE_DISCONNECTED " + this.hostname + ":" + uid + ":" +enumerationType); TF_StackManager.removeBricklet(uid); break; } } } Mein Enumerate-Listener /** * Ein Bricklet hinzufügen * @param uid Bricklet UID als Key * @param bricklet Bricklet als Objekt */ public static void addBricklet(String uid, Bricklet bricklet) { if ((uid == null) || uid.equals("")) { throw new IllegalArgumentException(); } if (!list_bricklets.containsKey(uid)) { //216 Temperature Bricklet if(bricklet.getDeviceIdentifier() == 216) { try { String te_hostname = bricklet.getHostname(); IPConnection te_ipcon = list_stacks.get(te_hostname); BrickletTemperature temp = new BrickletTemperature(uid, te_ipcon); // Create device object temp.setTemperatureCallbackPeriod(1000); temp.addTemperatureListener(new TempListener_Impl_TemperatureListener(uid) ); } catch (TimeoutException e) { e.printStackTrace(); } catch (NotConnectedException e) { e.printStackTrace(); } } list_bricklets.put(uid, bricklet); } } TF_StackManager.addBricklet(String uid, Bricklet bricklet) private static class TempListener_Impl_TemperatureListener implements BrickletTemperature.TemperatureListener { private final String uid; public TempListener_Impl_TemperatureListener(String uid) { this.uid = uid; } @Override public void temperature(short temperature) { list_brickletWerte.put(this.uid, new BrickletWert(this.uid, "Temperatur", "" + temperature/100.0, "°C")); System.out.println(this.uid + " Temperature: " + temperature/100.0 + " °C"); } } Inner Class von TF_BrickManager. Inner Class damit ich auf die HashMap zugreifen kann mit dem Listener. private static HashMap<String, BrickletWert> list_brickletWerte = new HashMap<String, BrickletWert>(); Meine HashMap der BrickletWerte. for(Entry<String, BrickletWert> entry: stackManager.getBrickletWertlist().entrySet()) { String key = entry.getKey(); BrickletWert brickletWert = entry.getValue(); System.out.println( entry.getKey() + ": " + brickletWert.getBrickletUID() + " -> " + brickletWert.getBrickletDescription() + " -> " + brickletWert.getBrickletWert() + " " + brickletWert.getBrickletWertMasseinheit() ); } Diesen Code lasse ich nun alle 5 Sekunden Testweise ausführen um die aktuellen Temperaturen der Bricklets auszulesen. Leider bekomme ich immer sowas: rmk: 6EN -> Temperatur -> 33.56 °C dDY: 6EN -> Temperatur -> 33.56 °C 6EN: 6EN -> Temperatur -> 33.56 °C Komischerweise überschreibt der zuletzt getriggerte Listener alle Werte in der HashMap, und nicht wie vorgesehen nur ein Key,Value-Paar. Hatte jemand schonmal ein ähnliches Problem oder kann mir evtl. helfen und mir sagen wo mein Fehler liegt?
  14. Moin, nachdem Ihr nen 5"-Display im Shop habt, verändert Ihr dann auch den BrickViewer dahingehend das er nicht größer ist als der Touchscreen? Leider kann ich die statische IP-Adresse nicht über den Touchscreen einstellen (da ca. 1/3 des BrickV nicht sichtbar sind)
  15. Danke! Das ist so banal einfach, da hätte ich auch selbst dran denken können. Besonders weil ich die Klasse schon angelegt hatte. Nochmals danke.
  16. Moin, leider sind meine Java-Kenntnisse nicht all zu groß. Wenn ich dieses Beispiel verwende: http://www.tinkerforge.com/de/doc/Software/IPConnection_Java.html Gibt es die Möglichkeit innerhalb von EnumerateListener() die zugehörige ipcon zu identifizieren? Zum Beispiel den Host oder so? Ich habe mehrere WLAN-Stacks und möchte beim Enumerieren die gefundenen bricklets in eine (gemeinsame) Tabelle vermerken. Dazu wäre es dann natürlich schön in der Tabelle zu vermerken zu welchem Host/ipcon das Bricklet gehört. Das würde ich gerne tun, ohne von Hand für jede ipcon einen einzigartigen EnumerateListener() zu erstellen. Weiss da jemand Rat? LG BOBmoraine
  17. Moin, sry hatte keine Zeit umgehend zu Testen. Also ich habe beide Extensions entfernt und dann erstmal nur RS485 an dem Stack betrieben und per USB-Kabel verbunden -> Stack wird korrekt angezeigt. Habe dann die Ethernet-Extension wieder angebaut, allerdings diesmal so das Ethernet ganz oben am Stack sizt, und RS485 darunter (vorher wars umgekehrt). Danach Stack gebootet und siehe da, alles iO. Warum auch immer, es funktioniert nur wenn die Ethernet-Extension ganz oben sitzt.
  18. Moin, irgendwie bekomm ich das nicht hin, eine funktionierende Verbindung zwischen meinem RED-Stack und dem Slave-Stack herzustellen. Hat/Hatte jemand mit ähnlichen Problemen zu kämpfen und weiss Abhilfe? RED-Stack: (RED+Master+Master+EthernetExtension+RS485-Extension) Slave-Stack: (Master+RS485-Extension)
  19. Moin, ich bin mir nicht ganz sicher, daher wollte ich vorm Bestellen nochmal nachfragen: RED mit Ethernet- und RS485-Extension kann ich doch benutzen ohne Masterbrick oder? Oder brauche ich für die Extensions zwingend einen Masterbrick im Stack? Kann ich mit RED+RS485-Extension nun eigentlich die Schnittstelle für Modbus benutzen um mit anderen Teilnehmern zu kommunizieren (z.B. Frequenzumformer), oder ist dazu nen USB-Adapter nötig? Irgendwo hatte ich im Forum mal gelesen das TCP auf RS485 gemapt wird bei TF oder so. Ist das noch aktuell, oder kann ich die RS485-Schnittstelle beim RED in größerem Umfang benutzen wie bisher?
  20. Bei mir wird nun auch alles ordnungsgemäß angezeigt.
  21. Moin, so sollte es gehen: Wenn beide Relays jeweils gleichzeitig A oder B ansteuern dreht dein Motor. Bitte beachten das das eine "unschöne" Lösung ist. Für kleinmotoren kannste die Durchaus nehmen, aber wenn du was größeres vor hast würde ich dir raten noch 2 Relais zur Hilfe zu nehmen und eine "Schützverriegelung" zu realisieren.
  22. Moin, ja, Connect/Disconnect hatte ich mehrmals gemacht, ohne Ergebnis. Reset der Master habe ich gerade mal getestet, egal welchen Master ich resette, kein Unterschied. Erst wenn ich den RFID abziehe und einen Master resette bekomme ich wieder eine korrekte Darstellung.
  23. Moin, also hab gerade mal aus Verdacht nacheinander alle Bricklets abgezogen.... und siehe da, ein Ergebnis: Der Stack funktioniert nun mit RED, aber nur wenn der RFID abgezogen ist
  24. Moin, ja ist alles aktuell (ohne RED): So siehts aus mit RED:
×
×
  • Neu erstellen...