Für alle die den Status Ihrer Homemmatic-Geräte anstelle der FHEM-Webseite in einer eigenen Webseite darstellen wollen, gibt es diesmal einen einfachen Schnippsel PHP-Code um den Status eines Homematic-Fensterkontaktes hm-sec-sc per Telnet abzufragen.
Hierfür bietet sich das list-Kommando von FHEM an. Die Syntax ist sehr einfach:
list [devspec] [value]
Wobei [devspec] der Name des Homematic-Gerätes ist, wie es in der FHEM-Einstellungen konfiguriert ist. Für [value] wird STATE als eines der Attribute des Fensterkontaktes abgefragt. STATE gibt neben dem Gerätenamen den aktuellen Zustand closed oder open aus.
Folgendes Script setzt ein entsprechendes Telnet-Kommando ab und parst das Ergebnis:
[cclN_php]
//Hostname und Telnet-Port des FHEM-Servers
$fhemhost = “localhost”;
$fhemport = 7072;
//Socket öffnen
$fhemsock = fsockopen($fhemhost, $fhemport, $errno, $errstr, 30);
//FHEM Kommando definieren (Name des Homematic-Gerätes eintragen)
$fhemcmd = “list
fwrite($fhemsock, $fhemcmd);
while(!feof($fhemsock)) {
$ergebnis=fgets($fhemsock, 128);
$zustand=explode(‘ ‘,$ergebnis);
switch (trim($zustand[1])) {
case “closed”:
$zustand=”geschlossen”;
break;
case “open”:
$zustand=”offen”;
break;
default:
$zustand=$ergebnis[1];
break;
}
if ($ergebnis[1]!=””) {
print “
}
}
[/cclN_php]
In einer Webseite kann das dann z.B. folgendermaßen implementiert werden:
Ich lasse dann auch jeden Abend um 21 Uhr per Cron-Script prüfen ob alle Fenster geschlossen sind. Wenn nicht, wird eine Mail versendet.
Viel Spaß mit den Schnippsel
Chris
Super Projekte und Snippets bei Dir im Blog.
Einige FHEM + Telnet Snippets mehr könnten es noch sein 🙂
Hi Mike,
Danke Dir! Ich werde die Tage mal schauen ob ich noch was Interessantes finde.
Chris
Hey
Super Snippets. Ist hier ein Cron Job nicht an FHEM vorbei, wenn dies nicht IN FHEM auch abgewickelt wird?
Ein AT (Define FensterStatus at *21:00{ … } ) wäre doch viel näher beim Thema.
Gruß
Hi,
ja, das mit dem Cronjob ist an FHEM vorbei und Du hast recht: ein AT im FHEM würde das natürlich auch lösen. Wahrscheinlich sogar mit weniger Aufwand.
Ein AT benutze ich z.B. für den “Anwesenheitscheck” um die Handys im WLAN zu pollen und ggf. die Abwesenheit zu aktivieren.
Da ich die Abfrage per Telnet aber auch noch für andere Dinge benötige, hatte ich mich für die Cronjob-Variante entschlossen.
Gruß
Chris
Hallo Chris,
bin gerade über Dein Code Snippet gestolpert. Das würde ich auch gerne bei mir implementieren, aber wie müsste ich den Code modifizieren, wenn mein Telnet Zugang passwortgeschützt ist? Den möchte ich nämlich ungerne dafür aufmachen.
Gruß
Rainer
Hallo Rainer,
Du musst nach dem Verbindungsaufbau und vor dem Absetzen des FHEM-Kommandos noch Benutzername und Passwort übergeben. ” sollte nach
Dafür am besten zuerst per Putty schauen wie der Telnet-Dialog im einzelnen ausschaut.
Nach “telnet
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
ein weiterer Dialog zur Eingabe von Benutzer und Passwort folgen. Sowas wie “user:” wo du dann den Benutzernamen eingeben musst.
Danach das gleiche für das Passwort.
Im PHP muss das “user:” und “password:” mit fgets erkannt werden und dann die entsprechenden Daten per fwrite/fputs übergeben werden.
Das könnte dann wie folgt ausschauen (ungetestet):
$stop=true;.”\r\n”);.”\r\n”);
while ($stop) (
while($zeile = fgets($fhemsock, 1024)) {
switch($zeile) {
case ‘user:’
fputs($fhemsock,
break;
case ‘password:’
fputs($fhemsock,
$stop=false;
break;
}
}
}
Gruß
Chris