Hallo zusammen,
als fleissiger Nutzer von 1-Wire Temperatursensoren habe ich lange Zeit das alte GPIO4 Modul unter Contrib genutzt, bis ich bemerkt habe, dass im Forum auch neuere Versionen davon "rumgeistern".
Es scheint sich aber niemand gefunden zu haben, der es wieder offiziell maintainen will. Ich möchte hierzu einen Versuch starten.
Dieses Modul basiert zwar auf den mir bekannten GPIO4 Versionen, wurde aber von grundauf neu konzipiert.
Funktionale Unterschiede zum GPIO4 Modul aus dem Forum:- Erkennt alle in
https://www.kernel.org/doc/html/latest/w1/slaves/index.html genannten 1-Wire Chips (unterstützt deswegen aber nicht zwangsläufig auch alle)
- Kann den Zustand der beiden bislang nicht supporteten 2-port switches lesen (ungetestet)
- Führt ein Attribut tempFactor zusätzlich zum tempOffset ein
- Einstellbare Anzahl Dezimalstellen der Temperaturausgabe
- Unterstützt die resolution/precision und conv_time zu lesen - und abhängig von den Rechten auch zu setzen
- Wahlweise blocking, non-blocking und timer-gesteuerter "2-fach-lese" Modus (mehr dazu unten)
- Hilfestellung wie man per udev die resolution und conv_time dauerhaft schreibbar macht
- Vollständige(?) englische Inline Dokumentation
- Unterstützung von Robue DS18B20 clones and DHT11/22 (ungetestet)
- und eben vollständig neu geschrieben, womit ich hoffe auch Bugs und Unschönheiten des alten Moduls behoben zu haben
Die Unterschiede zum Modul in contrib zähle ich jetzt nicht auf - in der Summe konnte es nur blockierend messen und kannte nur Temperatursensoren.
Warum heisst das Modul "RPI_1Wire" und nicht "GPIO4"?- So lässt es sich parallel zu GPIO4 installieren (nicht jeder hat eine Testumgebung) - der Parallelbetrieb sollte problemlos möglich sein (ich kann aber nicht ausschliessen, dass gelegentliche "Kollisionen" bei Messungen mal zu falschen Werten führen)
- Es gibt laut FHEM Statistik 488 Installationen mit 1607 Instanzen des alten GPIO4 Moduls (und nicht jeder hat global->sendStatistics aktiviert). Nur was für Versionen sind das? Contrib? Forum Variante 1-x? Selbst gebastelt? Wenn ich ein GPIO4 über Update zur Verfügung stelle, dann werden alle diese Versionen mit ungeahnten Folgen überschrieben.
- Mein Modul ist zwar weitgehend kompatibel zu GPIO4 - aber eben nicht 100%
- Fügt sich in der Modulübersicht schön zu RPI_GPIO ein
Kurze Info zum mode=timer Feature:Auf der Suche nach Optionen die Sensorabfrage möglichst resourcenschonend aber eben nicht blockierend zu gestalten, bin ich auf einen kleinen "hack" gekommen.
Indem man die conv_time der Temperatursensoren auf 2ms stellt (1 geht nicht, da setzt er aus unerfindlichen Gründen auf 576ms), erreicht man dass das Auslesen der Temperatur sofort zurückkehrt.
Jetzt ist natürlich noch keine Messung erfolgt, aber es wurde trotzdem eine getriggert. Daher wird im "timer" mode ein interner timer auf 1.5s gesetzt und der Wert erst dann final ausgelesen und schon hat man eine Methode den Sensor ganz ohne fork() performant auszulesen.
Eine weitere Method ist über den w1_bus_master regelmäßig ein "therm_bulk_read" abzustossen. Wenn die einzelnen Sensoren ein kürzeres polling Intervall haben, dann kann man diese auf "blocking" lassen und bekommt immer sofort einen halbwegs aktuellen Wert. Leider musste ich feststellen, das die Kernel-Implementierung einen kleinen Bug hat: Sobald weitere Geräte (außer Temperatursensoren) angeschlossen sind, funktioniert es nicht mehr (jeder Sensorabfrage dauert nach wie vor wie die conv_time). Wer nur Temperatursensoren hat, kann das Feature jedoch getrost einsetzen.
Zur Verwendung von DHT11/DHT22 Sensoren habe ich ein einfaches Perl Modul (mit C-Code Teil) geschrieben, welches entweder unter
https://github.com/bublath/rpi-dht ausgecheckt und installiert werden oder für Raspberry unter Buster hänge ich ein kleines Debian Paket an, welches mit "sudo apt install ./name.deb" installiert werden kann (danach FHEM neu starten)
Update 25.10.21: therm_bulk_read hinzugefügt. Dokumenation erweitert. Kleine (eher unerhebliche) Bugfixes.
Update 27.10.21: Veröffentlichung über Update (bzw. svn) daher das Perl Modul hier entfernt.
Gruß,
Jörg