Mittwoch, 17. Mai 2017

Airsonos auf dem Raspberry Pi 3

Ich habe mir kürzlich einen Sonos Play:1* zugelegt, mit dem ich bisher wirklich sehr zufrieden bin. Trotz der super Software von Sonos, wollte ich auch gerne den Lautsprecher mittels Airplay ansprechen. Dazu verwende ich Airsonos.

  curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -   
  apt-get install -y nodejs   
  apt-get install libavahi-compat-libdnssd-dev   

Airsonos benötigt Node.Js und Avahi und kann anschließend installiert werden.

 npm install airsonos -g  

Damit Airsonos auch einwandfrei funktioniert, müssen ein paar Dateien angepasst werden.

 npm root -g  

Mit diesem Befehl findet ihr euren Node-Ordner

Nun könnt ihr folgende Änderungen durchführen:

  • logicalDevices.js
 Anpassen:  
 <YOUR NODE INSTALL FOLDER>/node_modules/airsonos/node_modules/sonos/lib/logicalDevices.js
  
 Ersetze:  
 if (device.name === 'BRIDGE' || device.name === 'BOOST') return; // devices to ignore in search
  
 Mit:  
 if (device.coordinator === 'false' || device.name === 'BRIDGE' || device.name === 'BOOST') return; // devices to ignore in search  

  • sonos.js
 Anpassen:  
 <YOUR NODE INSTALL FOLDER>/node_modules/airsonos/node_modules/sonos/lib/sonos.js
  
 Ersetze 239.255.255.250:  
 _this.socket.send(PLAYER_SEARCH, 0, PLAYER_SEARCH.length, 1900, '239.255.255.250');
  
 Mit deiner Broadcast IP:  
 _this.socket.send(PLAYER_SEARCH, 0, PLAYER_SEARCH.length, 1900, '192.168.11.255');  

Mittel ifconfig findet ihr eure Boradcast-IP. Normalerweise sollte diese auf 255 enden.

 Bcast:192.168.11.255   


  • helper.js
 Anpassen:  
 <YOUR NODE INSTALL FOLDER>/node_modules/airsonos/node_modules/nodetunes/lib/helper.js
   
 Ersetz den Eintrag:  
 var decipher = crypto.createDecipheriv('aes-128-cbc', audioAesKey, audioAesIv);
  
 Mit diesen Beiden:  
 var audioAesKeyBuffer = new Buffer(audioAesKey, 'binary');  
 var decipher = crypto.createDecipheriv('aes-128-cbc', audioAesKeyBuffer, audioAesIv);  


Nun könnt ihr versuchen airsonos zu starten mit dem Befehl airsonos. Ihr sollten sehen, das Lautsprecher gefunden werden.

 May 16 15:45:24 raspberrypi nodejs[32552]: *** WARNING *** Please fix your application to use the native API of Avahi!  
 May 16 15:45:24 raspberrypi nodejs[32552]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=nodejs&f=DNSServiceRegister>  
 May 16 15:45:24 raspberrypi airsonos[32552]: *** WARNING *** Please fix your application to use the native API of Avahi!  
 May 16 15:45:24 raspberrypi airsonos[32552]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=nodejs>  
 May 16 15:45:24 raspberrypi airsonos[32552]: *** WARNING *** The program 'nodejs' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.  
 May 16 15:45:24 raspberrypi airsonos[32552]: *** WARNING *** Please fix your application to use the native API of Avahi!  
 May 16 15:45:24 raspberrypi airsonos[32552]: *** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=nodejs&f=DNSServiceRegister>  
 May 16 15:45:26 raspberrypi airsonos[32552]: Searching for Sonos devices on network...  
 May 16 15:45:26 raspberrypi airsonos[32552]: Wohnzimmer (@ 192.168.11.159:1400, RINCON_949F3E73EFB801400:0)  
 May 16 15:45:26 raspberrypi airsonos[32552]: Search complete. Set up 1 device tunnel.  

Die Warnungen sind normal und können ignoriert werden.

Ihr könnt nun auch testen ob ihr den Lautsprecher via AirPlay ansteuern könnt.

Nun kümmern wir uns um den Autostart. Wir erzeugen ein Startfile.

 root@raspberrypi:/home/pi# which airsonos  
 /usr/bin/airsonos
  root@raspberrypi:/home/pi# vi /etc/systemd/system/airsonos.service
  
 [Unit]  
 Description=Airsonos Server  
 After=syslog.target network-online.target  
 [Service]  
 Type=simple  
 ExecStart=/usr/bin/airsonos  
 Restart=on-failure  
 RestartSec=10  
 KillMode=process  
 [Install]  
 WantedBy=multi-user.target  

Unter ExecStart tragt ihr das Ergebnis des which Befehls ein.

 systemctl daemon-reload  
 systemctl enable airsonos  
 systemctl start airsonos  

