Script zum Auflisten von 1-Wire Devices als txt oder HTML

Hallo,

da ich wissen wollte welche 1-Wire Bausteine bei mir im System verbaut sind und ich irgendwie eine Möglichkeit zur Erstellung einer Übersicht gesucht habe, habe ich 2 Scripte geschrieben.

Das erste Script erstellt eine Datei 1Wire.txt im IPS-Verzeichnis. Diese Datei lässt sich wunderbar mit Excel öffnen und weiterverarbeiten uvm. (siehe Bild)

<?
// Skript zum Auslesen der 1-Wire Bausteine in IpSymCon
// Ausgabe: Legt die Datei 1Wire.txt im IPSymcon-Hauptverzeichnis an und zeigt es in der Skriptausgabe
//             ObjektID, Type des 1-WireBaustein, Bausteinart, Seriennummer, Kategorie/Ort
//
// Datum:     20.07.2009
// läuft mit v2.0
// brdiver677
 
$guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";
$ids = IPS_GetInstancesByModuleID($guid);
$dir = IPS_GetKernelDir();
 
$datei = fopen($dir."1Wire.txt","w");

echo $dir."1Wire.txt erstellt.

";
echo "ObjID	Typ	Art					SN						Ort
";
echo "-----------------------------------------------------------------
";
fwrite($datei, "ObjektID	Typ	Art	SN	Ort
");
foreach($ids as $id)
 {
 $sn = TMEX_GetDevice($id);
 $arr1 = str_split($sn);
 $fam_code = $arr1[14].$arr1[15];

switch($fam_code) {
case '05': $b_id="2405";$b_bez="1-channel addressable switch";break;
case '10': $b_id="18S20";$b_bez="Temperaturfühler";break;
case '20': $b_id="2450";$b_bez="4-fach AD-Wandler";break;
case '26': $b_id="2438";$b_bez="Smart Battery Monitor";break;
case '28': $b_id="18B20";$b_bez="Temperaturfühler";break;
case '29': $b_id="2408";$b_bez="8-channel addressable switch";break;
case '1D': $b_id="2423";$b_bez="4k ram with counter";break;
case '2C': $b_id="2890";$b_bez="digital potentiomete";break;
case '3A': $b_id="2413";$b_bez="2-channel addressable switch";break;
default: $b_id="n/a";$b_bez="n/a";break;
}
echo $id."	".$b_id."	".$b_bez."	".$sn."	".IPS_GetLocation($id)."
";
fwrite($datei, $id."	".$b_id."	".$b_bez."	".$sn."	".IPS_GetLocation($id)."
");

 }
 
$timestamp = time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);
echo "
Stand: ".$datum," ",$uhrzeit," Uhr";
fwrite($datei,"Stand: ".$datum." ".$uhrzeit." Uhr
");

fclose($datei);

?>

Das zweite Script erstellt eine Datei 1Wire.html im IPS-Verzeichnis. Diese Datei lässt sich mit einem beliebigen Browser öffnen, ausdrucken uvm. (siehe Bild)

<?
// Skript zum Auslesen der 1-Wire Bausteine in IpSymCon
// Ausgabe: ObjektID, Type des 1-WireBaustein, Bausteinart, Seriennummer, Kategorie/Ort
//          Erstellt eine HTML-Datei im IPS-Verzeichnis
// Datum: 20.07.2009
// läuft mit v2.0
// brdiver677

 $guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";
 $ids = IPS_GetInstancesByModuleID($guid);
$dir = IPS_GetKernelDir();

$datei = fopen($dir."1Wire.html","w");

 fwrite ($datei,"<html> 
<body>
");
 fwrite ($datei, "<h1>1-Wire Devices</h1>

");
 fwrite ($datei, "<table border='1'>

");
 fwrite ($datei,"<thead>
<tr>
<th style='padding-left:5px'>ObjektID</th>
<th style='padding-left:5px'>Typ</th>
<th style='padding-left:5px'>Art</th>
<th style='padding-left:5px'>Seriennummer</th>
<th style='padding-left:5px'>Kategorie/Ort</th>
</tr>
</thead>

");
 
  fwrite ($datei,"<tbody>
");

 foreach($ids as $id)
 {
 $sn = TMEX_GetDevice($id);
 $arr1 = str_split($sn);
 $fam_code = $arr1[14].$arr1[15];

switch($fam_code) {
case '05': $b_id="2405";$b_bez="1-channel addressable switch";break;
case '10': $b_id="18S20";$b_bez="Temperaturfühler";break;
case '20': $b_id="2450";$b_bez="4-fach AD-Wandler";break;
case '26': $b_id="2438";$b_bez="Smart Battery Monitor";break;
case '28': $b_id="18B20";$b_bez="Temperaturfühler";break;
case '29': $b_id="2408";$b_bez="8-channel addressable switch";break;
case '1D': $b_id="2423";$b_bez="4k ram with counter";break;
case '2C': $b_id="2890";$b_bez="digital potentiomete";break;
case '3A': $b_id="2413";$b_bez="2-channel addressable switch";break;
default: $b_id="n/a";$b_bez="n/a";break;

}
fwrite($datei,"<tr>
");
fwrite($datei,"<td style='padding-left:7px'>".$id."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$b_id."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$b_bez."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$sn."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".IPS_GetLocation($id)."</td>
");
fwrite($datei,"</tr>
");

 }

fwrite ($datei,"</tbody>

");
fwrite ($datei,"</table>

<br>");

$timestamp = time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);

fwrite($datei,"Stand: ".$datum." ".$uhrzeit." Uhr
");

 fwrite ($datei, "</html>
</body>");
fclose($datei);

?>

Ich möchte nur noch darauf hinweisen, dass ich die Grundidee aus einem älteren Thread übernommen habe und eine Möglichkeit der Weiterverarbeitung bzw. Drucken schaffen wollte. Diese Grundidee bzw. Basis für mein Script stammt von paresy.

Das Auslesen des Family Codes habe ich dazu genutzt die Art und Typ des Bausteins in der Liste zu integrieren.

Viele Grüße
Björn

Hallo Björn,

das macht die WIIPS zwar in ähnlicher Form, aber Deine Variante ist etwas ausführlicher. Danke! Habs mal in die Script Library aufgenommen.:slight_smile:

Ich wollte mal kurz eine 1Wire Liste drucken und habe obiges Script probiert.
Der erste Fehler bei IPS V2.3 ist der >IPS_GetInstanceListByModuleID< Befehl. Aber die Zeile

$fam_code = $arr1[14].$arr1[15];

führt mehrmals zum Fehler
Undefinined offset:14 in C:…\ on line 25 (txt bzw 27 bei html ) und
Undefinined offset:15 in C:…\ on line 25 (bzw 27)

könnte das mal jemand anpassen an die aktuelle IPS Version?

Hi,

ich habe gerade beide Skripte ausprobiert.
Sie laufen ohne Probleme und erstellen die Dateien.

Ich habe sie von der Konsole aus gestartet.
Die Dateien liegen dann im IPS->Verzeichnis.

1Wire.html und 1Wire.txt

Wie hast du denn die Skripte gestartet ?

Gruss
Björn
:slight_smile:

Geht bei mir nur wenn ich

$ids = IPS_GetInstancesByModuleID($guid);

in

$ids = IPS_GetInstanceByModuleID($guid);

ändere

hmmm aber auch damit bekomme ich das Script nicht zum laufen:



Fatal error:  Call to undefined function IPS_GetInstanceByModuleID() in [.sonstiges\1-Wire-get_Devices] on line 11

anbei die beiden Skripte nochmal komplett zur Kontrolle:

  1. 1-Wire Bausteine Auslesen und in TXT-ablegen:
<?
// Skcript zum Auslesen der 1-Wire Bausteine in IpSymCon
// Ausgabe: Legt die Datei 1Wire.txt im IPSymcon-Hauptverzeichnis an und zeigt es in der Skriptausgabe
//             ObjektID, Type des 1-WireBaustein, Bausteinart, Seriennummer, Kategorie/Ort
//
// Datum:     11.10.2010
// läuft mit v2.3
// brdiver677
 
$guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";
$ids = IPS_GetInstanceListByModuleID($guid);
$dir = IPS_GetKernelDir();
 
$datei = fopen($dir."1Wire.txt","w");

echo $dir."1Wire.txt erstellt.

";
echo "ObjID	Typ	Art					SN						Ort
";
echo "-----------------------------------------------------------------
";
fwrite($datei, "ObjektID	Typ	Art	SN	Ort
");
foreach($ids as $id)
 {
 $sn = TMEX_GetDevice($id);
 $arr1 = str_split($sn);
 $fam_code = $arr1[14].$arr1[15];

switch($fam_code) {
case '05': $b_id="2405";$b_bez="1-channel addressable switch";break;
case '10': $b_id="18S20";$b_bez="Temperaturfühler";break;
case '20': $b_id="2450";$b_bez="4-fach AD-Wandler";break;
case '26': $b_id="2438";$b_bez="Smart Battery Monitor";break;
case '28': $b_id="18B20";$b_bez="Temperaturfühler";break;
case '29': $b_id="2408";$b_bez="8-channel addressable switch";break;
case '1D': $b_id="2423";$b_bez="4k ram with counter";break;
case '2C': $b_id="2890";$b_bez="digital potentiomete";break;
case '3A': $b_id="2413";$b_bez="2-channel addressable switch";break;
default: $b_id="n/a";$b_bez="n/a";break;
}
echo $id."	".$b_id."	".$b_bez."	".$sn."	".IPS_GetLocation($id)."
";
fwrite($datei, $id."	".$b_id."	".$b_bez."	".$sn."	".IPS_GetLocation($id)."
");

 }
 
$timestamp = time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);
echo "
Stand: ".$datum," ",$uhrzeit," Uhr";
fwrite($datei,"Stand: ".$datum." ".$uhrzeit." Uhr
");

fclose($datei);

?>
  1. 1-Wire Bautsteine auslesen und in html-Datei ablegen
<?
// Skcript zum Auslesen der 1-Wire Bausteine in IpSymCon
// Ausgabe: ObjektID, Type des 1-WireBaustein, Bausteinart, Seriennummer, Kategorie/Ort
//          Erstellt eine HTML-Datei im IPS-Verzeichnis
// Datum: 11.10.2010
// läuft mit v2.3
// brdiver677

 $guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";
 $ids = IPS_GetInstanceListByModuleID($guid);
$dir = IPS_GetKernelDir();

$datei = fopen($dir."1Wire.html","w");

 fwrite ($datei,"<html> 
<body>
");
 fwrite ($datei, "<h1>1-Wire Devices</h1>

");
 fwrite ($datei, "<table border='1'>

");
 fwrite ($datei,"<thead>
<tr>
<th style='padding-left:5px'>ObjektID</th>
<th style='padding-left:5px'>Typ</th>
<th style='padding-left:5px'>Art</th>
<th style='padding-left:5px'>Seriennummer</th>
<th style='padding-left:5px'>Kategorie/Ort</th>
</tr>
</thead>

");
  
 foreach($ids as $id)
 {
 $sn = TMEX_GetDevice($id);
 $arr1 = str_split($sn);
 $fam_code = $arr1[14].$arr1[15];

switch($fam_code) {
case '05': $b_id="2405";$b_bez="1-channel addressable switch";break;
case '10': $b_id="18S20";$b_bez="Temperaturfühler";break;
case '20': $b_id="2450";$b_bez="4-fach AD-Wandler";break;
case '26': $b_id="2438";$b_bez="Smart Battery Monitor";break;
case '28': $b_id="18B20";$b_bez="Temperaturfühler";break;
case '29': $b_id="2408";$b_bez="8-channel addressable switch";break;
case '1D': $b_id="2423";$b_bez="4k ram with counter";break;
case '2C': $b_id="2890";$b_bez="digital potentiomete";break;
case '3A': $b_id="2413";$b_bez="2-channel addressable switch";break;
default: $b_id="n/a";$b_bez="n/a";break;

}
fwrite($datei,"<tr>
");
fwrite($datei,"<td style='padding-left:7px'>".$id."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$b_id."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$b_bez."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".$sn."</td>
");
fwrite($datei,"<td style='padding-left:7px'>".IPS_GetLocation($id)."</td>
");
fwrite($datei,"</tr>
");

 }

fwrite ($datei,"</tbody>

");
fwrite ($datei,"</table>

<br>");

$timestamp = time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);

fwrite($datei,"Stand: ".$datum." ".$uhrzeit." Uhr
");

 fwrite ($datei, "</html>
</body>");
fclose($datei);

?>

Diese beiden laufen bei mir ohne Probleme.

IPS_GetInstanceByModuleID() läuft ab der Version IP-Symcon >= 2.1.
Daher sollte es eigentlich kein Problem geben.

Was passiert denn, wenn du folgendes Skript startest:

<?
//1-Wire
$guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";

//Auflisten
print_r(IPS_GetInstanceListByModuleID($guid));

?>

Du solltest nun eine Auflistung der 1-Wire ObjektID`s erhalten.
Wenn das klappt, wären wir schon ein Stück weiter.

Gruss
Björn
:slight_smile:

Ich kann frühestens heute Abend probieren, aber vielleicht könntest du kurz die Zeile

$fam_code = $arr1[14].$arr1[15];
erklären. Sie wird ja bei mir in beiden Scripts moniert. Was kann da der >Undefinined offset< sein?
Gestartet habe ich das Script per Hand mit Ausführen.

Und an bmwm3: Nimm IPS_GetInstanceListByModuleID

Hallo,

ich habel mal kurz etwas geändert:

Ersetz mal die 3 Zeilen:

 $sn = TMEX_GetDevice($id);
 $arr1 = str_split($sn);
 $fam_code = $arr1[14].$arr1[15];

durch den folgenden Code:

 $sn = TMEX_GetDevice($id);
 $fam_code = substr($sn, -2,2);

Zur Erläuterung der Zeile:

$fam_code = $arr1[14].$arr1[15];

Die Seriennummer der 1-Wire-Bausteine besteht aus 16 Stellen.
Diese Seriennummer hatte ich mithilfe eines Arrays in 16 Teile zerteilt von $arr1[0] bis $arr1[15].
Die beiden letzten Stellen, hier $arr1[14] und $arr1[15] geben gemeinsam den sog. Familiy Code an.
Diesen hatte ich einfach zu einem neuen String zusammengesetzt bzw. aneinandergesetzt.
Da es bei dir zu Problemen geführt hat, habe ich jetzt den String geschnitten und nur die beiden letzten Stellen übrig gelassen.

Vielleicht klappt es ja jetzt bei dir.

Viele Grüße
Björn
:slight_smile: