1-Wire Adapter DS9490R an Raspberry Pi

Hallo Leute,

testweise wollte ich mal einen DS9490R 1-Wire-USB-Adapter am Raspberry Pi anschließen.
Was muss ich dabei beachten? Welche Schritte zur Installation müssen gemacht werden?

Joachim

Moin,

läuft leider nicht. Für den Adapter brauchst Du eine TMEX Instanz, welche nur unter Windows verfügbar ist.

Gruß,
Christoph

Hallo Christoph,

vielen Dank für die Antwort.

Der USB-Adapter wird ja offensichtlich nicht grundsätzlich vom Raspbian bzw. vom Raspberry Pi „abgelehnt“. Zumindest für das Einlesen von Werten könnten man sich ja eine Konstruktion von IPS und dem OWFS vorstellen.

@Paresy: Eine direkte Unterstützung des Adapters am Raspberry Pi mit IPS ist dann wohl nicht mehr geplant?

Joachim

Brauchst keine Treiber mit OWFS. Einfach ran damit und Sensoren dran.
Musst die Werte dann anders in IPS holen.
Gruss,
Peter

…kleine Frage am Rande:
Ich bekomme beim Start des OWFS folgende Fehlermeldung:

root@raspberrypi-1W:~# /etc/init.d/owfs start
-bash: /etc/init.d/owfs: Keine Berechtigung

Der OW-http-Server läuft und ich kann über den Browser auf die 1-Wire-Sensoren zugreifen, nur sehe ich nicht wo die Daten geschrieben werden…

Joachim

Der Start erfolgt eigentlich mit owserver, nicht owfs („service owserver start“ bzw „/etc/init.d/owserver start“), wenn man die Scripte des Packages verwendet.

OWFS hat seinen eigenen Namensraum (Userspace). Er schreibt dazu nicht wirklich auf die Platte.

Zum Einlesen in IPS hatte ich schon mal was geschrieben.

Tommi

Ich denke,

wenn IPS und 1wire auf dem Pi laufen, kann man direkt die Temp per Skript einlesen.
Für Pi: 1-wire Temperatursensor DS1820 am Raspberry Pi (GPIO-direkt)
Für BananaPi: Banana Pi: 1-wire Temperatursensor DS1820 ansteuern | Einplatinencomputer

beides habe ich noch nicht versucht, bin aber der Meinung, es losste gehen.

Beispiel für die Banane :

SetValue(38804 /*[Banane\Temperatur]*/,(exec("cat /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input"))/1000);
SetValue(23887 /*[Banane\Clock Arm]*/,(int)((exec("cat /sys/devices/system/cpu/cpu0//cpufreq/scaling_cur_freq")) / 1000));

Beispiel für den Raspberry:

SetValue(38804 /*[PI\Temperatur]*/ ,(exec("cat /sys/class/thermal/thermal_zone0/temp "))/1000);
SetValue(23887 /*[PI\Takt]*/ ,(int)((exec("cat  /sys/devices/system/cpu/cpu0//cpufreq/scaling_cur_freq")) / 1000));

(OdroidC1 muss ich noch ran…)

um die CPU Temperatur und die aktuelle CPU Freq in IPS VAR’s zu schreiben.
Das müsste dann nur an 1wire angepasst werden, und ich habe alles auf den Zwergen.

Da ich meinen 1wire Bus am LCN Modul (Eigenbau I-Port Modul) hängen habe, und so die Daten direkt im LCN nutze, habe ich dieses noch nicht versucht.

Hallo Tommi und tomgr,

Vielen Dank für die Antworten. Nach langer Nacharbeit werden jetzt die Daten korrekt in dem dafür vorgesehenen Verzeichnis abgelegt und ich kann die Werte ins IPS holen.
Komischerweise funktioniert zwar der OWHttp-Server zeigt aber die Werte nicht mehr an, hängt wohl mit den zwei verschiedenen Installationsversuchen zusammen und ist auch nicht wirklich schlimm…

Kann ich den Intervall des Einlesens irgendwo individuell für die einzelnen Geräte auf dem Bus einstellen?

Zwei Verwendungsmöglichkeiten dieser Konstellation schweben mir vor:

  1. Einrichtung einer neuen 1-Wire-Insel über LAN
  2. Einbindung eines vorhandenen 1-Wire-Netzes ins LAN

Mit ein bisschen Programmieren bekommt man sicher auch ein Skript gezaubert, dass die Anforderungen zur Einrichtung auf ein Minimum reduziert, eine der Voraussetzungen ist aber, das einige Sensoren sehr schnell Daten liefern müssten, also nicht einmal pro Minuten, sondern im Sekundenbereich (so wie es jetzt eben auch eingerichtet ist - also technisch machbar).

Joachim

Hallo Leute,

