Difference between revisions of "Licht"

From CCCHHWiki
Jump to: navigation, search
(wip: DMX-Treiber)
(DMX-Kanäle)
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
== Debugging ==
 +
Das Licht schaltet beim aufschließen des Raumes standardmäßig alle Lampen auf weiß und beim zuschließen aus.
 +
* Falls irgendwas nicht geht, folgendes tun:
 +
<nowiki>$ ssh root@licht.z9 # Passwort muss geraten werden
 +
 
 +
root@lifesupport# lsusb | grep "0403:6001"
  
 +
Bus 00X Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC</nowiki>
 +
 +
* Ist das Device im Output? <code>Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC</code>
 +
** Falls nicht: Den großen blauen Kasten im Schrank kurz vom USB trennen und wieder dran stecken.
 +
*** Wenn's dann immer noch nicht da ist: verzweifeln.
 +
 +
* Ist der ftdio_sio-Treiber geladen?
 +
<nowiki># lsmod | grep ftdio_sio</nowiki>
 +
* Ist der <code>olad</code> gestarted?
 +
<nowiki># systemctl restart olad</nowiki>
 +
* Dann: Services neustarten:
 +
<nowiki># systemctl restart dmx-repeater
 +
# systemctl restart foobardmx</nowiki>
 +
* Anschließend im Frontend nochmal auf "an" klicken.
 +
*** Wenn's dann immer noch nicht geht: verzweifeln und die VM neustarten.
 +
<nowiki># systemctl reboot</nowiki>
 +
 +
= Setup =
 
== Hardware ==
 
== Hardware ==
 +
 +
=== Lichtanlage ===
 
Da sind ein paar Licht-Dinge an der Decke. Die werden über DMX-512 angesprochen.  
 
Da sind ein paar Licht-Dinge an der Decke. Die werden über DMX-512 angesprochen.  
* Leiste Tafel/Fenster
 
* Leiste Tafel/Tür
 
* …
 
  
== Ansteuerung ==
+
;Spot Fenster/Küche :1
 +
;Spot Fenster/Tafel :8
 +
;Spot Tür/Tafel:22
 +
;Spot Tür/Küche:15
 +
;Bar Fenster/Küche:51
 +
;Bar Fenster/Tafel:29
 +
;Bar Tür/Tafel:40
 +
;Bar Tür/Küche:62
 +
 
 +
=== Ansteuerung ===
 
Es hängt ein ENTTEC Open DMX USB-Gerät rum und bespielt den DMX-Bus. <code>ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC</code>. Ist also im Prinzip ein normaler FTDI USB-Seriell-Wandler.
 
Es hängt ein ENTTEC Open DMX USB-Gerät rum und bespielt den DMX-Bus. <code>ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC</code>. Ist also im Prinzip ein normaler FTDI USB-Seriell-Wandler.
  
=== Hypervisor-Config ===
+
== Hypervisor-Configuration ==
Da der bei uns in einer VM (mit dem Namen <code>licht</code>) hängt ist noch einiges nötig.
+
Da das DMX-Device bei uns in einer VM (mit dem Namen <code>licht</code>) hängt ist noch einiges nötig.
 
Auf dem Hypervisor (Debian/systemd/GNU/Linux) das <code>ftdi_sio</code>-Modul blacklisten:
 
Auf dem Hypervisor (Debian/systemd/GNU/Linux) das <code>ftdi_sio</code>-Modul blacklisten:
  <nowiki>
+
  <nowiki>root@red.bikeshed.hamburg.ccc.de:~# cat /etc/modprobe.d/blacklist.conf  
root@red.bikeshed.hamburg.ccc.de:~# cat /etc/modprobe.d/blacklist.conf  
+
blacklist ftdi_sio</nowiki>
blacklist ftdi_sio</nowiki>
 
  
Device der VM mitgeben:  
+
== VM-Configuration ==
 +
DMX-Device der VM mitgeben:  
 
  <nowiki>
 
  <nowiki>
 
     <hostdev mode='subsystem' type='usb' managed='no'>
 
     <hostdev mode='subsystem' type='usb' managed='no'>
Line 24: Line 56:
 
       </source>
 
       </source>
 
     </hostdev></nowiki>
 
     </hostdev></nowiki>
Man beachte das <code>startupPolicy</code>. Das ist ein USB-Gerät, das könnten Leute abziehen, und wir wollen trotzdem, dass die VM dann startet. Genau aus dem Grund müssen wir auch noch mehr tun. Obigen XML-Code in eine Datei tun, z.B. <code>/root/dmxcontroller.xml</code>. Dann legen wir eine udev-Regeln an, dass beim anstöpseln des Gerätes das auch direkt an die VM geht:
+
Man beachte das <code>startupPolicy</code>. Das ist ein USB-Device, dass könnten Leute entfernen und wir wollen trotzdem, dass die VM dann startet. Genau aus dem Grund müssen wir auch noch mehr tun. Obigen XML-Code in eine Datei tun, z.B. <code>/root/dmxcontroller.xml</code>. Dann legen wir eine udev-Regeln an, dass beim anstöpseln das DMX-Device direkt an die VM durchgereicht wird:
  <nowiki>
+
  <nowiki># /etc/udev/rules.d/90-libvirt-usb.rules
# /etc/udev/rules.d/90-libvirt-usb.rules
+
ACTION=="add", \
ACTION=="add", \
+
  SUBSYSTEM=="usb", \
    SUBSYSTEM=="usb", \
+
  ENV{ID_VENDOR_ID}=="0403", \
    ENV{ID_VENDOR_ID}=="0403", \
+
  ENV{ID_MODEL_ID}=="6001", \
    ENV{ID_MODEL_ID}=="6001", \
+
  RUN+="/usr/bin/virsh attach-device licht /root/dmxcontroller.xml"
    RUN+="/usr/bin/virsh attach-device licht /root/dmxcontroller.xml"
+
ACTION=="remove", \
ACTION=="remove", \
+
  SUBSYSTEM=="usb", \
    SUBSYSTEM=="usb", \
+
  ENV{ID_VENDOR_ID}=="0403", \
    ENV{ID_VENDOR_ID}=="0403", \
+
  ENV{ID_MODEL_ID}=="6001", \
    ENV{ID_MODEL_ID}=="6001", \
+
  RUN+="/usr/bin/virsh detach-device licht /root/dmxcontroller.xml"</nowiki>
    RUN+="/usr/bin/virsh detach-device licht /root/dmxcontroller.xml"</nowiki>
+
Lustig, nech? Bitte bitte Bescheid sagen, falls ich da 'ne Funktion in <code>libvirt</code> übersehen hab.  
Lustig, nech? Bitte bitte Bescheid sagen, falls ich da ne Funktion in libvirt übersehen hab.  
 
  
=== Treiber-Config ===
+
=== Treiber-Configuration ===
So, endlich haben wir das Device am Gerät. Wir erinnern uns, USB-Vendor 0x0403 und Device-ID 0x6001. Jetzt wollen wir es auch schön ansteuern. Dazu muss man dem FTDI beibringen, auch ordentliches DMX rauszupipen, das einfach aus einer Folge Bits besteht und keine doofen Start/Stopbits und so hat. Das macht der normale ftdi-Treiber im Linux Kernel nicht, also rauswerfen:
+
So, endlich haben wir das DMX-Device in die VM durchgereicht. Wir erinnern uns, USB-Vendor 0x0403 und Device-ID 0x6001. Jetzt wollen wir es auch schön ansteuern. Dazu muss man dem FTDI beibringen, auch ordentliches DMX rauszupipen, das einfach aus einer Folge Bits besteht und keine doofen Start/Stopbits und so hat.  
<nowiki>
+
Das DMX spricht jetzt der Demon der Open Lighting Architecture (olad). Der ist konfiguriert, auf dem einen Ende mit dem Gerät zu reden (mittel der libftdi) und auf der anderen per ArtNet, das ist quasi DMX over UDP, die DMX-Settings zu empfangen. Das geht also wieder übers Netz, yay!
root@licht.z9:~# cat /etc/modprobe.d/dmx_usb.conf
 
blacklist ftdi_sio</nowiki>
 
 
Außerdem muss man darauf achten, dass <code>brltty</code> nicht dazwischenfunkt, also deinstallieren.
 
Außerdem muss man darauf achten, dass <code>brltty</code> nicht dazwischenfunkt, also deinstallieren.
 +
<nowiki>root@licht.z9:~# apt-get remove brltty</nowiki>
 +
 +