Damit habt ihr den Autostart gesetzt und den Dienst gestartet.


*=Affiliate Link

Montag, 8. Mai 2017

Homebridge und Plugins auf dem Raspberry Pi 3 installieren

Mittels Homebridge kann man nicht HomeKit fähige Geräte in HomeKit einbinden. Beispiele dafür sind eine Synology Diskstation*, IFTTT, ein Logitech Harmony Hub*, Netatmo Wetterstation* und Amazon Dash Button*.

Ich installieren Homebridge auf einem Raspberry Pi 3 mit Jessie. Da ich meine Amazon Dash Buttons mit einbinden will werde ich hier die Installation als root durchführen, bzw. Homebridge mit root laufen lassen.

 curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -  
 apt-get install -y nodejs  
 apt-get install libavahi-compat-libdnssd-dev  
 npm install -g --unsafe-perm homebridge  

Damit habt Node.js, Avahi und Homebridge installiert. Das Konfigurationsfile liegt nun unter /root/.homebridge/config.json bzw. muss dort angepasst werden.

Nun kümmern wir uns um den Autostart.

 vi /etc/default/homebridge  
 # Defaults / Configuration options for homebridge  
 # The following settings tells homebridge where to find the config.json file and where to persist the data (i.e. pairing and others)  
 HOMEBRIDGE_OPTS=-U /root/.homebridge  
 # If you uncomment the following line, homebridge will log more  
 # You can display this via systemd's journalctl: journalctl -f -u homebridge  
 # DEBUG=*  

 vi /etc/systemd/system/homebridge.service  
 [Unit]  
 Description=Node.js HomeKit Server  
 After=syslog.target network-online.target  
 [Service]  
 Type=simple  
 User=root  
 EnvironmentFile=/etc/default/homebridge  
 # Adapt this to your specific setup (could be /usr/bin/homebridge)  
 # See comments below for more information  
 ExecStart=/usr/bin/homebridge $HOMEBRIDGE_OPTS  
 Restart=on-failure  
 RestartSec=10  
 KillMode=process  
 [Install]  
 WantedBy=multi-user.target  

Damit konfiguriert ihr den Systemd Service für Homebridge
Homebridge läuft danach mit Root Rechten und die Konfiguration wird unter /root/.homebridge/ abgelegt. Den Eintrage EnvironmentFile sollte ihr gleich der Ausgabe folgendes Befehles anpassen:

 which homebridge  

Damit wird der Autostart gesetzt:

 systemctl daemon-reload  
 systemctl enable homebridge  

Nun können wir Plugins installieren. Ich werde auf die von mir installierten kurz eingehen und meine Konfig hier einstellen. Man muss sich penibelst an die Syntax des Json Files halten, ansonsten wird Homebridge nicht laufen. Sehr hilfreich ist dabei der JSON Validator.

Harmony Hub


Ihr sollten nicht die neueste Version des Plugins verwendet, denn dort kommt es regelmäßig zu abstürzen.

 npm install -g homebridge-harmonyhub@0.1.1  

Damit wird die stabilsten Version installiert, die bei mir auch nach Tagen nicht abstürzt.

Solltet ihr bereits die aktuellste Version 0.2.0 installiert haben dann könnte ihr dieses natürlich wieder rückgängig machen:

 npm uninstall -g homebridge-harmonyhub  
 npm install -g homebridge-harmonyhub@0.1.1  


Der Harmony Hub wird unter platforms eingetragen:

 {  
         "platform": "HarmonyHub",  
         "name": "Harmony Hub"  
 }  

Mehr muss nicht gemacht werden.

Netatmo Wetterstation


 npm install -g homebridge-netatmo  

