Jump to content

André K.

Members
  • Gesamte Inhalte

    62
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von André K.

  1. vor 2 Stunden schrieb batti:

    Je nach Größe des angeschlossenen Systems und der damit verbundenen Last wird die Ethernet Extension mit PoE wirklich warm. Ist dann kein Luftaustausch möglich, z.B. in einem geschlossenen Gehäuse, dann staut sich diese Wärme natürlich.

    Das ist richtig, da mein Gehäuse ja im Außenbereich hängt ist das aber "per Design" ohne Luftaustausch, denn es darf ja kein Wasser eindringen.

    Welcher Temperaturbereich wird den "offiziell" unterstützt?

    André

  2. vor 12 Stunden schrieb Tipsy Tinker:

    Die Abwärme des PoE-LAN Master sorgt regelmäßig für Gehäuseinnentemperaturen im Temeperaturbereich < ~60 °C . Ich habe den Verdacht, das ein Zusammenhang bestehen könnte.

    Würde ich auch als wahrscheinlich ansehen, bei mir traten jetzt bei den heißen Tagen die Ausfälle wie erwähnt schon bei unter 50°C im inneren auf. Wie misst Du die Temperatur im Gehäuse? Bei mir habe ich dafür ein ausrangiertes Temperature 1.0 Bricklet drin.

    André

  3. Danke für die Info!

    Bevor ich an dem einen Tag hingefahren bin habe ich noch ein paar Versuche mit Telnet unternommen, bis dann irgendwann auch da nur noch "Connection refused" kam und auch der Brick Viewer keine Verbindung mehr aufbauen konnte. Ich schätze, daß einer der Master-Bricks ausgestiegen ist.

    In den Tagen danach, als es wieder so heiß war, ist der Stapel noch zwei Mal komplett ausgefallen, jedes Mal so um die 50°C gemessener Innentemperatur herum. Da scheint dann also so etwa die Grenze zu sein. Wenn es sich auf ein paar Tage im Jahr beschränkt werde ich damit leben müssen … die alte Conrad-Telemetrie-Wetterstation die über 20 Jahre dort in einem viel kleineren Gehäuse hing hat das übrigens klaglos mitgemacht ;)

    André

  4. Ich krame diesen Thread mal hervor …

    Meine Erfahrung der letzten Tage ist, daß es ab 45°C anscheinend kritisch wird. Was natürlich für eine Wetterstation irgendwie blöd ist, aber da muß ich mir wohl was einfallen lassen wie ich das löse.

    Vielleicht kann jemand vom Tinkerforge-Team aber nochmal was "Offizielles" dazu sagen.

    André

  5. Bin gestern übrigens doch noch vor Ort gefahren und hab den Stecker kurz gezogen. Dabei ist auch zum ersten mal eine "unhandled enumeration" vorgekommen, das Logging funktioniert also grundsätzlich.

    Für welchen Betriebs-Temperaturbereich ist der Master-Brick und die Ethernet-Extension eigentlich ausgelegt? Nicht daß ich da zu großzügig bin … ich hab das alte Temperature-Bricklet ja in den grauen Kasten verfrachtet und zuletzt hatte es 49°C gemeldet. Viel, aber noch nicht kritisch, oder doch?

    André

  6. Es nimmt kein Ende … heute Morgen ist wieder das eine Bricklet ausgestiegen, und noch bevor ich jetzt daheim war hat es um kurz vor vier anscheinend den ganzen Stapel zerlegt. Der Brick Viewer connected sich, aber zeigt nix an. Auf Ping antwortet es noch. Was kann ich noch tun, außer zum Haus meiner Eltern zu fahren und das Netzwerkkabel zu ziehen? ;)

    Zu dumm daß der Switch nicht gemanaged werden kann, sonst hätte ich ja kurz PoE abdrehen können, sowas fällt einem immer erst hinterher ein …

    André

  7. vor 5 Stunden schrieb rtrbt:

    Die (Koprozessor-)Bricklets warten beim Boot eine Sekunde auf eine Enumerate-Anfrage, wenn die nicht kommt schicken sie von sich aus ein Enumerate mit connection_type=..._CONNECTED. Deshalb meinte ich, dass du bei deinem Enumerate-Handler darauf reagieren solltest.

    Ah OK … wie gesagt, seit dem 22. Juli sollte ich das mitbekommen. Wirklich testen konnte ich es ja nicht, aber der else-Zweig ist ja so simpel, der sollte funktionieren …

    Ich würde also eher mal tippen daß etwas anderes passiert als ein "sauberer" Reboot. Deutet dieser eine gezählte Fehler auf nichts hin? Und was hat Dein Versuchsaufbau ergeben?

    André

  8. vor 1 Stunde schrieb rtrbt:

    Das ist für mich ein sehr starker Indikator dafür, dass das Bricklet sich resettet. Mir ist nur unklar warum das so oft passiert und warum du die Enumerations nicht siehst, wenn es wieder kommt.

    Von wem wird die denn angestoßen, vom Master? Und wie bekommt der das mit — senden die Bricklets beim „Booten“ eine entsprechende Nachricht?

    Bis jetzt läuft übrigens alles noch normal …

    André

  9. vor 17 Stunden schrieb rtrbt:

    Bevor du mit dem Brick-Viewer drauf gehst frag mal (mit einem Python-Script oder sowas) die Callback-Konfiguration und die aktuelle Temperatur ab (jeweils mit dem Getter, nicht die Temperatur per Callback abfragen).

    Habe ich jetzt mal gemacht, mit (für mich) durchaus überraschendem Ergebnis: Per getter erhalte ich tatsächlich einen plausiblen Wert, der sich auch von Aufruf zu Aufruf geringfügig ändert.

    Aber: Das Bricklet hat anscheinend die Callback-Config vergessen, und auch die Status-LED-Config ist auf dem Defaultwert 3.

    Das hier ist das komplette Test-Skript:

    require_once('Tinkerforge/IPConnection.php');
    require_once('Tinkerforge/BrickletTemperatureV2.php');
    
    use Tinkerforge\IPConnection;
    use Tinkerforge\BrickletTemperatureV2;
    
    const HOST = '192.168.1.105';
    const PORT = 4223;
    const UID = 'KEv'; // Change XYZ to the UID of your Temperature Bricklet 2.0
    
    $ipcon = new IPConnection(); // Create IP connection
    $t = new BrickletTemperatureV2(UID, $ipcon); // Create device object
    
    $ipcon->connect(HOST, PORT); // Connect to brickd
    
    // Get current temperature
    $temperature = $t->getTemperature();
    echo "Temperature: " . $temperature/100.0 . " °C\n";
    
    echo "Callback configuration:\n";
    $conf = $t->getTemperatureCallbackConfiguration();
    var_dump($conf);
    
    echo "LED status:\n";
    $led_status = $t->getStatusLEDConfig();
    var_dump($led_status);
    
    echo "Error status:\n";
    $error_status = $t->getSPITFPErrorCount();
    var_dump($error_status);
    
    echo "Press key to exit\n";
    fgetc(fopen('php://stdin', 'r'));
    $ipcon->disconnect();

    Und das hier die komplette Ausgabe:

    Temperature: 24.5 °C
    Callback configuration:
    array(5) {
      ["period"]=>
      int(0)
      ["value_has_to_change"]=>
      bool(false)
      ["option"]=>
      string(1) "x"
      ["min"]=>
      int(0)
      ["max"]=>
      int(0)
    }
    LED status:
    int(3)
    Error status:
    array(4) {
      ["error_count_ack_checksum"]=>
      int(0)
      ["error_count_message_checksum"]=>
      int(0)
      ["error_count_frame"]=>
      int(0)
      ["error_count_overflow"]=>
      int(0)
    }
    Press key to exit
    

    So, und nachdem ich mich anschließend via Brick-Viewer verbunden habe (und damit die Enumeration getriggert habe) kamen auch sofort wieder Callbacks an, ohne zusätzlichen Reset. Und das kleine PHP-Skript hat dann auch die korrekte Callback-Config geliefert:

    Callback configuration:
    array(5) {
      ["period"]=>
      int(1000)
      ["value_has_to_change"]=>
      bool(true)
      ["option"]=>
      string(1) "x"
      ["min"]=>
      int(0)
      ["max"]=>
      int(0)
    }
    LED status:
    int(0)
    

    Ich hoffe, mit diesen Infos kannst Du was anfangen. ;)

    André

  10. vor 8 Minuten schrieb rtrbt:

    Hast du in deinem Log die Unhandled enumeration Meldung bekommen?

    Bislang kein einziges Mal, weder im Syslog noch in der Datenbank. Dieser else-Zweig ist allerdings erst seit der Version vom 22. Juli drin.

    Übrigens, während wir hier schreiben ist es wieder aufgetreten ;) bzw. heute morgen um kurz vor 10, ich hab da so eine interne Statusseite auf der ich nachsehen kann wann zuletzt was eingetrudelt ist:

    836052133_Bildschirmfoto2020-07-31um15_10_21.png.c85231f17cda2cb4fd76d3bddb29debc.png

    ("Temperatur 2" ist übrigens der Wert vom Humidity-Bricklet)

    Soll ich noch irgendwas spezielles testen, bevor ich gleich per Brick-Viewer drauf gehe?

    André

  11. vor 3 Minuten schrieb rtrbt:

    Der Fehler war auch wieder, dass du über Minuten zwar Callbacks bekommen hast, aber die immer den selben Wert hatten?

    Nee, Callbacks gab es (wie zuvor auch) keine mehr, das Bricklet ist quasi "verstummt" so als ob sich die Temperatur nicht ändern würde.

    Dies ist meine kompletter Enumerate-Callback-Handler, es fehlen lediglich die CASEs für die ganzen anderen Bricklets:

    void cb_enumerate(const char *uid, const char *uplink_uid, char pos, uint8_t hw_vers[3], uint8_t fw_vers[3], uint16_t did, uint8_t enume_type, void *user_data)
    {
    	/* Nur auf manuell angestoßene Aufzählungen reagieren: */
    	if(enume_type == IPCON_ENUMERATION_TYPE_AVAILABLE) switch (did)
    	{
    		case TEMPERATURE_V2_DEVICE_IDENTIFIER:
    			if (cfg_dumpmode) printf("Found %s with UID=%s\n", TEMPERATURE_V2_DEVICE_DISPLAY_NAME, uid);
    
    			/* Wurde der Speicher noch nicht allokiert? */
    			if (bl_thermo_v2 == NULL) bl_thermo_v2 = new TemperatureV2;
    			else temperature_v2_destroy(bl_thermo_v2);
    			temperature_v2_create(bl_thermo_v2, uid, &bd_conn);
    
    			/* Status-LED ausschalten: */
    			temperature_v2_set_status_led_config(bl_thermo_v2, TEMPERATURE_V2_STATUS_LED_CONFIG_OFF);
    
    			/* Callback für Temperatur: 1s */
    			temperature_v2_register_callback(bl_thermo_v2, TEMPERATURE_V2_CALLBACK_TEMPERATURE, (void (*)(void))cb_temperature, NULL);
    			temperature_v2_set_temperature_callback_configuration(bl_thermo_v2, 1000, true, TEMPERATURE_V2_THRESHOLD_OPTION_OFF, 0, 0);
    			break;
    
    		default:
    			if (cfg_dumpmode) printf("Found other Device: DID=%d UID=%s\n", did, uid);
    			break;
    	}
    	else
    	{
    		/* Nicht behandelte Aufzählung loggen: */
    		packet_enqueue(VALUE_EVENT, EV_UNHANDLED_ENUM);
    		syslog(LOG_INFO, "Unhandled enumeration: type=%i DID=%d UID=%s", enume_type, did, uid);
    	}
    }

    Könnte das Beeinflussen der LED was bewirkt haben?

    André

  12. Heute Morgen ist der Fehler wieder aufgetreten …

    Anders als die letzten Male reichte jetzt aber ein Connect vom Brick-Viewer, um das Bricklet wieder zum Leben zu erwecken. Ich musste also nicht auf den Reset-Button klicken.

    Ob es wirklich der Brick-Viewer war, oder mein Daemon (der ja jedes Mal eine Initialisierung vornimmt wenn ein ENUMERATE angestoßen wurde, was beim Connect vom Viewer ja passiert) kann ich natürlich nicht genau sagen …

    André

  13. vor 4 Stunden schrieb rtrbt:

    Mir ist aber auch unklar, warum es bei dir zwei Resets braucht. Hast du eventuell nach dem ersten nicht lang genug gewartet?

    Das will ich nicht ganz ausschließen, und so ganz habe ich das mit dem Reset eh noch nicht durchschaut. Es ist ja auf jedem Tab ein eigener Reset-Button vorhanden, aber mein Eindruck ist, daß immer der ganze Stapel resettet wird. Kann das sein? Also daß es quasi egal ist, wo man den Button drückt?

    vor 4 Stunden schrieb rtrbt:

    Welche Callback-Konfiguration benutzt du für das Bricklet?

    Ich poste einfach mal den relevanten Teil aus dem Quelltext:

    temperature_v2_create(bl_thermo_v2, uid, &bd_conn);
    
    /* Status-LED ausschalten: */
    temperature_v2_set_status_led_config(bl_thermo_v2, TEMPERATURE_V2_STATUS_LED_CONFIG_OFF);
    
    /* Callback für Temperatur: 1s */
    temperature_v2_register_callback(bl_thermo_v2, TEMPERATURE_V2_CALLBACK_TEMPERATURE, (void (*)(void))cb_temperature, NULL);
    temperature_v2_set_temperature_callback_configuration(bl_thermo_v2, 1000, true, TEMPERATURE_V2_THRESHOLD_OPTION_OFF, 0, 0);

    Schon mal vielen Dank!

    André

  14. Am 22.6.2020 um 10:09 schrieb rtrbt:

    Moin,

    Das kann eigentlich nur passieren, wenn du entweder einen Code-Pfad hast, der das Callback deaktiviert, oder wenn das Bricklet aus irgendwelchen Gründen beschlossen hat, sich zu resetten. Hast du eventuell ein sporadisches Enumerate vom Bricklet gesehen, bevor keine Daten mehr kamen? Wenn das Bricklet ein Enumerate mit dem Enumeration-Type ENUMERATION_TYPE_CONNECTED (=1) schickt, dann hat es sich neugestartet.

    Erik

    Gestern Abend ist der Fall wieder passiert …

    Leider hatte ich unterdessen noch keine Zeit, die Ergänzung in meinen Daemon einzubauen. Aber ich bin mir gar nicht mehr sicher, ob ein Spontan-Reset überhaupt der Grund sein kann.

    Wie es sich gestern geäußert hat: Das Temperature-Bricklet 2.0 hat gegen kurz nach 20 Uhr, wie beim letzten Vorfall im Juni auch, einfach keine neuen Werte mehr geliefert, der zuletzt gelieferte Wert war 20,6°C. Gegen 23:30 Uhr ist es mir dann aufgefallen. Ich habe mich dann per Brick-Viewer aufgeschaltet. Der Graph auf dem Tab des Temperetaure-Bricklets wurde wie gewohnt Stück für Stück gezeichnet, allerdings als Gerade, und mit besagten 20,6°C. Der Brick-Viewer fragt doch per getter ab, oder?

    Es brauchte zwei Resets, bis es wieder da war, und die zu dieser Zeit korrekte Temperatur von irgendwas bei 10 Grad anzeigte. Kann das dann überhaupt der vermutete spontane Reset sein?

    André 

  15. Am 22.6.2020 um 16:10 schrieb rtrbt:

    Wenn du das weglässt, konfigurierst du auch alles, wenn du eine Enumerierung mit ENUMERATION_TYPE_DISCONNECTED bekommst, da sollte aber der Code auf keinen Fall laufen.

    Hast natürlich Recht, deshalb habe ich das if() wohl auch drin. ;)

    So ganz klar ist mir der ENUMERATION_TYPE_DISCONNECTED übrigens noch nicht. Ist damit der Fall gemeint, daß ein einzelnes Bricklet weg ist, also wenn ich im Laufenden Betrieb den Stecker ziehen würde? Oder ist das sozusagen die "USB-Version" vom IPCON_CALLBACK_DISCONNECTED, das es ja auch noch gibt? Also wenn ich das USB-Kabel des Stapels vom Rechner abziehe? In der Doku steht ja auch der Hinweis "Nur bei USB-Verbindungen möglich".

    André

  16. vor 22 Minuten schrieb rtrbt:

    Bei einem Reconnect der IP-Connection kann es im worst-case natürlich sein, dass während du nicht verbunden warst, eins der Bricklets neugestartet wurde, um maximal robust zu sein musst du da also auch alles was du brauchst neu konfigurieren.

    Das passiert ja eh, denn bei einem Reconnect wird ja ipcon_enumerate() aufgerufen, und das Enumerate-Callback sieht so aus:

    void cb_enumerate(const char *uid, const char *uplink_uid, char pos, uint8_t hw_vers[3], uint8_t fw_vers[3], uint16_t did, uint8_t enume_type, void *user_data)
    {
    	/* Nur auf manuell angestoßene Aufzählungen reagieren: */
    	if(enume_type == IPCON_ENUMERATION_TYPE_AVAILABLE) switch (did)
    	{
    		case AMBIENT_LIGHT_V3_DEVICE_IDENTIFIER:
    			if (cfg_dumpmode) printf("Found %s with UID=%s\n", AMBIENT_LIGHT_V3_DEVICE_DISPLAY_NAME, uid);
    
    			/* Wurde der Speicher noch nicht allokiert? */
    			if (bl_light == NULL) bl_light = new AmbientLightV3;
    			else ambient_light_v3_destroy(bl_light);
    			ambient_light_v3_create(bl_light, uid, &bd_conn);
    
    			/* Konfiguration: 0-64000 Lux (= kein Gain), 150ms (Default laut Datenblatt: 100ms) */
    			ambient_light_v3_set_configuration(bl_light, AMBIENT_LIGHT_V3_ILLUMINANCE_RANGE_64000LUX, AMBIENT_LIGHT_V3_INTEGRATION_TIME_150MS);
    			ambient_light_v3_set_status_led_config(bl_light, AMBIENT_LIGHT_V3_STATUS_LED_CONFIG_OFF);
    
    			/* Callback für Umgebungshelligkeit: 1s */
    			ambient_light_v3_register_callback(bl_light, AMBIENT_LIGHT_V3_CALLBACK_ILLUMINANCE, (void (*)(void))cb_illuminance, NULL);
    			ambient_light_v3_set_illuminance_callback_configuration(bl_light, 1000, true, AMBIENT_LIGHT_V3_THRESHOLD_OPTION_OFF, 0, 0);
    			break;

    Und dann folgen halt noch CASEs für sämtliche andere Bricklets die so zum Einsatz kommen.

    Vielleicht reicht es ja schon, einfach das if (enum_type == …) wegzulassen? Ich weiß gerade gar nicht mehr warum ich das da eingebaut habe xD

    André

  17. Kann ich denn davon ausgehen, daß sich das Bricklet dann im Initialzustand befindet? Oder sollte ich da vorher am besten noch eine Art Reset/Wipe auslösen, wenn das geht?

    Bei einem Verlust der IP-Connection habe ich das übrigens folgendermaßen gelöst:

    void cb_connected(uint8_t reason, void *user_data)
    {
    	syslog(LOG_INFO, "Connection to brickd (re)established (reason=%i)", reason);
    
    	/* Bei einem Reconnect Aufzählung (und damit Initialisierung) neu anstoßen: */
    	if(reason == IPCON_CONNECT_REASON_AUTO_RECONNECT) ipcon_enumerate(&bd_conn);
    }

    Da baue ich aber auch im Vertrauen darauf, daß sich die Bricklets "hoffentlich" alle noch im Initialzustand befinden — was aber natürlich nicht der Fall sein muß. Wenn sich jemand per Brick Viewer verbindet und eine Einstellung ändert die ich nicht extra initialisiere weil der Default OK ist wird die Einstellung vermutlich auch so bleiben …

    Wie macht man sowas am elegantesten?

    André

×
×
  • Neu erstellen...