Snippet – FHEM mit PHP über Telnet abfragen

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:

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:

//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 <name_des_hm_geraetes> STATE\r\nquit\r\n";
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 "<name_des_hm_geraetes>:".$zustand;
        }
}

In einer Webseite kann das dann z.B. folgendermaßen implementiert werden:

fenstersensoren

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

6 Gedanken zu „Snippet – FHEM mit PHP über Telnet abfragen

  • Avatar
    15. September 2014 um 14:40
    Permalink

    Super Projekte und Snippets bei Dir im Blog.

    Einige FHEM + Telnet Snippets mehr könnten es noch sein 🙂

    Antwort
    • diefenbecker
      16. September 2014 um 19:30
      Permalink

      Hi Mike,
      Danke Dir! Ich werde die Tage mal schauen ob ich noch was Interessantes finde.

      Chris

      Antwort
  • Avatar
    29. Oktober 2014 um 23:46
    Permalink

    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ß

    Antwort
    • diefenbecker
      31. Oktober 2014 um 10:55
      Permalink

      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

      Antwort
  • Avatar
    12. März 2016 um 09:45
    Permalink

    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

    Antwort
    • diefenbecker
      12. März 2016 um 12:53
      Permalink

      Hallo Rainer,

      Du musst nach dem Verbindungsaufbau und vor dem Absetzen des FHEM-Kommandos noch Benutzername und Passwort übergeben.
      Dafür am besten zuerst per Putty schauen wie der Telnet-Dialog im einzelnen ausschaut.
      Nach “telnet ” sollte nach

      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;
      while ($stop) (
      while($zeile = fgets($fhemsock, 1024)) {
      switch($zeile) {
      case ‘user:’
      fputs($fhemsock, .”\r\n”);
      break;
      case ‘password:’
      fputs($fhemsock, .”\r\n”);
      $stop=false;
      break;
      }
      }
      }

      Gruß
      Chris

      Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.