Damit habt ihr dann auch schon das Plugin installiert.

 {  
         "platform": "netatmo",  
         "name": "netatmo platform",  
         "ttl": 5,  
         "auth": {  
             "client_id": "eureid",  
             "client_secret": "euersecret",  
             "username": "username",  
             "password": "password"  
 }  

Die Client ID und das Client Secret erhaltet ihr bei Netatmo. Dort müsst ihr euch mit euren Daten einloggen und eine neue App anlegen. Username und Password sind eure normalen Zugangsdaten.

IFTTT


 npm install -g homebridge-ifttt  

 {  
             "platform": "IFTTT",  
             "name": "IFTTT",  
             "makerkey": "euermakerkey",  
             "accessories": [{  
                 "name": "Name",  
                 "buttons": [{  
                     "caption": "Name des Buttons",  
                     "triggerOn": "triggername",  
                     "triggerOff": "triggername2"  
                 }]  
             }]  
         }  

Euren Makerkey erhaltet ihr wenn ihr euch bei den IFTTT Maker Webhooks anmeldet. Caption bezeichnet den Schalternamen, wie er in Homemkit angezeigt wird. Wenn ihr nur einen trigger verwendet, habt ihr einen Schalter der kurz an geht und wieder auf aus springt.
Ihr erzeugt ein neues Applet mit dem If Maker Webhook und euerem Trigger-Name. Damit steuert ihr dann das Applet an.

FRITZ!Box


 npm install -g homebridge-fritz  

Das sollte bereits bekannt sein

 {  
         "platform": "Fritz!Box",  
         "name": "My FritzBox",  
         "username": "euerusername",  
         "password": "euerpasswort",  
         "url": "http://fritz.box",  
         "interval": 60,  
         "options": {  
             "strictSSL": false  
         }  
     }  

Hier muss nur noch der Username und das Passwort angepasst werden. Danach habt ihr Zugriff auf eure Dect 200 Steckdosen.

Synology Diskstation


 npm install -g homebridge-synology  

 {  
         "accessory": "Synology",  
         "name": "Diskstation",  
         "ip": "eureipderdiskstation",  
         "mac": "euremac",  
         "port": "5000",  
         "secure": false,  
         "account": "username",  
         "password": "password",  
         "version": 6,  
         "timeout": 5000,  
         "disabled": []  
     }  

Dieses Plugin wird als Accessorie eingebunden und ermöglich es die Diskstastion per Wake On Lan zu starten, die Temperatur auszulesen und den aktuellen Status zu sehen,

Amazon Dash Button

Es gibt zwei Varianten um die Dash Buttons in Homebridge einzubeinden. Mit homebridge-amazondash hatte ich weniger Erfolg, da jedes Mal zwei Tastendrucke erkannt wurden. Daher verwende ich homebridge-dash. Ein weiterer Vorteil ist das hier die Buttons als Schalter eingebunden werden.

Die Button richtet ihr erst mal so ein, wie in der Anleitung beschrieben. Ihr fügt jedoch kein Produkt hinzu, sondern schließt die App, bzw. ich habe sie gekilled.

Damit wir den Button danach erst mal finden, müssen wir node-dash-button installieren:

 apt-get install libpcap-dev  
 npm install node-dash-button  

Libcap muss als Root laufen, daher läuft auch mein Homebridge als Root.
Nun können wir uns auf der Suche nach der MAC begeben:

 node node_modules/node-dash-button/bin/findbutton  

Drückt nun euren Dash button und ihr sollten die MAC des Buttons finden. Diese tragt ihr in die config ein

 {  
           "accessory": "Dash",  
           "name": "Dash 1",  
           "protocol": "udp",  
               "mac": "11:22:33:44:55:66"  
         },  
           {  
           "accessory": "Dash",  
           "name": "Dash 2",  
           "protocol": "udp",  
               "mac": "11:22:33:44:55:88"  
         },  
           {  
           "accessory": "Dash",  
           "name": "Dash 3",  
           "protocol": "udp",  
               "mac": "11:22:33:44:55:77"  
         }  


Meine Konfiguration


 {  
      "bridge": {  
           "name": "Homebridge",  
           "username": "CC:22:3D:E3:CE:31",  
           "port": 51826,  
           "pin": "031-45-154"  
      },  
      "accessories": [{  
                "accessory": "Synology",  
                "name": "Diskstation",  
                "ip": "x.x.x.x",  
                "mac": "11:22:33:44:55:66",  
                "port": "5000",  
                "secure": false,  
                "account": "user",  
                "password": "password",  
                "version": 6,  
                "timeout": 5000,  
                "disabled": []  
           },  
           {  
                "accessory": "Dash",  
                "name": "Dash 1",  
                "protocol": "udp",  
                "mac": "11:22:33:44:55:66"  
           },  
           {  
                "accessory": "Dash",  
                "name": "Dash 2",  
                "protocol": "udp",  
                "mac": "11:22:33:44:55:66"  
           },  
           {  
                "accessory": "Dash",  
                "name": "Dash 3",  
                "protocol": "udp",  
                "mac": "11:22:33:44:55:66"  
           }  
      ],  
      "platforms": [{  
                "platform": "HarmonyHub",  
                "name": "Harmony Hub"  
           }, {  
                "platform": "netatmo",  
                "name": "netatmo platform",  
                "ttl": 5,  
                "auth": {  
                     "client_id": "clientid",  
                     "client_secret": "clientsecret",  
                     "username": "username",  
                     "password": "password"  
                }  
           }, {  
                "platform": "Fritz!Box",  
                "name": "My FritzBox",  
                "username": "username",  
                "password": "password",  
                "url": "http://fritz.box",  
                "interval": 60,  
                "options": {  
                     "strictSSL": false  
                }  
           },  
           {  
                "platform": "IFTTT",  
                "name": "IFTTT",  
                "makerkey": "makerkey",  
                "accessories": [{  
                     "name": "Name",  
                     "buttons": [{  
                          "caption": "Button Name",  
                          "triggerOn": "trigger on",  
                          "triggerOff": "trigger off"  
                     }]  
                }]  
           }  
      ]  
 }  


Einbinden in iOS


Ihr startet die iOS Home App und fügt über + ein Gerät hinzu. Homebridge wird in eurem Netzwerk automatisch erkannt und die darüber angebundene Hardware. Den Code den ihr eingeben müsst, findet ihr in der config.json. Vergesst aber nicht den Dienst zu starten.

 systemctl start homebridge  

Tips und Tricks

  1. Erstellt euch immer eine Kopie eurer config.json bevor ihr etwas ändert
  2. Installiert möglichst immer nur ein Plugin gleichzeitig und testet es dann. Das erleichtert die Fehlersuche ungemein.
  3. Mittels homebridge -D lasst ihr Homebridge im Debugmodus laufen und seht alle Meldungen.
  4. Es kann auch helfen die Daten von Homebridge zurückzusetzen. Dazu entkoppelt ihr Homebridge aus iOS, stopt den Dienst und löscht folgende Verzeichnisse. Anschließend könnt ihr die Homebridge wieder neu koppeln. Ihr müsst zwar die Geräte neu verteilen, aber das geht relativ fix.
 rm -rf /root/.homebridge/accessories/  
 rm -rf /root/.homebridge/persist/  



*=Affiliate Link

Backups des Raspberry Pi 3 erstellen über das Netzwerk

Wenn man seinen Raspberry Pi durchkonfiguriert hat, möchte man ja auch mal ein Backup erstellen. Eine Möglichkeit ist es die SD-Karte zu nehmen und davon am PC ein Image zu schreiben. Es ist aber auch möglich, ein Backup auf ein Netzlaufwerk abzulegen. Weiters dazu gibt es dort.

Sehr gut eignet sich dazu natürlich ein NAS-System. Ich selber besitze eine DS412+ von Synology* und schreibe nun bei Bedarf meine Backups auf das NAS.

Auf der Synology muss der NFS Dienst aktiviert werden:


Zusätzlich muss für einen Gemeinsamen Ordner die NFS Berechtigung gesetzt werden.


Nun kann die Backupsoftware, weitere Dienste und der Backupordner installiert, bzw. erstellt werden. Wir erzeugen einen Ordner /backup in dem später das NFS-Verzeichnis der Synology gemountet wird.

 curl -s -L -O https://www.linux-tips-and-tricks.de/raspiBackupInstall.sh && sudo bash raspiBackupInstall.sh  
 sudo mkdir /backup  
 sudo apt-get install nfs-common -y  
 sudo systemctl start rpcbind  
 sudo systemctl enable rpcbind  
 sudo systemctl start nfslock  
 sudo systemctl enable nfslock  

Das Konfigurationsfile liegt unter /usr/local/etc/raspiBackup.conf. Hier sollte der DEFAULT_BACKUPPATH überprüft werden und DEFAULT_STOPSERVICES und DEFAULT_STARTSERVICES angepasst werden.

 # path to store the backupfile  
 DEFAULT_BACKUPPATH="/backup"  
 # how many backups to keep  
 DEFAULT_KEEPBACKUPS="5"  
 # type of backup: dd, tar or rsync  
 DEFAULT_BACKUPTYPE="dd"  
 # zip tar or dd backup (0 = false, 1 = true)  
 DEFAULT_ZIP_BACKUP="0"  
 # commands to stop services before backup separated by &  
 DEFAULT_STOPSERVICES="systemctl stop grafana-server && systemctl stop telegraf && systemctl stop influxdb && systemctl stop unifi && systemctl stop homebridge"  
 # commands to start services after backup separated by &  
 DEFAULT_STARTSERVICES="systemctl start unifi && systemctl start influxdb && systemctl start telegraf && systemctl start grafana-server && systemctl start homebridge"  

So sieht es bei mir aus. Die Services solltet ihr natürlich an eure Gegebenheiten anpassen.

 sudo mount 10.10.66.100:/volume1/daten/backup/pi /backup/  
 sudo raspiBackup.sh -m detailed  
 sudo umount /backup  

Damit mountet ihr euer Verzeichnis, startet ein Backup und unmountet das Verzeichnis wieder. Bei mir dauert es für die 32GB knapp eine Stunde.
Solltet ihr das Unmounten vergessen und eure NAS herunterfahren, wird euer Pi es euch mit einer erhöhten Last danken ;-)

