OWX + DS9097: 1-Wire-search gefixed und OWX_ASYNC support

Begonnen von ntruchsess, 04 August 2014, 23:29:43

Vorheriges Thema - Nächstes Thema

ntruchsess

Ich hab mir mal den OWX-code zum passiven DS9097-interface zur Brust genommen und den Support dafür in OWX_ASNYC eingebaut. Danke an @dan1180 für die Überlassung seines Selbstbauinterfaces.
Hab dabei im klassischen OWX-code 2 Fehler im 1-Wire-suchalgorithmus gefixed, die verhindert haben, dass überhaupt mehr als 1 Device gefunden wird - das scheint aber bisher nicht viele gestört zu haben ;-)

Naja - was soll man sagen: die Performance ist nicht wirklich umwerfend (hätte nicht gedacht, dass der passive Adapter in Verbindung mit OWX soooo schlecht ist...), die Bussuche dauert etliche (>10) Sekunden (genauso wie beim synchronen OWX), wobei im Gegensatz zu letzterem keine Freezes auftreten und das Webinterface flüssig bedienbar bleibt :-). Mit den Intervallen muss man also bei Verwendung dieses Busmasters sehr defensiv umgehen. (Jedes Device hat ein internal 'NUMTASKS', an dem man die Zahl der gequeueten 1-Wire-abfragen sehen kann. Wenn der Wert hochzählt, dann hat man das Interval zu klein gewählt...). Abgesehen davon, dann man halt die bei OWX sonst üblichen Intervalle mit OWX_ASYNC beim DS9097 nicht signifikant verringern kann, scheint es aber relativ zuverlässig zu funktionieren. Mit meiner Testsuite aus 8 1-Wire devices (alles außer OWX_LCD) kommt es jedenfalls gut klar.

Ist ins SVN committed und damit in Kürze per fhem update zu beziehen.

Gruß,

Norbert
while (!asleep()) {sheep++};

ntruchsess

Den 1-Wire Search für OWX_ASYNC mit DS9097-interfaces habe ich noch optimieren können. Je mehr Bits einer Device-addresse schon bekannt sind, desto schneller. Hat man also mehrere Devices der gleichen Familie, dann werden ab dem 2. Device die ersten 8 Bits nicht mehr inkrementell, sondern in einem Rutsch gelesen. Die Prüfsumme wird bei allen Devices aus den schon gelesenen 56 Bits errechnet und in einem Rutsch verifiziert. Das lesen einer schon bekannten Addresse auf dem Bus ('get present') geht jetzt in einem Rutsch. Das wirkt sich insbesonders beim OWID aus - da kommt die Anwort jetzt in Sekundenbruchteilen, mit dem alten Algorithmus war das die totale Bremse :-)

Gruß,

Norbert
while (!asleep()) {sheep++};