Jump to content

André K.

Members
  • Content Count

    53
  • Joined

  • Last visited

Community Reputation

0 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Das könnte etwas schwierig werden 😂 Aber ich hoffe Du lässt es noch etwas laufen, hier dauert es ja auch manchmal Tagelang. Und ich meine, eines hat sich seit dem Einspielen der Test-FW ja auch geändert, nämlich daß per Getter nicht immer derselbe Wert geliefert wird. André
  2. 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é
  3. 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é
  4. Update 😅 Diesmal hat es nur 15 Minuten gedauert bis zum erneuten Auftreten … gleiches Bild, Callback-Config "vergessen" aber jetzt wurde ein "error_count_frame" gezählt: Error status: array(4) { ["error_count_ack_checksum"]=> int(0) ["error_count_message_checksum"]=> int(0) ["error_count_frame"]=> int(1) ["error_count_overflow"]=> int(0) } André
  5. 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é
  6. 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: ("Temperatur 2" ist übrigens der Wert vom Humidity-Bricklet) Soll ich noch irgendwas spezielles testen, bevor ich gleich per Brick-Viewer drauf gehe? André
  7. 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é
  8. 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é
  9. Hat funktioniert, nachdem das Problem heute Mittag wieder aufgetreten war — irgendwie häuft es sich … aber dann sehen wir wenigstens, ob es eine Besserung bringt. PS: Hab das Update tatsächlich ohne vorigen Reset des Bricklets eingespielt, danach war es dann auch wieder "lebendig". André
  10. Vielen Dank, werde ich gleich morgen einspielen! Muß ich das File erst noch entpacken? "zbin" klingt so als ob das durch gzip gelaufen ist ... André
  11. Vorhin ist es wieder aufgetreten, ich hab mal ein kurzes Bildschirmvideo gemacht ... nach dem Reset verschwindet das Bricklet aus der Liste, nachdem man sich neu verbindet ist es dann wieder zu sehen und arbeitet auch normal. (Video ist etwas klein geraten, ich hoffe man erkennt es trotzdem) ausfall_20200719.mov
  12. 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? 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é
  13. 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é
  14. 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é
  15. 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é
×
×
  • Create New...