Natürlich könnt ihr auch das Backup automatisieren und einen Cronjob erstellen. Meine NAS läuft aber nicht immer, also mache ich es nach Bedarf.

 sudo crontab -e  
 #am Ende einfügen  
 00 23 * * 1 /usr/local/bin/raspiBackup.sh  

Damit würde jeden Montag um 23:00 ein Backup erstellt.

*=Affiliate Link

Installation von InfluxDB, Telegraf und Grafana auf dem Raspberry Pi 3

Im Internet bin ich über folgendes schöne Grafana Dashboard gestolpert und wollte es natürlich gleich selbst ausprobieren.

Ich werde hier also beschreiben wie ich
  • InfluxDB, als Datenbank
  • Telegraf als Collector
  • Grafana als Visualisierung 
installiert habe.

1. InfluxDB installieren

Die Daten werden alle in der InfluxDB gesammelt.

 wget https://dl.influxdata.com/influxdb/releases/influxdb_1.2.2_armhf.deb  
 sudo dpkg -i influxdb_1.2.2_armhf.deb  
 sudo systemctl enable influxdb  
 sudo systemctl start influxdb  

Damit installiert ihr InfluxDB in der Version 1.2.2, aktiviert den automatischen start und startet die Datenbank.

 pi@raspberrypi:/etc/telegraf $ influx  
 Connected to http://localhost:8086 version 1.2.2  
 InfluxDB shell version: 1.2.2  
 > CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES  
 > CREAT DATABASE telegraf  
 > exit  