Die Kombination Raspberry Pi, DS9490R, OWserver und dem IPS läuft derzeit sehr stabil.

Mir ist bei dem OWServer aber noch einiges unklar:

  • Welcher Polling-Interval ist „von Haus“ eingestellt und wo kann ich das sehen?
  • Kann ich den Polling-Intervall in Gänze oder für einzelne Device ändern?

Wenn es möglich ist, wäre ich für ein Beispiel oder Link dankbar - habe mir schon im Internet den Wolf gesucht…

Joachim

Hallo,

kann ich mit der Kombi (RPi, DS9490R, OWserver & IPS) auch Feuchtigkeit auslesen?
Habe den HIH4030 mit DS2438 und DS18B20 für Temperatur.

Gruß

Hallo Sewo,

ich kann berichten, dass ich bis jetzt sehr begeistert bin, wie schnell und zuverlässig diese Kombination derzeit läuft.:loveips:

Im Testaufbau habe ich 1xDS1820, 2xDS2413 und 1xDS2438, die Änderungen (insbesondere für die DS2413 wichtig) werden im Sekundenbereich erkannt (Optimierung im Code ist m.E. noch möglich, derzeit bei 2-3sek) und es läuft jetzt seit Tagen stabil.
Für den DS1820 und den DS2438 (in meinem Testfall auch Luftfeuchtigkeitsmessung) habe ich den Einleseintervall auf 1 Minute gestellt.
Die Prozessorauslastung ist durchschnittlich sehr gering und liegt rund um 10%, selten sind mal Ausreisser zu sehen die dann auch mal bei 60% liegen.

Wenn es keine absolut zeitkritischen Anwendungen sind - und dafür ist 1-Wire in der Regel sowieso nicht das richtige System - dann ist dieser Prüfaufbau mit einigen noch zu tätigen Optimierungen im Code durchaus eine günstige und zuverlässige Alternative um das 1-Wire-Netzwerk an das LAN zu bringen…

Joachim

Hallo JPaeper,

viellen Dank für deine Antwort :slight_smile: dann werde ich mal die Kombi weiter verfolgen :smiley:
Ich suche eine Lösung 9 x Temperatur und Feuchte Sensoren ins IPS zu bringen. Mehr muss das Teil nicht machen.
Klar gibt es bessere lösungen. Aber Raspi und DS9490R habe ich da.
Einleseintervall jede sekunde brauche ich nicht. mit 60sek kann ich leben:D
Ist die Installation und Code Optimierungen sehr schwer?

Gruß

Hallo Sewo,

ich habe ein „frisches“ Raspbian installiert, dann IPS und den OWServer drauf installiert. Zu letzterem gibt es verschiedene Anleitungen im Netz.

Ist das erfolgreich, dann werden die Messwerte auf dem Raspberry Pi unter /mnt/1wire/Seriennummer abgelegt, diese Dateien werden zyklisch eingelesen. Ich habe mir ein Skript geschrieben, die das Verzeichnis /mnt/1wire einlesen und die notwendigen Kategorien und Variablen anlegen und befüllen, dieses Skript braucht dann aber eigentlich nur einmalig gestartet werden oder wenn neue Sensoren oder Aktoren auf dem 1-Wire-Bus sind.

Ansonsten werden dann vomn einem anderen Skript die Werte von einigen Sensoren im Minutentakt (Temperatur, Luftfeuchtigkeit) neu eingelesen, einige auch im (derzeit) 4-Sekunden-Takt (Switch, ggf. auch Zähler).

Die letzte noch zu programmierende Aktivität ist dann bei Werte-Änderung die Daten ins „Haupt-IPS“ zu „pushen“ bzw. Schaltbefehle aus dem „Haupt-IPS“ über den Raspberry Pi in das abgesetzte 1-Wire-System zu übertragen.

Da ich mir lieber einmal mehr Arbeit mache als später tausende kleine Änderungen hänge ich noch in der Optimierung und Vereinfachung des Code, bei Interesse kann ich Dir aber gerne mal das zukommen lassen, was ich bis jetzt habe…

Joachim

Hallo JPaeper,

wenn ich Richtig verstehe ist auf Raspi IPS drauf und er sendet die Daten auf ein anderen IPS Server?

Die Code würde ich gerne mal Testen :wink:

Gruß

…ja, korrekt.

IPS einrichten laut Anleitung, OWserver drauf und mit einem bißchen Glück geht das relativ schnell…

(Ich bin ganz sicher kein Linux-Experte und musste mich da auch in vieles einlesen…)

Code - zumindest so weit wie ich schon bin - stelle ich heute abend mal rein.

Joachim

Hallo Sewo,

da ich die Schnittstelle zum Haupt-IPS noch nicht fertig habe, wäre es vielleicht ganz gut wenn Du mir ein Signal gibst, wenn Dein Raspberry Pi soweit eingerichtet ist - das gibt mir noch ein wenig Zeit…:wink:

Damit Du einen Eindruck hast hier mal das Skript zum Anlegen der vom OWserver im Standardverzeichnis (/mnt/1wire) abgelegten 1-Wire-Bausteine (wird quasi eigentlich nur einmal ausgeführt, oder immer dann wenn neue Sensoren dazu gekommen sind):

<?
if ($handle = opendir('/mnt/1wire'))
	{
	// Verzeichnis durchlaufen
   while (false !== ($file = readdir($handle)))
	 	{
		If ((strlen($file) == 15) and (substr($file, 2, 1) == "."))
			{
			//  Basiskategorie anlegen
			$CatID = CreateCategoryByName(0, "1-Wire");

		  	If (substr($file, 0, 2) == "10")
		  	   {
            $uCatID = CreateCategoryByName($CatID, "DS18S20 - ".$file);
				$varid = CreateVariableByName($uCatID, "address", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/address"));
				$varid = CreateVariableByName($uCatID, "type", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/type"));
				$varid = CreateVariableByName($uCatID, "temperature", 2, "~Temperature");
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/temperature"));
				$varid = CreateVariableByName($uCatID, "alias", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/alias"));
		  	   }
			elseif (substr($file, 0, 2) == "81")
		  	   {
            $uCatID = CreateCategoryByName($CatID, "DS1420 - ".$file);
            $varid = CreateVariableByName($uCatID, "address", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/address"));
				$varid = CreateVariableByName($uCatID, "type", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/type"));
				$varid = CreateVariableByName($uCatID, "alias", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/alias"));
		  	   }
         elseif (substr($file, 0, 2) == "3A")
		  	   {
            $uCatID = CreateCategoryByName($CatID, "DS2413 - ".$file);
            $varid = CreateVariableByName($uCatID, "address", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/address"));
				$varid = CreateVariableByName($uCatID, "type", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/type"));
				$varid = CreateVariableByName($uCatID, "alias", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/alias"));
				$varid = CreateVariableByName($uCatID, "PIO.A", 0);
				SetValueBoolean($varid, IdentTrueFalse(exec("cat /mnt/1wire/uncached/$file/PIO.A")));
            $varid = CreateVariableByName($varid, "use_PIO.A", 0);
				$varid = CreateVariableByName($uCatID, "PIO.B", 0);
				SetValueBoolean($varid, IdentTrueFalse(exec("cat /mnt/1wire/uncached/$file/PIO.B")));
            $varid = CreateVariableByName($varid, "use_PIO.B", 0);
				$varid = CreateVariableByName($uCatID, "sensed.A", 0);
				SetValueBoolean($varid, IdentTrueFalse(exec("cat /mnt/1wire/uncached/$file/sensed.A")));
            $varid = CreateVariableByName($varid, "use_sensed.A", 0);
				$varid = CreateVariableByName($uCatID, "sensed.B", 0);
				SetValueBoolean($varid, IdentTrueFalse(exec("cat /mnt/1wire/uncached/$file/sensed.B")));
            $varid = CreateVariableByName($varid, "use_sensed.B", 0);
				}
         elseif (substr($file, 0, 2) == "26")
		  	   {
            $uCatID = CreateCategoryByName($CatID, "DS2438 - ".$file);
            $varid = CreateVariableByName($uCatID, "address", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/address"));
				$varid = CreateVariableByName($uCatID, "type", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/type"));
				$varid = CreateVariableByName($uCatID, "temperature", 2, "~Temperature");
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/temperature"));
				$varid = CreateVariableByName($uCatID, "VAD", 2);
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/VAD"));
            $varid = CreateVariableByName($varid, "use_VAD", 0);
				$varid = CreateVariableByName($uCatID, "VDD", 2);
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/VDD"));
				$varid = CreateVariableByName($varid, "use_VDD", 0);
				$varid = CreateVariableByName($uCatID, "alias", 3);
				SetValueString($varid, exec("cat /mnt/1wire/$file/alias"));
		  	   }
		  	}
    	}
    closedir($handle);
	}
return;

function CreateVariableByName($fatid, $name, $type, $profile = "")
{
    $vid = @IPS_GetVariableIDByName($name, $fatid);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $fatid);
        IPS_SetName($vid, $name);
        
        if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}

function CreateCategoryByName($fatid, $name)
{
    $CatID = @IPS_GetCategoryIDByName($name, $fatid);
    if($CatID === false)
    {
        $CatID = IPS_CreateCategory(); // Kategorie anlegen
		  IPS_SetName($CatID, $name); // Kategorie benennen
		  IPS_SetParent($CatID, $fatid);
    }
    return $CatID;
}

function IdentTrueFalse($Value)
{
    if($Value == "0")
    	{
      $result = false;
    	}
    else
    	{
      $result = true;
    	}
    return $result;
}

?>

…und hier noch mal ein Skript zum Einlesen der „langsamen“ Sensoren (Trigger einmal pro Minute):

<?

if ($handle = opendir('/mnt/1wire'))
	{
	// Verzeichnis durchlaufen
   while (false !== ($file = readdir($handle)))
	 	{
		If ((strlen($file) == 15) and (substr($file, 2, 1) == "."))
			{
			
			$CatID = IPS_GetCategoryIDByName("1-Wire", 0);
			
		  	If (substr($file, 0, 2) == "10")
		  	   {
            $uCatID = IPS_GetCategoryIDByName("DS18S20 - ".$file, $CatID);
				$varid = IPS_GetVariableIDByName("temperature", $uCatID);
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/temperature"));
		  	   }
         elseif (substr($file, 0, 2) == "26")
		  	   {
            $uCatID = IPS_GetCategoryIDByName("DS2438 - ".$file, $CatID);
				$varid = IPS_GetVariableIDByName("temperature", $uCatID);
				SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/temperature"));
				$varid = IPS_GetVariableIDByName("VAD", $uCatID);
            If (GetValueBoolean(IPS_GetVariableIDByName("use_VAD", $varid)) == true)
				   {
					SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/VAD"));
					}
				$varid = IPS_GetVariableIDByName("VDD", $uCatID);
            If (GetValueBoolean(IPS_GetVariableIDByName("use_VDD", $varid)) == true)
				   {
					SetValueFloat($varid, (float)exec("cat /mnt/1wire/uncached/$file/VDD"));
					}
		  	   }
		  	}
    	}
    closedir($handle);
	}
return;
?>

(die Variablen mit „use_xxx“ müssen auf True gesetzt werden damit sie eingelesen werden!)

Mir schwebt irgendwie vor, mit dem Anlegen der Variablenstruktur im abgesetzten IPS auch gleich eine nahezu identische im IPS anzulegen und dann bei Aktualisierung diese via „Push“ auch im Haupt-IPS zu ändern - sicherlich nicht unmöglich, aber da hänge ich jetzt gerade noch ein bißchen…:wink:

Hier mal ein Beispielskript, wie man vom prinzip her den SChaltzustand eines DS2413 per Skript ändern kann:

FileWrite("/mnt/1wire/3A.9CA604000000/PIO.B", 0);


return;
function FileWrite($path, $value)
	{
	$file = fopen($path,"w");
	fwrite($file, $value);
	fclose($file);
	
	return;
	}

Bin jetzt mal gespannt wie die Installation bei Dir klappt und auf Deine Ideen…:slight_smile:

Joachim

Hallo JPaeper,

deine Code ist Super :smiley:
habe auf meine bedürfnisse angepasst (DS18B20 mit DS2438).
Ausgeführt und siehe da :slight_smile: Ich bekomme meine Daten.

Muss ich den Script immer Ausführen um die werte Aktualisieren?

Gruß

Hallo Sewo,

wie ich oben schon beschrieben habe:

  1. Das erste Skript ist zur Erstellung der Struktur, es muss zum Start einmal ausgeführt werden, damit diese angelegt wird, danach eigentlich nur, wenn sich im Netzwerk etwas ändert…
  2. Das zweite liest dann zyklisch die Daten ein, dazu die Boolean-Variablen die mit „use_“ beginnen auf True setzen! Dieses muss dann entsprechend getriggert werden, z.B. 1 mal pro Minute

Joachim

Hi,

da hatte ich was Falsch verstanden :frowning:
Jetzt Funktuniert alles :smiley:

Hast du schon erfahrung mit dem DS9490R mit mehereren Sensoren auf ca. 100m Kabel?

Habe im Moment ein Temp/Feuchte Sensor von eservice-online mit einem 4 poligem Kabel dran (habe noch kein anderen) und der Läuft?
d.h. auf der Klemme vom Sensor ist 1-Wire und GND belegt. 5V ist nicht belegt.
Das ist parasitären Betrieb oder? Da muss ich doch 5V mit GND verbinden?
Aber das läuft auch so:confused:

Brauche eigentlich Pill-up Widerstand?

Gruß

Hallo Sewo,

die Geräte vom eservice-online würde ich mal als 1-Wire-IPS-Kompatibel „vermuten“. Wie die Belegung ist kann ich Dir nicht sagen, weil ich diesen Sensor nicht besitze. Ein Parasitär-Betrieb würde ich bei diesem Gerät also ausschließen.

Bei einem 100-Meter Netzwerk gibt es sicherlich noch ein paar Dinge zu beachten, z.B. eine ausreichend stabile Netzspannung und ggf. Abschlußwiderstände - aber bitte nicht 5V auf GND legen: Das ist dann ein „klassischer Kurzer“!:smiley:

Joachim