Hallo Christian,
die "Aufgabenstellung" lässt mich nicht in Ruhe ... Eventuell benötige ich auch bald eine Zusatzklingel für VoIP.
Deshalb habe ich noch ein wenig gebastelt. Nicht genau das was ich haben wollte, aber als erster Wurf ok. Vielleicht hilft es dir?
Nützt natürlich nur etwas, wenn man vollen Zugriff auf asterisk hat.
Ich habe zwei Rechner: "Server" (mit Debian stretch und laufenden asterisk, ...) und einen Raspberry Pi 1(Raspbian stretch)
Der Raspberry Pi soll einen GPIO schalten, wenn die Nebenstelle "2000" angerufen wird.
Der Raspberry Pi heißt bei mir ek2ms011, sonst die IP-Adresse des Raspberry PI nehmen!
Neue Software auf dem Server: mosquitto-clients
Neue Software auf dem Raspberry Pi: mosquitto und "flyte/pi-mqtt-gpio"
Wir bauen die "config.yaml" für pi-mqtt-gpio zusammen, damit GPIO25 / Pin xx geschaltet wird:
mqtt:
host: localhost
port: 1883
user: ""
password: ""
topic_prefix: local/V1
gpio_modules:
- name: raspberrypi
module: raspberrypi
cleanup: no # This optional boolean value sets whether the module's `cleanup()` function will be called when the software exits.
digital_outputs:
- name: Licht
module: raspberrypi
pin: 25
on_payload: "ON"
off_payload: "OFF"
initial: low # This optional value controls the initial state of the pin before receipt of any messages from MQTT. Valid options are 'low' and 'high'.
retain: yes # This option value controls if the message is retained. Default is no.
# publish_initial: yes # Publish the initial value of the output on startup. Default is no.
Alles anzeigen
Nun starten wir das Ganze mit: python -m pi_mqtt_gpio.server config.yaml.
Da sollten dann Statusmeldungen kommen, welche Topics alle beobachtet werden. usw.
Auf dem Server in der "extensions.conf" von asterisk habe ich den Dialplan von der Nebenstelle 2000 geändert.
ALT:
exten => 2000,1,Dial(SIP/2001,99)
exten => 2000,n,HangUp()
NEU:
exten => 2000,1,SYSTEM(/usr/bin/mosquitto_pub -h ek2ms011 -m 20000 -t local/V1/output/Licht/set_on_ms &)
exten => 2000,n,SYSTEM(/usr/bin/mosquitto_pub -h ek2ms011 -m ON -t local/V1/output/Licht/set &)
exten => 2000,n,Dial(SIP/2000,15,gU(angenommen))
exten => 2000,n,TrySYSTEM(/usr/bin/mosquitto_pub -h ek2ms011 -m OFF -t local/V1/output/Licht/set &)
exten => 2000,n,Hangup()
[angenommen]
exten => s,1,TrySYSTEM(/usr/bin/mosquitto_pub -h ek2ms011 -m OFF -t local/V1/output/Licht/set &)
exten => s,n,Return()
Jetzt nicht blind abschreiben, sondern ein wenig verstehen was da abgeht
Wenn die 2000 angerufen wird, dann werden erst einmal zwei Nachrichten in verschiedene Topics an den MQTT-Server gesendet.
1. Soll der GPIO nach 20 Sekunden (20000 msec) wieder ausgeschaltet werden
2. Den GPIO einschalten
Danach wird die Nebenstelle 2000 angerufen und wenn Anruf angenommen wird zu "angenommen" gesprungen. Sonst weiter in der Kette.
Wenn der Timeout auftritt (hier 15 Sekunden) wird "OFF" zur MQTT-Server gesendet.
Eine Situation ist nicht abgebildet.
Wenn der Anrufer während des Klingelns einfach auflegt. Dazu bekomme ich in asterisk keine "Meldung/Extension"
Deshalb habe ich den Topic "set_on_ms"gesetzt, dann wird der GPIO auf dem Raspberry Pi auf jeden Fall wieder zurück gesetzt.
Weitere Alternativen welche mir noch eingefallen sind:
Fertiggerät: Snom PA1, welches aber bei 125,- € liegen soll.- baresip als zusätzliche Nebenstelle auf dem Raspberry Pi installieren. Der kann ab Version (0.6?) auch MQTT-Nachrichten versenden ... (stretch hat natürlich V 0.5.x)
Viele Grüße
Olaf (der aus dem DoorPi-Forum)