Damit legen wir einen User admin an und erzeigen die später verwendete Datenbank.

 sudo vi /etc/influxdb/influxdb.conf  
 [http]   
  enabled = true   
  bind-address = ":8086"   
  auth-enabled = true  

Durch diese Anpassung in der influxdb.conf, aktivieren wir die Authentifizierung. Diese drei Parameter unter [http] sollten überprüft und entsprechend angepasst werden.

 sudo systemctl restart influxdb
 influx -username admin -password password  

Nach einem Neustart des Services, ist der Zugang nur noch mittels Username und Passwort möglich.

2. Telegraf installieren

Telegraf  ist der Collector und holt sich alle Daten per SNMP von den Accesspoints. Dazu muss natürlich SNMP und der entsprechende Community String im UniFi Controller konfiguriert werden.

 wget https://dl.influxdata.com/telegraf/releases/telegraf_1.2.1_armhf.deb  
 sudo dpkg -i telegraf_1.2.1_armhf.deb  

Damit ladet ihr euch Telegraf und installiert es anschließend.

 wget https://github.com/WaterByWind/grafana-dashboards/archive/master.zip  
 unzip master.zip  
 sudo cp grafana-dashboards-master/UniFi-UAP/mibs/* /usr/share/snmp/mibs  
 sudo apt-get install snmpd  

Damit Telegraf die Daten auswerten kann, müssen die MIBs installiert werden und snmpd. Die MIBs sind im GitHUB Repository des Dashboards bereits enthalten und müssen nur kopiert werden.

Anschließend muss Telegraf konfiguriert werden.

Hier ist meine gesamte telegraf.conf. Wichtig sind die Abschnitte Input und Output. Alles rot markierte müsst ihr anpassen. Wenn ihr bereits eine Telegraf Instanz nutzt, könnt ihr eure Config um die entsprechenden Daten ergänzen, also den kompletten Input-Abschnitt mindestens.

 # Telegraf Configuration  
 #  
 # Telegraf is entirely plugin driven. All metrics are gathered from the  
 # declared inputs, and sent to the declared outputs.  
 #  
 # Plugins must be declared in here to be active.  
 # To deactivate a plugin, comment out the name and any variables.  
 #  
 # Use 'telegraf -config telegraf.conf -test' to see what metrics a config  
 # file would generate.  
 #  
 # Environment variables can be used anywhere in this config file, simply prepend  
 # them with $. For strings the variable must be within quotes (ie, "$STR_VAR"),  
 # for numbers and booleans they should be plain (ie, $INT_VAR, $BOOL_VAR)  
 # Global tags can be specified here in key="value" format.  
 [global_tags]  
  # dc = "us-east-1" # will tag all metrics with dc=us-east-1  
  # rack = "1a"  
  ## Environment variables can be used as tags, and throughout the config file  
  # user = "$USER"  
 # Configuration for telegraf agent  
 [agent]  
  ## Default data collection interval for all inputs  
  interval = "10s"  
  ## Rounds collection interval to 'interval'  
  ## ie, if interval="10s" then always collect on :00, :10, :20, etc.  
  round_interval = true  
  ## Telegraf will send metrics to outputs in batches of at most  
  ## metric_batch_size metrics.  
  ## This controls the size of writes that Telegraf sends to output plugins.  
  metric_batch_size = 1000  
  ## For failed writes, telegraf will cache metric_buffer_limit metrics for each  
  ## output, and will flush this buffer on a successful write. Oldest metrics  
  ## are dropped first when this buffer fills.  
  ## This buffer only fills when writes fail to output plugin(s).  
  metric_buffer_limit = 10000  
  ## Collection jitter is used to jitter the collection by a random amount.  
  ## Each plugin will sleep for a random time within jitter before collecting.  
  ## This can be used to avoid many plugins querying things like sysfs at the  
  ## same time, which can have a measurable effect on the system.  
  collection_jitter = "0s"  
  ## Default flushing interval for all outputs. You shouldn't set this below  
  ## interval. Maximum flush_interval will be flush_interval + flush_jitter  
  flush_interval = "10s"  
  ## Jitter the flush interval by a random amount. This is primarily to avoid  
  ## large write spikes for users running a large number of telegraf instances.  
  ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s  
  flush_jitter = "0s"  
  ## By default, precision will be set to the same timestamp order as the  
  ## collection interval, with the maximum being 1s.  
  ## Precision will NOT be used for service inputs, such as logparser and statsd.  
  ## Valid values are "ns", "us" (or "µs"), "ms", "s".  
  precision = ""  
  ## Logging configuration:  
  ## Run telegraf with debug log messages.  
  # debug = true  
  ## Run telegraf in quiet mode (error log messages only).  
  quiet = false  
  ## Specify the log file name. The empty string means to log to stderr.  
  logfile = "/var/log/telegraf/telegraf.log"  
  ## Override default hostname, if empty use os.Hostname()  
  hostname = ""  
  ## If set to true, do no set the "host" tag in the telegraf agent.  
  omit_hostname = false  
 ###############################################################################  
 #              OUTPUT PLUGINS                  #  
 ###############################################################################  
 # Configuration for influxdb server to send metrics to  
 [[outputs.influxdb]]  
  ## The full HTTP or UDP endpoint URL for your InfluxDB instance.  
  ## Multiple urls can be specified as part of the same cluster,  
  ## this means that only ONE of the urls will be written to each interval.  
  urls = ["http://localhost:8086"] # required  
  ## The target database for metrics (telegraf will create it if not exists).  
  database = "telegraf" # required  
  ## Retention policy to write to. Empty string writes to the default rp.  
  retention_policy = ""  
  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all"  
  write_consistency = "any"  
  ## Write timeout (for the InfluxDB client), formatted as a string.  
  ## If not provided, will default to 5s. 0s means no timeout (not recommended).  
  timeout = "5s"  
  username = "admin"  
  password = "password"  
  ## Set the user agent for HTTP POSTs (can be useful for log differentiation)  
  user_agent = "telegraf"  
 ###############################################################################  
 #              PROCESSOR PLUGINS                #  
 ###############################################################################  
 # # Print all metrics that pass through this filter.  
 # [[processors.printer]]  
 ###############################################################################  
 #              AGGREGATOR PLUGINS                #  
 ###############################################################################  
 # # Keep the aggregate min/max of each metric passing through.  
 # [[aggregators.minmax]]  
 #  ## General Aggregator Arguments:  
 #  ## The period on which to flush & clear the aggregator.  
 #  period = "30s"  
 #  ## If true, the original metric will be dropped by the  
 #  ## aggregator and will not get sent to the output plugins.  
 #  drop_original = false  
 # Telegraf Configuration for UniFi UAP monitoring via SNMP  
 # These input configurations are required for use with the dashboard  
 # Edit the list of monitored hosts ("agents")  
 #  and SNMP community string ("community") as appropriate.  
 ###############################################################################  
 #              INPUT PLUGINS                  #  
 ###############################################################################  
 ##  
 ## Retrieves details via SNMP from remote agents  
 ##  
 ##  
 ## UniFi APs (Gen 2/Gen 3)  
 ##  
  [[inputs.snmp]]  
   # List of agents to poll  
   agents = [ "ip-ap-1", "ip-ap-2" ]  
   # Polling interval  
   interval = "60s"  
   # Timeout for each SNMP query.  
   timeout = "10s"  
   # Number of retries to attempt within timeout.  
   retries = 3  
   # SNMP version, UAP only supports v1  
   version = 1  
   # SNMP community string.  
   community = "public"  
   # The GETBULK max-repetitions parameter  
   max_repetitions = 10  
   # Measurement name  
   name = "snmp.UAP"  
   ##  
   ## System Details  
   ##  
   # System name (hostname)  
   [[inputs.snmp.field]]  
    is_tag = true  
    name = "sysName"  
    oid = "RFC1213-MIB::sysName.0"  
   # System vendor OID  
   [[inputs.snmp.field]]  
    name = "sysObjectID"  
    oid = "RFC1213-MIB::sysObjectID.0"  
   # System description  
   [[inputs.snmp.field]]  
    name = "sysDescr"  
    oid = "RFC1213-MIB::sysDescr.0"  
   # System contact  
   [[inputs.snmp.field]]  
    name = "sysContact"  
    oid = "RFC1213-MIB::sysContact.0"  
   # System location  
   [[inputs.snmp.field]]  
    name = "sysLocation"  
    oid = "RFC1213-MIB::sysLocation.0"  
   # System uptime  
   [[inputs.snmp.field]]  
    name = "sysUpTime"  
    oid = "RFC1213-MIB::sysUpTime.0"  
   # UAP model  
   [[inputs.snmp.field]]  
    name = "unifiApSystemModel"  
    oid = "UBNT-UniFi-MIB::unifiApSystemModel"  
   # UAP firmware version  
   [[inputs.snmp.field]]  
    name = "unifiApSystemVersion"  
    oid = "UBNT-UniFi-MIB::unifiApSystemVersion"  
   ##  
   ## Host Resources  
   ##  
   # Total memory  
   [[inputs.snmp.field]]  
    name = "memTotal"  
    oid = "FROGFOOT-RESOURCES-MIB::memTotal.0"  
   # Free memory  
   [[inputs.snmp.field]]  
    name = "memFree"  
    oid = "FROGFOOT-RESOURCES-MIB::memFree.0"  
   # Buffer memory  
   [[inputs.snmp.field]]  
    name = "memBuffer"  
    oid = "FROGFOOT-RESOURCES-MIB::memBuffer.0"  
   # Cache memory  
   [[inputs.snmp.field]]  
    name = "memCache"  
    oid = "FROGFOOT-RESOURCES-MIB::memCache.0"  
   # Per-interface traffic, errors, drops  
   [[inputs.snmp.table]]  
    oid = "IF-MIB::ifTable"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "IF-MIB::ifDescr"  
   ##  
   ## Interface Details & Metrics  
   ##  
   # Wireless interfaces  
   [[inputs.snmp.table]]  
    oid = "UBNT-UniFi-MIB::unifiRadioTable"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "UBNT-UniFi-MIB::unifiRadioName"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "UBNT-UniFi-MIB::unifiRadioRadio"  
   # BSS instances  
   [[inputs.snmp.table]]  
    oid = "UBNT-UniFi-MIB::unifiVapTable"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "UBNT-UniFi-MIB::unifiVapName"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "UBNT-UniFi-MIB::unifiVapRadio"  
   # Ethernet interfaces  
   [[inputs.snmp.table]]  
    oid = "UBNT-UniFi-MIB::unifiIfTable"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "UBNT-UniFi-MIB::unifiIfName"  
   ##  
   ## System Performance  
   ##  
   # System load averages  
   [[inputs.snmp.table]]  
    oid = "FROGFOOT-RESOURCES-MIB::loadTable"  
    [[inputs.snmp.table.field]]  
     is_tag = true  
     oid = "FROGFOOT-RESOURCES-MIB::loadDescr"  
   ##  
   ## SNMP metrics  
   ##  
   # Number of SNMP messages received  
   [[inputs.snmp.field]]  
    name = "snmpInPkts"  
    oid = "SNMPv2-MIB::snmpInPkts.0"  
   # Number of SNMP Get-Request received  
   [[inputs.snmp.field]]  
    name = "snmpInGetRequests"  
    oid = "SNMPv2-MIB::snmpInGetRequests.0"  
   # Number of SNMP Get-Next received  
   [[inputs.snmp.field]]  
    name = "snmpInGetNexts"  
    oid = "SNMPv2-MIB::snmpInGetNexts.0"  
   # Number of SNMP objects requested  
   [[inputs.snmp.field]]  
    name = "snmpInTotalReqVars"  
    oid = "SNMPv2-MIB::snmpInTotalReqVars.0"  
   # Number of SNMP Get-Response received  
   [[inputs.snmp.field]]  
    name = "snmpInGetResponses"  
    oid = "SNMPv2-MIB::snmpInGetResponses.0"  
   # Number of SNMP messages sent  
   [[inputs.snmp.field]]  
    name = "snmpOutPkts"  
    oid = "SNMPv2-MIB::snmpOutPkts.0"  
   # Number of SNMP Get-Request sent  
   [[inputs.snmp.field]]  
    name = "snmpOutGetRequests"  
    oid = "SNMPv2-MIB::snmpOutGetRequests.0"  
   # Number of SNMP Get-Next sent  
   [[inputs.snmp.field]]  
    name = "snmpOutGetNexts"  
    oid = "SNMPv2-MIB::snmpOutGetNexts.0"  
   # Number of SNMP Get-Response sent  
   [[inputs.snmp.field]]  
    name = "snmpOutGetResponses"  
    oid = "SNMPv2-MIB::snmpOutGetResponses.0"  


Dieser Befehl testet ob die Datenabfrage soweit funktioniert.

 sudo -u telegraf telegraf --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d/ --input-filter snmp -test  

Wenn die Daten auch in die InfluxDB geschrieben werden, seht hier folgende Tabellen:

 pi@raspberrypi:~ $ influx -username admin -password yourpassword  
 Connected to http://localhost:8086 version 1.2.2  
 InfluxDB shell version: 1.2.2  
 > use telegraf  
 Using database telegraf  
 > show measurements  
 name: measurements  
 name  
 ----  
 ifTable  
 loadTable  
 snmp.UAP  
 unifiIfTable  
 unifiRadioTable  
 unifiVapTable  

Ihr könnt damit testen ob die Daten auch in die InfluxDB geschrieben werden.

3. Grafana installieren

Bald haben wir es geschafft, es muss nur noch Grafana installiert und angepasst werden.

wget https://github.com/fg2it/grafana-on-raspberry/releases/download/v4.2.0/grafana_4.2.0_armhf.deb

 wget https://github.com/fg2it/grafana-on-raspberry/releases/download/v4.2.0/grafana_4.2.0_armhf.deb  
 sudo dpkg -i grafana_4.2.0_armhf.deb  
 sudo systemctl enable grafana-server  
 sudo systemctl start grafana-server  

Damit habt ihr Grafana installiert und gestartet.

Ihr erreicht euer Grafana nun über http://<yourip>:3000. Als Login verwendet ihr admin / admin. Anscließend solltet ihr unter http://<yourip>:3000/profile/password euer Passwort ändern. Anschließend müsst ihr noch eure Datenquelle angeben.


Nun könnt ihr das Dashboard importieren und eure Daten betrachten.






Donnerstag, 4. Mai 2017

Installation des Ubiquiti UniFi Controller 5 auf dem Raspberry Pi 3

Ich habe mittlerweile den Großteil meines Netzwerks durch Unifi Hardware ersetzt. Den UniFi Controller wollte ich natürlich auch bei mir im Netz einsetzen und habe ihn auf einem Raspberry Pi 3 installiert.

Vorbereitungen


1. Pi Updaten

 sudo apt-get update && sudo apt-get upgrade -y  

Ich habe erst mal alle bereits installierten Pakete aktualisiert, was man immer mal wieder machen sollte.

2. Pi Firmware updaten

 sudo apt-get update && sudo apt-get upgrade -y
 reboot  

Ein Firmware Upgrade kann auch nicht schaden.

Installation


1. UniFi Repository hinzufügen

 echo 'deb http://www.ubnt.com/downloads/unifi/debian stable ubiquiti' | sudo tee -a /etc/apt/sources.list.d/ubnt.list > /dev/null  
 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv C0A52C50  
 sudo apt-get update  

Wer den aktuellen Stable-Candidate installieren möchte muss das stable in der ersten Zeile durch testing ersetzen.

2. Installation des Controllers

 sudo apt-get install unifi -y  

3. Abschalten der standard MongoDB Instanz

 sudo service mongodb stop  
 sudo service mongodb disable  

Da der Controller eine eigene MongoDB Instanz besitzt, schalten wir die standard Instanz ab.

4. Update Snappy Java Library

 cd /usr/lib/unifi/lib  
 sudo rm snappy-java-1.0.5.jar  
 sudo wget http://central.maven.org/maven2/org/xerial/snappy/snappy-java/1.1.2.6/snappy-java-1.1.2.6.jar  
 sudo ln -s snappy-java-1.1.2.6.jar snappy-java-1.0.5.jar  

Die von Ubiquiti mitgelieferte Version ist von 2013 und kann Probleme verursachen, also wird diese upgedatet.

Update: In neueren Controller Versionen ist dieses bereits enthalten (z.B. 5.5.14)

5. Installation von Oracle Java 8

 sudo apt-get install oracle-java8-jdk -y  
 sudo cp /lib/systemd/system/unifi.service /etc/systemd/system/  
 sudo sed -i '/^\[Service\]$/a Environment=JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt' /etc/systemd/system/unifi.service  

Der Controller installiert OpenJDK 7, was zu Performanceproblemen führen kann.

6. Reboot

 reboot  

Der Controller ist nun fertig installiert und lässt sich über https://<raspberrypi>:8443 aufrufen. Nun könnte ihr mit der Konfiguration anfangen, oder den Controller mit einem vorhandenen Backup betanken.
Ich hatte zuvor den Controller in einem anderen Netzwerk auf einer Synology betrieben und konnte durch einfach zurückspielen des Backups meine Einstellungen übernehmen. Es musste kein Device adoptiert werden.

Optionales

1. Logrotate installieren

 sudo apt-get update && sudo apt-get install logrotate  

Der Speicher des Pis ist begrenzt und damit der Speicher durch Logfiles nicht gefüllt wird, hilft logrotate.

 sudo bash -c 'cat >> /etc/logrotate.d/unifi << EOF  
 /var/log/unifi/*.log {  
   rotate 5  
   daily  
   missingok  
   notifempty  
   compress  
   delaycompress  
   copytruncate  
 }  
 EOF'  

Damit werden täglich die Logfiles komprimiert gesichert und 5 Versionen vorgehalten.