=== Business Logic ===
 +
Jetzt wird's lustig. Unser Software-Aufbau:
 
  <nowiki>
 
  <nowiki>
  root@licht.z9:~# apt-get remote brltty</nowiki>
+
          device            ArtNet(UDP)          fifo        websockets
 +
  USB-Gerät <--- OpenLighting  <--- dmx_repeater <--- foobardmx <--- light (Farbwechsel-Skript)
 +
              fremdgefrickel          ruby              node        ruby</nowiki>
 +
 
 +
Der <code>dmx_repeater</code> spricht mit dem OLA. Zu finden ist er unter <code>https://gitlab.hamburg.ccc.de/ccchh/dmx-repeater</code>.
 +
<nowiki>licht@licht.z9 $ git clone https://gitlab.hamburg.ccc.de/ccchh/dmx-repeater.git</nowiki>
 +
Hat als Abhängigkeit nur ruby.
 +
 
 +
Der <code>foobardmx</code> ist zum einen das Web-Dashboard, zum anderen weiß es, auf welchen DMX-Kanälen was passiert. Zu finden ist es unter <code>https://gitlab.hamburg.ccc.de/ccchh/foobardmx</code> und in NodeJS geschrieben. Also das Clonen und irgendwie die Abhängigkeiten installieren. Hab vergessen, wie. Foobardmx connected sich über nen FIFO zum dmx_repeater.
 +
 
 +
Das letzte ist ein Tool ohne großen Namen, heißt <code>light</code>. Das macht lustige Animationen, in dem es sich zum foobardmx connected und Kommandos schickt. Der foobardmx started light, indem es den entsprechenden Service startet. <code>https://gitlab.hamburg.ccc.de/ccchh/light</code>. '''ACHTUNG: Aus bisher ungeklärten Gründen ist der Farbwechsler kaputt, wir vermuten nen Bug im NodeJS-Websocket-Gedöns.'''
 +
 
 +
Die Dinge brauchen noch Systemd-Units, um auch richtig zu starten:
 +
<nowiki># /etc/systemd/system/foobardmx.service
 +
[Unit]
 +
Description=foobardmx lightig web control
 +
After=dmx-repeater.service
 +
 
 +
[Service]
 +
Type=simple
 +
WorkingDirectory=/home/licht/foobardmx
 +
ExecStartPre=/bin/sleep 5
 +
ExecStart=/usr/bin/nodejs lighting.js >/dev/null 2>/dev/null
 +
User=licht
 +
Group=licht
 +
 
 +
[Install]
 +
WantedBy=multi-user.target</nowiki>
 +
 
 +
<nowiki># /etc/systemd/system/dmx-repeater.service
 +
[Unit]
 +
Description=dmx-repeater
  
Jetzt müssen wir ein neues Kernelmodul installieren. Dazu brauchen wir die Kernel-Header und nen Compiler und so. Das sei dem Leser überlassen.
+
[Service]
Yay. Angeblich ist das nur für 2.6, klappt mit 3.16 aber auch noch. Wir sind gerade auf Commit ee99ca7edbd9e093480ad63341ac007394047bde.
+
Type=simple
  <nowiki>
+
WorkingDirectory=/home/licht/dmx_repeater/bin
# git clone https://github.com/lowlander/dmx_usb_module.git
+
ExecStart=/home/licht/dmx_repeater/bin/dmx_repeater
  # cd dmx_usb_module
+
User=licht
# make
+
Group=licht
# cp dmx_usb.ko /lib/modules/`uname -r`/kernel/drivers/usb/serial/
+
Restart=always
# systemctl reboot # Ist ja ne VM, geht fix ;)</nowiki>
+
 +
[Install]
 +
WantedBy=multi-user.target</nowiki>
 +
 
 +
  <nowiki># /etc/systemd/system/light.service
 +
[Unit]
 +
Description=slowly chaning colors
 +
   
 +
[Service]
 +
Type=simple
 +
WorkingDirectory=/home/licht/light
 +
ExecStart=/home/licht/light/light
 +
User=licht
 +
 
 +
[Install]
 +
WantedBy=multi-user.target</nowiki>
  
