Wir haben hier in Berlin ja nen kleinen Labor-Teststand eines Bob-Hats und im Dezember dort mal die neuste Firmware von @Andreas, FiPy-1.20.1.r1-0.7.0-vanilla-dragonfly-onewire-i2s.tar.gz, drauf getan: Das Ding lief 4.5 Wochen ohne Reboot durch! Denn ist vor ca. 2.5 Wochen jemand gegen das Kabel gekommen; seit dem gab es aber auch keinen weiteren Reboot.
Bei mir taucht der Fehler auf, wenn ich versuche, die Treiber in hiverize/fipy der Uni Bremen (@Diren, @vinz und @caro ) einzubauen.
Ebenso wenig schaffe ich es, das Webinterface zur Konfiguration anzupassen.
Frage: mit welcher Software bearbeitet man die *.js, *.html und *.css Dateien für den Webserver?
Die *.py bearbeite ich mit Atom und pymkr.
So weit ich das weiß sind die “Webserver-Dateien”, also *.js, *.html und *.css, autogenerated von irgendeinem Framework das @vinz verwendet hat. Die sind nur komisch formatiert, daher doof in Atom zu bearbeiten, aber im Prinzip sollte man Atom dafür genausogut verwenden können. Die Frage ist nur, müssen wir sie händisch anpassen oder sollen / können wir das tool nehmen, da @vinz auch verwendet hat.
Hatte mir das Mal vor ein paar Monaten angeschaut.
Das verwendete Framework ist vue.
Gibt glaube ich dafür ein Plugin für Atom.
Für VisualStudio auf alle Fälle.
Das meißte davon ist das Framework. Das eigentliche von @vinz geschriebene Teil ist gar nicht so groß aber in unformatierten Text. Gibt aber Tools, die das wieder übersichtlicher und lesbar machen kann.
Ich habe die Varianten a), b) und c) untersucht und bin auf folgende Probleme gestossen:
Timing:
In Variante a) und b) wird das Timing in onewire.py bestimmt:
def readbit(self):
sleep_us = time.sleep_us
pin = self.pin
pin(1) # half of the devices don't match CRC without this line
i = self.disable_irq()
pin(0)
# skip sleep_us(1) here, results in a 2 us pulse.
pin(1)
sleep_us(5) # 8 us delay in total
value = pin()
self.enable_irq(i)
sleep_us(40)
return value
Das führt zu häufigen Messfehlern.
Variante c) überlässt das Timing dem eingebauten MicroPython:
def readbit(self):
return _ow.readbit(self.pin)
Damit werden die CRC-Fehler sehr viel weniger.
Fehler-Erkennung
In Variante a) gibt es keinen CRC-Check. Damit werden auch fehlerhafte Bit weitergereicht und man wundert sich (nicht) über seltsame Messwerte. Das sind keine gültigen Werte.
In Variante b) und c) gibt es einen CRC-Check in ds18x20.py:
if self.ow.crc8(self.buf):
raise Exception('CRC error')
Fehler-Behandlung
In Variante c) gibt es bei CRC-Error eine Exception, die abgefangen wird:
Z.Z. traten im Testprogramm bei 24500 Zyklen * 6 Sensoren = 147000 Messungen ganze 3 CRC-Fehler auf.
nun sind es bei 40000 Zyklen * 6 Sensoren = 240000 Messungen 7 CRC-Fehler
Ergänzung am 1.2.2020
Beim Einbau der Treiber in Hiverize/FiPy erhöht sich die Anzahl der CRC-Fehler deutlich, vermutlich weil der Pozessor noch nebenbei andere Dinge wie WLAN usw. zu tun hat:
bei 7500 Zyklen * 6 Sensoren = 45000 Messungen sind es 97 CRC-Fehler.
Die werden durch eine Exception abgefangen ( siehe oben ).
Es gibt aber noch eine weitere Exception mit (noch) unbekannter Herkunft, die früher zu Reboots geführt hat. Sie taucht bei der Ausgabe bei OLED auf, immer nach einem CRC-Fehler, obwohl DS18B20 mit Onewire-Bus und OLED mit I2C-Bus in Hardware und Software nichts miteinander zu tun haben.
Ich kann sie dort abfangen:
...
try:
_oled.fill(0) # alles aus
_oled.text(str(cycle), 0, 0)
....
except:
print('OLED Fehler',end=' ')
Erklären kann es nicht.
Ergänzung am 2.2.2020
Die Software läuft ziemlich stabil, aber beim Start kann es vorkommen, dass nicht alle DS18B20 gefunden werden. Vielleicht kann jemand bei der Fehlersuche helfen? FiPy-2001test.zip (88,9 KB)
There is a simple, undocumented, way to discriminate between the power-up 85 °C-reading and a genuie temperature reading of 85 °C in authentic DS18B20 [5]: <byte 6> of the scratchpad register. If it is 0x0c , then the 85 °C-reading is a power-up reading, otherwise it is a true temperature measurement. Does not work with clones of Families B, C, or D, though.
wird kaum nötig sein: er höchstselbst hatte dieses Fundstückt verlinkt. ;)
… es sei denn, Du wolltest ihn speziell auf die Möglichkeit der Unterscheidung zwischen Original und Fälschung per Treiber hinweisen. Ob er allerdings ein undokumentiertes feature dafür einbauen wollen würde?!
Wir hatten die Diskussion bei den 85 °C-Werten, die ja nicht durch die CRC-Checks rausgefiltert werden, sondern als valide Messungen in der Datenbank landen. Mein damaliger Vorschlag war Werte mit 85 einfach zu ignorieren, d.h. statt dessen missings einzutragen. Für unsere Domäne wäre das kein Problem, weil wir weder beim Wetter noch bei den Bienen auf so hohe Temperaturen kommen. Robert wollte diese Ersetzung aber nicht generell machen, zu Recht, da es ja Anwendungsdomänen gibt, die schon mal auch genau 85,00 °C messen könnten. Nun ist die Frage, ob wir mit diesem Fundstück “richtige” Messungen von Fehlercode-85 unterscheiden können und die dann nicht als Messwerte behandeln.
Wie denn? Das ginge nur bei den Originalen, - und die hat hier ohnehin keiner: wir brauchen uns nichts vormachen, praktisch alle vergossenen 18B20 in Hülsen aus China zum Preis des Einzelbauteil-Originals sind Fälschungen / clones. Bei diesen funktioniert dieser Test ohnehin nicht, also ist er lediglich dazu geeignet, Original von Fälschung zu unterscheiden - immerhin.
Ahh, so pessimistisch war ich bisher noch nicht, hab auch die “teuren” für 5 EUR gekauft. :-) Aber ja, du wirst leider richtig liegen mit der Annahme … Das würde dann aber doch dafür sprechen, dass wir die 85,00 °C als missing definieren, weil sie vermutlich nur seeehr selten real auftreten und deutlich wahrscheinlicher als Fehlercode aufkommen.
@didilamken hast du bei deinen Messungen nach Einführung der CRC-Checks die realen Werte aufgezeichnet – im BOB backend werden Ausreißer ja seit einiger Zeit gefilter, d.h. ein Blick darauf bringt bei meinen Daten nichts – und kannst sagen wie häufig die 85,00 °C noch auftauchen?
Perhaps DS18B20 has been “reseted” every time before reading due to power cycle and so it seems to be more stable under an unstabel (software) driver but I see really no need to use a GPIO pin for power especially for the DS18B20 because it consumes – even in deep sleep and in ultra low power relations – nearly no power! So it’s a workaround for bad software but not a solution!
Weiter unten steht ja auch
After further investigation it seems like output current of 3V3 is not enough to supply all sensors on the board or the chinese prototype circuit board is just so thin that it is limiting the current. We moved the 5V to be supplied the battery directly and now it works, so clearly hardware related.
Finde so ein posting hier ist eher missleading und hat mit unserem Problem hier nichts zu tun. Didi hatte ja auch schon berichtet, dass es mit gleicher Hardware und dem Arduino-Sketch stabile Daten gibt, muss also ein Software-Problem sein!