Jump to content

BOBmoraine

Members
  • Gesamte Inhalte

    42
  • Benutzer seit

  • Letzter Besuch

Posts erstellt 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,

    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.

  3. 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?

     

  4. 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.

  5. Danke, das wars!

    Hier nochmal der Quote:

    Da steht sich das perl Package mit einigen anderen Packages auf den Füssen. Ich denke, dass ist ein Bug im perl Package selbst.

     

    In dieser Situation verweigert apt-get die Arbeit, weil es erst diese Problem beseitigt haben will.

     

    Ich konnte das Problem reproduzieren und so auflösen:

     

    sudo dpkg --purge cpanminus
    sudo dpkg --purge liblocal-lib-perl
    sudo dpkg --purge libmodule-build-perl
    sudo dpkg --purge libjson-pp-perl
    sudo dpkg --purge perl-doc
    sudo apt-get -f install
    sudo apt-get upgrade

     

    Jetzt stehen sich systemd und systemd-shim im Weg:

     

    sudo dpkg --purge systemd-shim
    sudo apt-get -f install
    sudo apt-get install systemd-shim
    sudo apt-get upgrade

  6. 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".

  7. 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.

    master.thumb.jpg.b6eafd7fcc2a72d0c66868f3344c1b55.jpg

    20150427_152115_b.thumb.jpg.2af7d672ed3fde085537b5b77abc01f3.jpg

  8. 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.

    Brick_Viewer_2.2.4_2015-04-21_22-42-12.png.0f6149adff9cd8687eaa29e865d4ec38.png

  9. 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

     

     

  10. 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.

  11. 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?

     

  12. 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

  13. 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.

  14. 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?

×
×
  • Neu erstellen...