Wenn alles geklappt hat müsste es jetzt ein Device <code>/dev/dmx0</code> geben. Weil wir ja mit minimalen Berechtigungen arbeiten und nix als root laufen lassen wollen müssen wir noch ne udev-Regel schreiben.
+
  <nowiki># visudo
  <nowiki>
+
licht  ALL=(ALL) NOPASSWD: /bin/systemctl stop light
# /etc/udev/rules.d/65-dmxinput.rules
+
licht   ALL=(ALL) NOPASSWD: /bin/systemctl start light</nowiki>
KERNEL=="dmx[0-9]*", GROUP="licht"
 
ACTION=="add", \
 
    SUBSYSTEM=="usb", \
 
    ENV{ID_VENDOR_ID}=="0403", \
 
    ENV{ID_MODEL_ID}=="6001"
 
ACTION=="remove", \
 
    SUBSYSTEM=="usb", \
 
    ENV{ID_VENDOR_ID}=="0403", \
 
    ENV{ID_MODEL_ID}=="6001"</nowiki>
 
Also, vorausgesetzt, unser DMX-Progrämmchen läuft in der Gruppe <code>licht</code>. Wer Lust hat kann hier noch nen Symlink anlegen, damit wir auch immer das gleiche Device an derselben Stelle haben.
 
  
=== Software ===
+
Services anmachen
 +
<nowiki># systemctl enable dmx-repeater
 +
# systemctl enable foobardmx</nowiki>

Latest revision as of 21:43, 17 December 2019

Debugging

Das Licht schaltet beim aufschließen des Raumes standardmäßig alle Lampen auf weiß und beim zuschließen aus.

  • Falls irgendwas nicht geht, folgendes tun:
$ ssh root@licht.z9 # Passwort muss geraten werden
  
root@lifesupport# lsusb | grep "0403:6001"

Bus 00X Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
  • Ist das Device im Output? Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
    • Falls nicht: Den großen blauen Kasten im Schrank kurz vom USB trennen und wieder dran stecken.
      • Wenn's dann immer noch nicht da ist: verzweifeln.
  • Ist der ftdio_sio-Treiber geladen?
# lsmod | grep ftdio_sio
  • Ist der olad gestarted?
# systemctl restart olad
  • Dann: Services neustarten:
# systemctl restart dmx-repeater
# systemctl restart foobardmx
  • Anschließend im Frontend nochmal auf "an" klicken.
      • Wenn's dann immer noch nicht geht: verzweifeln und die VM neustarten.
# systemctl reboot

Setup

Hardware

Lichtanlage

Da sind ein paar Licht-Dinge an der Decke. Die werden über DMX-512 angesprochen.

Spot Fenster/Küche 
1
Spot Fenster/Tafel 
8
Spot Tür/Tafel
22
Spot Tür/Küche
15
Bar Fenster/Küche
51
Bar Fenster/Tafel
29
Bar Tür/Tafel
40
Bar Tür/Küche
62

Ansteuerung

Es hängt ein ENTTEC Open DMX USB-Gerät rum und bespielt den DMX-Bus. ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC. Ist also im Prinzip ein normaler FTDI USB-Seriell-Wandler.

Hypervisor-Configuration

Da das DMX-Device bei uns in einer VM (mit dem Namen licht) hängt ist noch einiges nötig. Auf dem Hypervisor (Debian/systemd/GNU/Linux) das ftdi_sio-Modul blacklisten:

root@red.bikeshed.hamburg.ccc.de:~# cat /etc/modprobe.d/blacklist.conf 
blacklist ftdi_sio

VM-Configuration

DMX-Device der VM mitgeben:

    <hostdev mode='subsystem' type='usb' managed='no'>
      <source startupPolicy='optional'>
        <vendor id='0x0403'/>
        <product id='0x6001'/>
      </source>
    </hostdev>

Man beachte das startupPolicy. Das ist ein USB-Device, dass könnten Leute entfernen und wir wollen trotzdem, dass die VM dann startet. Genau aus dem Grund müssen wir auch noch mehr tun. Obigen XML-Code in eine Datei tun, z.B. /root/dmxcontroller.xml. Dann legen wir eine udev-Regeln an, dass beim anstöpseln das DMX-Device direkt an die VM durchgereicht wird:

# /etc/udev/rules.d/90-libvirt-usb.rules
ACTION=="add", \
   SUBSYSTEM=="usb", \
   ENV{ID_VENDOR_ID}=="0403", \
   ENV{ID_MODEL_ID}=="6001", \
   RUN+="/usr/bin/virsh attach-device licht /root/dmxcontroller.xml"
ACTION=="remove", \
   SUBSYSTEM=="usb", \
   ENV{ID_VENDOR_ID}=="0403", \
   ENV{ID_MODEL_ID}=="6001", \
   RUN+="/usr/bin/virsh detach-device licht /root/dmxcontroller.xml"

Lustig, nech? Bitte bitte Bescheid sagen, falls ich da 'ne Funktion in libvirt übersehen hab.

Treiber-Configuration

So, endlich haben wir das DMX-Device in die VM durchgereicht. Wir erinnern uns, USB-Vendor 0x0403 und Device-ID 0x6001. Jetzt wollen wir es auch schön ansteuern. Dazu muss man dem FTDI beibringen, auch ordentliches DMX rauszupipen, das einfach aus einer Folge Bits besteht und keine doofen Start/Stopbits und so hat. Das DMX spricht jetzt der Demon der Open Lighting Architecture (olad). Der ist konfiguriert, auf dem einen Ende mit dem Gerät zu reden (mittel der libftdi) und auf der anderen per ArtNet, das ist quasi DMX over UDP, die DMX-Settings zu empfangen. Das geht also wieder übers Netz, yay! Außerdem muss man darauf achten, dass brltty nicht dazwischenfunkt, also deinstallieren.

root@licht.z9:~# apt-get remove brltty

Business Logic

Jetzt wird's lustig. Unser Software-Aufbau:

          device            ArtNet(UDP)          fifo         websockets
 USB-Gerät <--- OpenLighting  <--- dmx_repeater <--- foobardmx <--- light (Farbwechsel-Skript)
               fremdgefrickel          ruby              node         ruby

Der dmx_repeater spricht mit dem OLA. Zu finden ist er unter https://gitlab.hamburg.ccc.de/ccchh/dmx-repeater.

licht@licht.z9 $ git clone https://gitlab.hamburg.ccc.de/ccchh/dmx-repeater.git

Hat als Abhängigkeit nur ruby.

Der foobardmx ist zum einen das Web-Dashboard, zum anderen weiß es, auf welchen DMX-Kanälen was passiert. Zu finden ist es unter https://gitlab.hamburg.ccc.de/ccchh/foobardmx und in NodeJS geschrieben. Also das Clonen und irgendwie die Abhängigkeiten installieren. Hab vergessen, wie. Foobardmx connected sich über nen FIFO zum dmx_repeater.

Das letzte ist ein Tool ohne großen Namen, heißt light. Das macht lustige Animationen, in dem es sich zum foobardmx connected und Kommandos schickt. Der foobardmx started light, indem es den entsprechenden Service startet. https://gitlab.hamburg.ccc.de/ccchh/light. ACHTUNG: Aus bisher ungeklärten Gründen ist der Farbwechsler kaputt, wir vermuten nen Bug im NodeJS-Websocket-Gedöns.

Die Dinge brauchen noch Systemd-Units, um auch richtig zu starten:

# /etc/systemd/system/foobardmx.service 
[Unit]
Description=foobardmx lightig web control
After=dmx-repeater.service

[Service]
Type=simple
WorkingDirectory=/home/licht/foobardmx
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/nodejs lighting.js >/dev/null 2>/dev/null
User=licht
Group=licht

[Install]
WantedBy=multi-user.target
# /etc/systemd/system/dmx-repeater.service 
[Unit]
Description=dmx-repeater

[Service]
Type=simple
WorkingDirectory=/home/licht/dmx_repeater/bin
ExecStart=/home/licht/dmx_repeater/bin/dmx_repeater
User=licht
Group=licht
Restart=always
 
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/light.service 
[Unit]
Description=slowly chaning colors 
 
[Service]
Type=simple
WorkingDirectory=/home/licht/light
ExecStart=/home/licht/light/light
User=licht

[Install]
WantedBy=multi-user.target
# visudo
licht   ALL=(ALL) NOPASSWD: /bin/systemctl stop light
licht   ALL=(ALL) NOPASSWD: /bin/systemctl start light

Services anmachen

# systemctl enable dmx-repeater
# systemctl enable foobardmx