Neu: 55_MiniSIP.pm - ein SIP Endpunkt in FHEM

Begonnen von betateilchen, 27 Mai 2026, 21:07:49

Vorheriges Thema - Nächstes Thema

betateilchen

Seit dem Pfingstwochenende gibt es das neue Modul 55_MiniSIP.pm, mit dem es möglich ist, einen SIP-Endpunkt in FHEM bereitzustellen. Ganz bewusst nenne ich das nicht "SIP Server", denn dazu ist der Funktionsumfang viel zu reduziert. Und genau das war der Sinn und Zweck, warum ich das Modul gebaut habe.

Primäre Aufgabenstellung:

Die primäre Aufgabenstellung war, von einem SIP-Client (z.B. VoIP-Telefon) aus "Nachrichten" an FHEM zu schicken, die dort irgendwelche Funktionen auslösen.

Früher hatte ich sowas schonmal mit dem schon lange bekannten Modul 96_SIP.pm umgesetzt, aber so richtig zuverlässig hat das mit "Nummer wählen und dann DTMF eintippen" nie funktioniert und seit einem der letzten Fritzbox-Updates funktionierte das mit DTMF bei mir gar nicht mehr.

Dann habe ich mir überlegt: kann ich das so umsetzen, dass ich den Spieß einfach umdrehe? Also so, dass sich ein Endgerät direkt an FHEM anmeldet und dann die gewählte "Nummer" als reading erzeugt wird und per notify, DOIF oder wie auch immer in FHEM reagiert wird.

Auf das SIP-Protokoll selbst will ich nicht weiter eingehen, dazu gibt es genug Dokumentationen im Internet. Nur den prinzipiellen Ablauf will ich hier kurz beschreiben. Das Ganze ist ähnlich wie bei HTML ein ping-pong zwischen Client und "Server". Sogar die HTML Fehlercodes mit ihren Nummern haben bei SIP die gleiche Bedeutung, z.B. 200 = OK und 404 = Not Found

  • Telefon registriert sich an FHEM mittels einer REGISTER message
  • Server antwort mit einer "200 Ok" message

Damit ist die Verbindung grundsätzlich schon hergestellt.
Jetzt kann mit dem "Telefon" eine Nummer gewählt werden, dann passiert folgendes:

  • Telefon schickt eine message vom Typ INVITE sip:852@192.168.123.219 SIP/2.0
  • Server antwort mit einer "200 Ok" message

Wer ein bisschen Ahnung von SIP hat, wird jetzt sagen: Stop, so einfach ist das nicht. Ja, ich weiß...

Der eigentliche Ablauf wäre:
  • Server prüft, ob der Teilnehmer 852 existiert und erreichbar ist
  • Server schickt eine TRYING message zurück
  • Server schickt selbst ein INVITE an den Teilnehmer 852
  • sobald es dort klingelt, bekommt der Anrufer eine RINGING message, damit das Telefon weiß, welchen Rufton es abspielen muss
  • dann wird die Verbindung zwischen den Teilnehmern hergestellt
  • am Ende gibt es wieder genau so ein Verabschiedungs-PingPong.

Aber das brauchen wir für den angedachten Zweck alles nicht!

Die eigentlich relevante Information, die wir in FHEM brauchen, steckt schon in der INVITE Message:

sip:852@192.168.123.219
852 ist die Nummer, die gewählt wurde und diese landet in einem reading namens 'input'

setstate sipdev 2026-05-27 20:38:08 input 852
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Wer das mal selbst testen möchte, kann sich in FHEM einen SIP Endpunkt anlegen.

Voraussetzung:
das Modul Net::SIP muss installiert sein.
Debian kennt das Paket als libnet-sip-perl und es lässt sich per apt installieren.

define minisip MiniSIP port=5060 from=minisip@<ip von FHEM>
Der SIP Client braucht in der Regel 3 Parameter:

  • ip oder hostname des Registrars: <ip von FHEM>
  • user: beliebig
  • passwort: beliebig

Der SIP Endpunkt führt keinerlei Authorisierung der registrierenden Clients durch.

Finde ich grundsätzlich nicht schlimm, denn mehr als eine Nummer in ein reading zu schreiben, passiert ja nicht. Vielleicht baue ich irgendwann mal noch eine Benutzerprüfung ein, aber im Moment funktioniert es erstmal ohne. Denn es braucht dann ja auch noch eine Benutzerverwaltung in irgendeiner Form.

Damit sollte sich ein SIP Client schon mit FHEM verbinden können.

Das funktioniert übrigens auch mit einer FritzBox als Client!
Die Einrichtung erfolgt unter "Eigene Rufnummern" wie im angehängten Screenshot.
Die Nummern im oberen Bereich (12345) sind wieder beliebig.

Noch ein paar Tips:

  • Logging erfolgt im Loglevel 4.
  • die Attribute showFullMessage und logFullMessage steuern den Umfang der Datenanzeige

Ansonsten habe ich mir sehr viel Mühe gegeben, eine umfangreiche commandref zu verfassen.



Weitere Funktionen und Anwendungsbeispiele beschreibe ich irgendwann später.

Viel Spaß beim Rumspielen!


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Noch ein Hinweis zum Thema FritzBox:

Wer die Anbindung über die FritzBox testet, muss beim Wählen eines Codes ein paar Sekunden Geduld haben, bevor das bei FHEM ankommt. Das hängt in erster Linie damit zusammen, dass insbesondere die Endgeräte (Telefone) bei der Wahl einer Nummer das Absenden an die Fritzbox verzögern um zu warten, ob noch weitergewählt wird. Einfach mal parallel das MiniSIP-device in FHEM beobachten, wann dort die INVITE Message auftaucht, um ein Gefühl dafür zu bekommen, wie lange das dauert.

Manche VoIP-Telefone haben auch eine OK Taste oder ähnliches, um eine gewählte Nummer abzuschließen. Damit entfällt dann die Wartezeit.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen am 27 Mai 2026, 21:24:08Der SIP Endpunkt führt keinerlei Authorisierung der registrierenden Clients durch.
...
Vielleicht baue ich irgendwann mal noch eine Benutzerprüfung ein,
...
Denn es braucht dann ja auch noch eine Benutzerverwaltung in irgendeiner Form.

Die Authorisierung ist fertig :)
Man wird später per Attribut festlegen können, ob man mit oder ohne auth arbeiten möchte.

Unten sieht man in den beiden REGISTER Nachrichten den Unterschied.
Im zweiten REGISTER schickt der SIP Client die angeforderten Anmeldedaten mit:

Proxy-Authorization: Digest ...

2026.05.28 14:50:00 4: sipdev: MiniSIP.processmsg.240 in:
REGISTER sip:192.168.123.219 SIP/2.0
Via: SIP/2.0/UDP 192.168.123.80:58074;rport;branch=z9hG4bKPjh.pwMdOwI2SCylxxQ6jrmeETs3g.T.5c
Max-Forwards: 70
From: "Udo" <sip:soft@192.168.123.219>;tag=xY5hd4cB2OZzPvbdB25Dqlq9IZHLG5PT
To: "Udo" <sip:soft@192.168.123.219>
Call-ID: VjqS47ggTblneFSNTWTKHrsFBpcNJqL-
CSeq: 18307 REGISTER
User-Agent: Telephone 1.6
Contact: "Udo" <sip:soft@192.168.123.80:58074;ob>
Expires: 300
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Content-Length:  0

2026.05.28 14:50:00 4: sipdev: MiniSIP.sendmsg.212 out to soft:
SIP/2.0 401 Unauthorized
Proxy-authenticate: Digest realm="FHEM.SIP",nonce="NjAxZDg2ZTkxMjQwOTNjNDJhMDYzYjcyYzNiZTE2MWQ=",algorithm=MD5,qop="auth"
Call-id: VjqS47ggTblneFSNTWTKHrsFBpcNJqL-
Cseq: 18307 REGISTER
From: "Udo" <sip:soft@192.168.123.219>;tag=xY5hd4cB2OZzPvbdB25Dqlq9IZHLG5PT
To: "Udo" <sip:soft@192.168.123.219>
Via: SIP/2.0/UDP 192.168.123.80:58074;rport;branch=z9hG4bKPjh.pwMdOwI2SCylxxQ6jrmeETs3g.T.5c
Content-length: 0

2026.05.28 14:50:00 4: sipdev: MiniSIP.processmsg.240 in:
REGISTER sip:192.168.123.219 SIP/2.0
Via: SIP/2.0/UDP 192.168.123.80:58074;rport;branch=z9hG4bKPjau3toi-25qIS1Y4vFHDmRR.vILry8uIA
Max-Forwards: 70
From: "Udo" <sip:soft@192.168.123.219>;tag=xY5hd4cB2OZzPvbdB25Dqlq9IZHLG5PT
To: "Udo" <sip:soft@192.168.123.219>
Call-ID: VjqS47ggTblneFSNTWTKHrsFBpcNJqL-
CSeq: 18308 REGISTER
User-Agent: Telephone 1.6
Contact: "Udo" <sip:soft@192.168.123.80:58074;ob>
Expires: 300
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Proxy-Authorization: Digest username="soft", realm="FHEM.SIP", nonce="NjAxZDg2ZTkxMjQwOTNjNDJhMDYzYjcyYzNiZTE2MWQ=", uri="sip:192.168.123.219", response="6f3834ab400bc021b3b40e3f6ec1e951", algorithm=MD5, cnonce="aI5PMBrknNoeQDltCQNyTnG29LOslmak", qop=auth, nc=00000001
Content-Length:  0

2026.05.28 14:50:00 4: sipdev: MiniSIP.sendmsg.212 out to soft:
SIP/2.0 200 OK
Call-id: VjqS47ggTblneFSNTWTKHrsFBpcNJqL-
Cseq: 18308 REGISTER
From: "Udo" <sip:soft@192.168.123.219>;tag=xY5hd4cB2OZzPvbdB25Dqlq9IZHLG5PT
To: "Udo" <sip:soft@192.168.123.219>
Via: SIP/2.0/UDP 192.168.123.80:58074;rport;branch=z9hG4bKPjau3toi-25qIS1Y4vFHDmRR.vILry8uIA
Content-length: 0
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!