[Modul] OWFS (OneWireFileServer)

Hallo Leute,

weil ich es selbst brauchte habe ich ein Modul zum Zugriff auf den OWFS (OneWireFileServer) erstellt. Aktuell handelt es sich um einen Splitter, einen Konfigurator und die Instanzen für den DS18B20 und den DS18S20. Weitere können sicherlich auch erstellt werden.

Es wird dringend dazu geraten den Konfigurator zur Erstellung der Instanzen zu nutzen, nur so ist sichergestellt dass das Format des Device-ID korrekt erstellt wird.

Bei mir läuft es jetzt, Fehler sind aber definitiv nicht ausgeschlossen.:wink:

Das Modul ist hierzu finden:

In meinem IPS2GPIO-Modul gibt es eine Instanz mit dem Namen IPS2GPIO_1Wire. Diese funktionierte nicht mehr da sich die Datei-Struktur des OWFS geändert hatte. Es wird demnächst vom Netz genommen.

Joachim

…noch ein paar Tipps zum OWFS:
Mit

sudo nano /etc/owfs.conf

ruft man die Konfiguration des OWFS auf dem Raspberry Pi auf.
Ich verwende im aktuellen Projekt den blauen USB-!-Wire-Adapter, deswegen habe ich

server: usb = all

einkommentiert. Wenn man

server: FAKE = DS18S20,DS2405

auskommentiert verschwinden die zwei Fake-1-Wire-Devices.

Ansonsten ist nichts was man für zeitkritische Anwendung nutzen sollte, aber da ist 1-Wire sicherlich auch nicht gedacht…:wink:

Joachim

Moin Joachim,

hast Du denn eventuell geplant auch den 2408 zu implementieren - oder könntest mir eventuell einen Tipp geben wie ich dies am besten tun kann?

Mir würde völlig reichen, dass PIO.BYTE oder PIO.ALL setzen zu können (siehe Anlage).

Ciao
HerbertF

Hallo Herbert,

ist aktuell nicht geplant weil der ja nach meinem Kenntnisstand (leider) seit langem abgekündigt ist.

Ich schaue mir das mal gerne an, kann aber aktuell nichts über eine Umsetzung sagen.

Joachim

Hallo, ist es geplant die OWFS-Module noch zu erweitern?
Ich hätte Bedarf an DS2450 und DS2438.

Alexander

Hallo zusammen, ich habe heute versucht, das Modul bei mir zum Laufen zu bringen und scheitere leider noch dabei. Das Einbinden des Moduls war noch kein Problem und den Splitter habe ich auch eingerichtet. Wenn ich jetzt versuche, die Konfigurator Instanz zu starten, werden auch alle Devices auf meinem Bus erkannt (ich hab’ das Debug Logging etwas erweitert und sehe jetzt jede Abfrage auf die einzelnen 1W Geräte), aber nach Abschluss des Busscans (Funktion DeviceList() in IPS2OWFS_Splitter/module.php wird noch erfolgreich ausgeführt) bekomme ich folgende Fehlermeldung:

Konnte Konfigurationsform von neuer Instanz nicht bestimmen
Warning: 
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 130
Warning: Trying to access array offset on value of type null in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Splitter/module.php on line 131
RESULT:a:10:{s:15:"2D.4874C0120000";a:2:{s:7:"Address";s:16:"2D4874C01200004D";s:4:"Type";s:6:"DS2431";}s:15:"2D.6731C0120000";a:2:{s:7:"Address";s:16:"2D6731C0120000E4";s:4:"Type";s:6:"DS2431";}s:15:"2D.F177C0120000";a:2:{s:7:"Address";s:16:"2DF177C012000092";s:4:"Type";s:6:"DS2431";}s:15:"28.C739FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.7B16FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.CBB1FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.5314FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.8E22FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.06DCFD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.F23AFD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}} in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Configurator/module.php on line 101
Warning: Undefined variable $Devices in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Configurator/module.php on line 120
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Configurator/module.php:49
Stack trace:
#0 /-(3): IPS2OWFS_Configurator->GetConfigurationForm()
#1 {main}
  thrown in /var/lib/symcon/modules/IPS2OWFS/IPS2OWFS_Configurator/module.php on line 49 (Code: -32603)

Ich habe jetzt wieder etwas im Code gestöbert und festgestellt, dass im Modul IPS2OWFS_Configurator/module.php in der Funktion GetData() in Zeile 102 die Funktion $this->SendDataToParent(…) FALSE zurückliefert, wo eigentlich der JSON String zurück kommen müsste. Und das führt dann weiter dazu, dass in Z. 47 die Variable $DeviceArray nicht gefüllt wird und damit geht dann natürlich auch ein count darauf auf die Bretter… Aber leider verstehe ich die internen Mechanismen der Modulprogrammierung nicht genug, um sagen zu können, warum SendDataToParent() schief läuft. Hat jemand von euch vielleicht eine Idee, wo man suchen könnte…?
VG Malte

Hallo Malte,

ich vermute das das Modul mit dem FamilyCode 2D (= DS2431/DS1972) nicht umgehen kann…

Ich schaue mir das mal an.

Joachim

Nachtrag: Welche 1-Wire-Devices verwendest Du noch in Deinem Netzwerk?

Hallo Malte,

ich habe Dir mal den DS2431 als Instanz hinzugefügt - aber noch ohne inhaltliche Funktion…

Wenn das fehlerfrei funktioniert müsstest Du mal bitte im Debug der DS2431-Instanz schauen was der an Daten sendet.
So wie ich es verstehe ist relevant ob der DS2431 „online“ ist oder „offline“?

Joachim

Hallo Joachim,
vielen Dank für deine schnelle Reaktion und deine Unterstützung!
Vielleicht noch kurz zum Hintergrund, ich möchte einen PBM-01 von ElabNET an IPS anbinden. Da der Controller über OWFS angesprochen werden kann, wollte ich es einmal mit deinem Modul probieren. Ich nutze die Version 7.0 von IPS in einer Docker-Umgebung. Da der Zugriff auf OWFS aber über owhttp läuft, ist das kein Nachteil.
Am PBM-01 sind derzeit 7 DS18B20 angeschlossen, die beiden DS2431 sind im PBM-01 eingebaut. Perspektivisch sollen neben den Temperatursensoren auch noch weitere Bausteine eingebunden werden, z.B. ein DS2438. Aber das ist noch Zukunftsmusik…

Ich habe jetzt einmal deine Änderungen bei mir eingespielt und erneut versucht die Geräte zu konfigurieren. Die Fehlermeldung ist aber die gleiche geblieben. Deshalb habe ich noch diese zusätzlichen Debug-Ausgaben eingebaut:
In IPS2OWFS_Configurator/module.php Z. 45ff:

If (($this->HasActiveParent() == true) AND (IPS_GetKernelRunlevel() == KR_READY)) {
	**IPS_LogMessage("OWFS", "GetData in GetConfigurationForm(): >".var_dump($this->GetData())."<");**
	$DeviceArray = unserialize($this->GetData());

In IPS2OWFS_Configurator/module.php Z. 105ff:

$Result = $this->SendDataToParent(json_encode(Array("DataID"=> "{F1CAC7F7-BA28-F711-7E0E-481F338200A4}",
                                "Function" => "DeviceList" )));
//$this->SendDebug("GetData", $Result, 0);
IPS_LogMessage("OWFS", "GetData in GetData(): >".$Result."<");

Mit diesen beiden Änderungen sehe ich beim Ausführen des Configurators folgende Meldungen im Syslog:

03.03.2024 11:29:01 | 00000 | CUSTOM  | OWFS                 | GetData in GetData(): ><
03.03.2024 11:29:01 | 00000 | CUSTOM  | OWFS                 | GetData in GetConfigurationForm(): ><
03.03.2024 11:29:03 | 00000 | CUSTOM  | OWFS                 | GetData in GetData(): ><

Im Debug-Log des Splitters sind diese Meldungen:

03.03.2024, 11:29:01 |           DeviceList | a:10:{s:15:"2D.4874C0120000";a:2:{s:7:"Address";s:16:"2D4874C01200004D";s:4:"Type";s:6:"DS2431";}s:15:"2D.6731C0120000";a:2:{s:7:"Address";s:16:"2D6731C0120000E4";s:4:"Type";s:6:"DS2431";}s:15:"2D.F177C0120000";a:2:{s:7:"Address";s:16:"2DF177C012000092";s:4:"Type";s:6:"DS2431";}s:15:"28.C739FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.7B16FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.CBB1FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.5314FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.8E22FD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.06DCFD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}s:15:"28.F23AFD0C0000";a:2:{s:7:"Address";N;s:4:"Type";N;}}
03.03.2024, 11:29:01 |        Netzanbindung | Angegebene IP 192.168.11.99 reagiert
03.03.2024, 11:29:03 |           DeviceList | a:0:{}

Das heißt aber für mich jetzt, dass die Methode $this->SendDataToParent() in IPS2OWFS_Configurator/module.php Z106 nichts zurückliefert. Wenn ich das richtig verstehe, dann müsste hier eigentlich der serialisierte JSON-String der Devices zurück kommen. Im Debug Log des Splitters sieht man ja auch, dass der korrekt aufgebaut wird. Aber offenbar wird der nicht weitergegeben. Kann das eventuell mit der Version 7 von IPS zusammenhängen, dass sich hier was bei der Übergabe geändert hat?

VG Malte

P.S. Wenn ich irgendwo noch weitere Debug-Ausgaben einbauen soll, dann immer her damit :slight_smile:

Hallo Malte,

im Array fällt mir auf, dass nach den DS2431 die Felder für „Address“ und „Type“ leer bleiben, ich gehe derzeit davon aus, dass es dadurch zu dem Fehler kommt.
Kannst Du mal m Browser versuchen einen direkten Aufruf zu machen um zu sehen was da an Daten ankommt?

Joachim

Zumindest über den Browser sind die Daten gefüllt:

{
"address":"2D4874C01200004D",
"alias":"",
"crc8":"4D",
"family":"2D",
"id":"4874C0120000",
"locator":"FFFFFFFFFFFFFFFF",
"memory":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"pages":[],
"r_address":"4D000012C074482D",
"r_id":"000012C07448",
"r_locator":"FFFFFFFFFFFFFFFF",
"type":"DS2431"
}
{
"address":"2D6731C0120000E4",
"alias":"",
"crc8":"E4",
"family":"2D",
"id":"6731C0120000",
"locator":"FFFFFFFFFFFFFFFF",
"memory":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"pages":[],
"r_address":"E4000012C031672D",
"r_id":"000012C03167",
"r_locator":"FFFFFFFFFFFFFFFF",
"type":"DS2431"
}
{
"address":"2DF177C012000092",
"alias":"",
"crc8":"92",
"family":"2D",
"id":"F177C0120000",
"locator":"FFFFFFFFFFFFFFFF",
"memory":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"pages":[],
"r_address":"92000012C077F12D",
"r_id":"000012C077F1",
"r_locator":"FFFFFFFFFFFFFFFF",
"type":"DS2431"
}

Ich kann morgen das mal im Code debuggen…

Hallo Malte,

die DS2431 sind im Array oben ja auch mit den Detaildaten enthalten - aber eben nicht die DS18B20. Aus mir (noch) unbekannten Gründen liefern die - nach Deinen Daten - keine Detaildaten zurück. Das verursacht im weiteren dann das Problem…

Joachim

So, Rätsel gelöst :slight_smile: In IPS2OWFS_Splitter/module.php ist in Zeile 117 der Timeout für die Anwort des Webservers auf 2 Sekunden eingestellt, was in meinem Fall zu kurz ist. Deshalb hat curl ein false zurückgeliefert. Hab’ den Timeout jetzt auf 10 Sekunden gesetzt und schwupps sind auch die Sensoren da… Kannst du das bei dir im Git noch anpassen? Vielen Dank erst einmal bis hier!!

Malte

Hallo Malte,

ich habe es jetzt im Splitter einstellbar gemacht (selbst noch nicht getestet).

Die DS2431-Instanz selbst hat noch keine wirkliche Funktion, dass muss jetzt noch gemacht werden. Irgendwie müsste das ja doch eine Statusvariable „Erreichbar“ geben die dann „true“ oder „false“ ist?

Welche 1-Wire-Devices hast Du darüber hinaus vorgesehen?

Joachim

Hallo Joachim,
ich habe jetzt dein Modul aktualisiert und die Erweiterung des Splitters um den Timeout funktioniert!
Die DS2431-Instanzen brauchen meiner Meinung nach erst einmal keine weitere Logik. Das sind EEPROM Speicher, die über 1Wire ausgelesen werden können. Ich werde mal bei ElabNET nachfragen, wofür die genutzt werden.
In Zukunft will ich einen Teil meines 1W Netzwerks komplett auf den PBM-01 umstellen. Dann kommen noch folgende Bausteine hinzu:

  • DS2450
  • DS2408
  • DS2438

Ich habe zwar bis jetzt nur ganz grob verstanden, wie man neue Bausteine hinzufügt, aber da wird es sicherlich auch Doku zu geben, die ich noch nicht kenne :wink:

Malte

Hallo Herbert, Alexander und Malte,

ich habe jetzt doch die Vorbereitung getroffen den DS 2450, DS2408 und den DS2438 zu integrieren. Das ist aber noch nicht vollständig weil ich:

  • nicht sehen kann welche Daten der OWFS bei den einzelnen Devices sendet. Dazu benötige ich die Daten direkt aus dem Browseraufruf des jeweiligen Device.
  • Beim DS2408 können ja nicht nur Zustände abgerufen werden, sondern auch gesetzt. Da brauche ich mal ein bißchen Unterstützung wie das funktioniert…

Joachim

Hallo Joachim,
der DS2438 ist bei mir in einem Multisensor von ElabNET verbaut (Artikelnummer 431). In dem Multisensor ist neben dem DS2438 noch ein DS18B20 verbaut, der von deinem Skript auch schon korrekt erkannt und eingebunden wird. Der DS2438 gibt im Browser die folgenden Werte aus:

{
"B1-R1-A":[],
"CA":"false",
"EE":"false",
"HIH3600":[],
"HIH4000":[],
"HIH5030":[],
"HTM1735":[],
"IAD":"false",
"MultiSensor":[],
"S3-R1-A":[],
"VAD":"1.95",
"VDD":"4.99",
"address":"2655BF8701000070",
"alias":"",
"crc8":"70",
"date":"Sun Jan  4 02:30:36 1970",
"disconnect":[],
"endcharge":[],
"family":"26",
"humidity":"37.0364",
"id":"55BF87010000",
"latesttemp":"23.5938",
"locator":"FFFFFFFFFFFFFFFF",
"offset":"1",
"pages":[],
"r_address":"7000000187BF5526",
"r_id":"00000187BF55",
"r_locator":"FFFFFFFFFFFFFFFF",
"temperature":"23.5938",
"type":"DS2438",
"udate":"264644",
"vis":"0"
}

Ich würde vermuten, dass die drei Werte „VAD“, „VDD“ und „temperature“ bei allen DS2438 vorhanden sind. Als „Spezialität“ gibt es bei diesem Multisensor offenbar noch direkt den Wert „humidity“ für die Luftfeuchtigkeit. Die könnte man sich aber auch selber mit einem Aktionsskript aus den ersten drei Werten berechnen, die Formel dafür wird beim Sensor mitgeliefert.
Der DS2438 hat jetzt neben VAD auch noch einen A/D Wandler für einen Stromeingang. Ich vermute mal, dass das dann IAD ist, der in meinem Multisensor aber nicht genutzt wird und deshalb wohl „false“ zurück gibt.

Malte

Hallo Malte,

ich habe die Daten nun im DS2438 entsprechend erweitert (kann das selbst nicht prüfen!).
Konkret:

  • Temperatur
  • VAD
  • VDD
  • Humidity (falls vorhanden)

Probiere das mal aus und melde Dich dann… :wink:

Joachim

Hallo Joachim, ich konnte dieses WE nur kurz testen. Der DS2438 taucht im Configurator auf, allerdings bleibt die Spalte „InstanzID“ leer und ich kann keine Instanz erstellen (Erstellen-Button ausgegraut). Normalerweise würde ich in der Spalte ein „Kein(e)“ erwarten. Interessanterweise gibt es auch eine Spalte mit einem Gerät vom Typ „DS2433“, für das du noch gar keine Unterstützung eingebaut hast. Das lässt mich vermuten, dass du die Erkennung so angepasst hast, dass unbekannte Bausteine zwar in der Liste auftauchen, aber nicht erstellbar sind. Somit sieht es so aus, als wenn auch der DS2438 nicht richtig verarbeitet wird. Ich werde im Laufe der kommenden Woche mal weiter in den Code schauen.

Malte

Hallo Malte,

Du solltest jetzt für diverse andere Devices auch eine Instanz im Konfigurator erstellen können - auch wenn diese noch keine vollständige Funktion haben…

Joachim