diff --git a/know-how/hacking/_posts/2010-01-05-avm-fritzbox-7270.md b/know-how/hacking/_posts/2010-01-05-avm-fritzbox-7270.md
index 1773625..3ab1192 100644
--- a/know-how/hacking/_posts/2010-01-05-avm-fritzbox-7270.md
+++ b/know-how/hacking/_posts/2010-01-05-avm-fritzbox-7270.md
@@ -2,7 +2,7 @@
title: AVM Fritz!Box 7270
layout: default
created: 2009-12-19 18:40:34 +0100
-changed: 2010-01-05 00:19:18 +0100
+updated: 2010-01-05 00:19:18 +0100
toc: true
tags:
- know-how
diff --git a/know-how/hacking/_posts/2013-09-08-tassimo-barcodes.md b/know-how/hacking/_posts/2013-09-08-tassimo-barcodes.md
new file mode 100644
index 0000000..9062403
--- /dev/null
+++ b/know-how/hacking/_posts/2013-09-08-tassimo-barcodes.md
@@ -0,0 +1,96 @@
+---
+title: TASSIMO Barcodes
+language: de
+layout: default
+created: 2013-09-08 15:43:52 +0200
+updated: 2013-09-08 20:18:52 +0200
+toc: true
+tags:
+ - know-how
+ - hacking
+ - hardware
+ - tassimo
+---
+Im Gegensatz zu anderen Kapselmaschinen, bringen die Kapseln bei Tassimo ihre Zubereitungsanleitung gleich mit:
+In Form eines Barcodes auf der Kapsel.
+
+Weitere Informationen:
+
+*
+*
+* Patent:
+
+
+Kapsel-Codes
+============
+
+
+Die Prüfziffer wird wie beim UPC-Code berechnet:
+
+
+| Kapsel | Menge | dezimal | binär (ohne Prüfziffer) |
+|:----------------------------------|--------:|:--------:|--------------------------:|
+| Service-Disc | | 07879-5 | 0001 1110 1100 0111 |
+| Jacobs Espresso | 60 ml | 06178-0 | 0001 1000 0010 0010 |
+| Jacobs Caffè Crema XL | 215 ml | 29761-5 | 0111 0100 0100 0001 |
+| Jacobs Krönung Verwöhnkanne | | 34419-7 | 1000 0110 0111 0011 |
+| CARTE NOIRE Petit Déjeuner | 215 ml | 29761-5 | 0111 0100 0100 0001 |
+| Milka | | 06665-5 | 0001 1010 0000 1001 |
+| Milch für Milka, Marabou & Freia | | 06182-7 | 0001 1000 0010 0110 |
+| Cadbury | | 06665-5 | 0001 1010 0000 1001 |
+| Milch für Cadbury | | 06182-7 | 0001 1000 0010 0110 |
+| Milch für Latte Macchiato | | 63735-0 | 1111 1000 1111 0111 |
+| TWINING's Earl Grey | | 03351-0 | 0000 1101 0001 0111 |
+| TWINING's Darjeeling | | 03351-0 | 0000 1101 0001 0111 |
+| ICE DISC Espresso | | 06146-9 | 0001 1000 0000 0010 |
+| ICE DISC Cappucino | | 06146-9 | 0001 1000 0000 0010 |
+| ICE DISC Chocolate | | 06146-9 | 0001 1000 0000 0010 |
+| ICE DISC Tea | | 71651-2 | 1 0001 0111 1110 0011 |
+
+
+Programmierung
+==============
+
+
+Die Angaben hier sind aus der Patentschrift übernommen. Wie die in den Barcodes oben kodiert wurden, ist noch nicht ganz klar.
+
+
+| Bits | Funktion | Werte |
+|:-----:|:-----------|:-------|
+| 0 & 1 | Wassertemperatur | 00 = kalt |
+| || 01 = warm |
+| || 10 = 83 °C |
+| || 11 = 93 °C |
+| 2 & 3 | Kapselfüllung | 00 = schnell Füllen, mit Ziehen |
+| || 01 = schnell Füllen, ohne Ziehen |
+| || 10 = langsam Füllen, mit Ziehen |
+| || 11 = langsam Füllen, ohne Ziehen |
+| 4 & 5 & 6 & 7 | Getränkemenge | 0000 = 50 ml |
+| || 0001 = 60 ml |
+| || 0010 = 70 ml |
+| || 0011 = 80 ml |
+| || 0100 = 90 ml |
+| || 0101 = 100 ml |
+| || 0110 = 110 ml |
+| || 0111 = 130 ml |
+| || 1000 = 150 ml |
+| || 1001 = 170 ml |
+| || 1010 = 190 ml |
+| || 1011 = 210 ml |
+| || 1100 = 230 ml |
+| || 1101 = 250 ml |
+| || 1110 = 275 ml |
+| || 1111 = 300 ml |
+| 8 & 9 & 10 | Flussrate | 000 = 30 % |
+| || 001 = 40 % |
+| || 010 = 50 % |
+| || 011 = 60 % |
+| || 100 = 70 % |
+| || 101 = 80 % |
+| || 110 = 90 % |
+| || 111 = 100 % |
+| 11 & 12 | Kapsel-Leerung | 00 = langsamer Fluss / kurze Dauer |
+| || 01 = langsamer Fluss / lange Dauer |
+| || 10 = schneller Fluss / kurze Dauer |
+| || 11 = schneller Fluss / lange Dauer |
+
diff --git a/know-how/software/_posts/2009-10-08-gemeinschaft.md b/know-how/software/_posts/2009-10-08-gemeinschaft.md
new file mode 100644
index 0000000..3a26a7c
--- /dev/null
+++ b/know-how/software/_posts/2009-10-08-gemeinschaft.md
@@ -0,0 +1,307 @@
+---
+title: Gemeinschaft Asterisk PBX
+language: de
+layout: default
+created: 2009-10-08 01:35:01 +0200
+updated: 2009-10-08 20:54:42 +0200
+toc: true
+tags:
+ - know-how
+ - software
+ - asterisk
+ - telephony
+ - gemeinschaft
+---
+* [kempgen.net](http://www.kempgen.net/gemeinschaft/gemeinschaft-installation-trunk.html) --- Anleitung zur manuellen Installation
+ * in der `sounds-wav-to-alaw.sh` muss beim `sox`-Befehl der Parameter **`-w`** in **`-2`** geändert werden
+* [belug.de](http://www.belug.de/hilfe/howtos/fcpci/) --- Kompilieren des fcpci-Moduls
+ * [kerneltrap.org](http://kerneltrap.org/mailarchive/linux-netdev/2009/6/7/5890033) --- `capi_ctr_reseted()` heißt jetzt `capi_ctr_down()` (muss geändert werden!)
+
+
+Allgemeine Bedienung
+====================
+
+Benutzer an Telefon anmelden
+----------------------------
+
+Bei den Provisioning-fähigen Telefonen:
+
+* Hörer abheben
+* `*0` eintippen
+* nach Aufforderung Kennwort eintippen (bei uns üblicherweise `1234`)
+* Telefon evtl. rebooten
+
+
+Anrufergruppe beitreten
+-----------------------
+
+Damit das Telefon richtig klingelt, folgenderweise der Anrufergruppe **100** beitreten:
+
+* Hörer abheben
+* `*5` eintippen (bei uns die `100`)
+* auflegen
+
+
+Rauswählen ohne 0
+=================
+
+In der MySQL-Datenbank `asterisk` in der Tabelle `gates` sind die Wählstrings hinterlegt. Standard (und nicht über GUI
+änderbar) ist folgender:
+
+ mISDN/g:{gateway}/{number:1}
+
+d.h., von der Rufnummer wird immer die erste Stelle abgeschnitten. In den neueren Versionen werden aber generell alle
+nicht intern vorhandenen Rufnummern an das ausgehende Routing übergeben. Somit kann man durch eine Änderung in der
+Datenbank den Wählstring auf
+
+ mISDN/g:{gateway}/{number}
+
+ändern und hat dann den gewünschten Effekt. [Google Groups Thread](http://groups.google.de/group/gemeinschaft-users/browse_thread/thread/2ceb4e5afdd50375)
+
+
+Anruferidentifizierung
+======================
+
+Vorgesehen ist, dass dies auf dem Telefon passiert. Daher gibt es momentan keine Funktionalität in dieser Richtung,
+die direkt im Asterisk den Anrufernamen aus einer Tabelle sucht.
+
+Da wir mit Queues arbeiten, muss dieser Aufruf vor dem Weiterleiten des ankommenden Anrufs in den Queue passieren.
+Ein geeigneter Ort ist der `to_queue:`-Abschnitt in der `e-internal.ael` - direkt über dem `Queue()`-Aufruf:
+[Google Groups Thread](http://groups.google.de/group/gemeinschaft-users/browse_thread/thread/cf4683c6a9081ae2)
+
+~~~
+ else {
+ Set(ring_instead_of_moh=);
+ Progress(); // SIP: "183 Session Progress" with early media
+ }
+ // Die folgende Zeile ist neu:
+ AGI(/opt/gemeinschaft/dialplan-scripts/in-get-callerid.agi,${CALLERID(num)});
+ Set(queue_entertime=${EPOCH});
+ Queue(${EXTEN},${ring_instead_of_moh},,,${queuetimeout});
+ Set(queue_waittime=$[${EPOCH}-${queue_entertime}]);
+ Verbose(1,### Tried to enter queue ${EXTEN}\, result: ${QUEUESTATUS}\, waittime: ${queue_waittime});
+~~~
+
+Das Script `in-get-callerid.agi` sieht dann in etwa so aus:
+
+{% highlight php %}
+#!/usr/bin/php -q
+
+{% endhighlight %}
+
+Wichtig ist noch, dass das AGI-Script ausführbar (`chmod a+x in-get-callerid.agi`) sein und die magische erste Zeile
+haben muss.
+
+
+Konferenzräume von außen
+========================
+
+In der Grundkonfiguration gibt es nur dynamische Konferenzräume, die man mittels 88 *+ Raumnummer*
+anlegen kann. Diese sind allerdings dann nicht von außen erreichbar. Folgenderweise kann man einen Raum von außen
+erreichbar machen: [Google Groups Thread](http://groups.google.de/group/gemeinschaft-users/browse_thread/thread/d79b8b969ae80ef9)
+
+In der `meetme.conf` einen neuen statischen Konferenzraum (hier: Nummer 888) anlegen:
+
+ [rooms]
+ conf => 888
+
+In der `e-internal.ael` direkt im Kontext `to-internal-users` folgenden Eintrag machen:
+
+~~~
+ //----------------------------------------------------------
+ // Direct to conference
+ //----------------------------------------------------------
+ 20888 => {
+ Answer();
+ System(wget 'http://192.168.1.245/gemeinschaft/prov/call-init.php?user=ah&to=21888');
+ Playback(silence/2);
+ MeetMe(888, cM);
+ }
+
+ 21888 => {
+ Answer();
+ MeetMe(888, cM);
+ }
+~~~
+
+Dadurch werden Anrufe auf der 21888 direkt in den Konferenzraum 888 geschaltet. Anrufe auf der 20888 lassen das Telefon
+vom Benutzer `ah` den Konferenzraum anrufen und schicken den Anrufer danach erst in den Raum. Somit muss man nicht in
+einem stillen Raum auf die Teilnehmer warten.
+
+
+Aussetzer beim Klingeln der Telefone
+====================================
+
+Die Telefone haben nach ca. 10 Sekunden plötzlich für ca. 2 Sekunden aufgehört zu klingeln. In diesen 2 Sekunden kann
+man den Anruf auch nicht annehmen. [Google Groups Thread](http://groups.google.de/group/gemeinschaft-users/browse_thread/thread/a02d0cb376a77953)
+
+Ursache ist die Einstellung *Klingelzeit pro Agent* des Queues. Diese ist per default auf 10 Sekunden eingestellt,
+sollte allerdings bei der Einstellung *Alle klingeln gleichzeitig* nicht greifen. Dennoch mach die Anlage nach den
+10 Sekunden eine kurze Pause. Erhöht man den Wert auf z.B. 60 Sekunden, sollte die Pause nicht mehr auftreten.
+
+
+Status-Monitor
+==============
+
+Es gibt 2 Status-Monitore:
+
+*
+*
+
+Der erstere fragt Asterisk alle paar Sekunden über das Manager-Interface ab und erzeugt somit pro Betrachter mehr
+Last. Der zweitere benutzt (via AJAX) den ExtStateDaemon, welcher wie folgt aktiviert werden muss:
+
+
+Aktivieren des ExtStateD
+------------------------
+
+1. Kopieren des init-Scripts nach `/etc/init.d`:
+
+ cp /usr/src/gemeinschaft/etc/init.d/gs-extstated /etc/init.d/
+
+1. Einrichten des automatischen Starts:
+
+ update-rc.d gs-extstated defaults 90 10
+
+1. Starten des Daemons
+
+ /etc/init.d/gs-extstated start
+
+[Google Groups Thread](http://groups.google.com/group/gemeinschaft-users/browse_thread/thread/58af4e988e64cae4?hide_quotes=no#msg_1a966420d40bb2ee)
+
+
+Anrufbeantworter-Scripting
+==========================
+
+`/opt/gemeinschaft/scripts/gs-vm-audio-set`:
+
+{% highlight php %}
+#!/usr/bin/php -q
+ */
+
+define( 'GS_VALID', true ); /// this is a parent file
+define( 'GS_VM_AUDIO_DIR', '/opt/gemeinschaft/vm-rec' ); // path to VM recordings
+define( 'GS_VM_AUDIO_FILEFORMAT', '%1$s-%2$s.alaw' ); // %1$s = extension, %2$s = external|internal
+define( 'GS_VM_AUDIO_SOURCE_DIR', '/ssl' ); // source dir for (will be appended to GS_VM_AUDIO_DIR)
+
+require_once( dirName(__FILE__) .'/../inc/conf.php' );
+include_once( GS_DIR .'lib/getopt.php' );
+include_once( GS_DIR .'inc/gs-lib.php' );
+
+
+/***********************************************************
+* the shell parameters
+***********************************************************/
+$usage = 'Usage: '. baseName(__FILE__) .' --user= --source=internal|external --file=';
+
+$opts = @getOptsNoMultiples( '',
+ array(
+ 'user=',
+ 'source=',
+ 'file='
+ ),
+ $usage
+);
+if (! isSet( $opts['user'] )
+ || ! isSet( $opts['source'] )
+ || ! isSet( $opts['file'] )
+ ) {
+ gs_script_invalid_usage( $usage );
+}
+
+
+/***********************************************************
+* do stuff
+***********************************************************/
+if (!in_array($opts['source'], array('internal', 'external'))) {
+ gs_script_error( 'Please specify only "external" or "internal" as source!' );
+}
+
+$srcPath = GS_VM_AUDIO_DIR . GS_VM_AUDIO_SOURCE_DIR . '/' . $opts['file'] . '.alaw';
+if (!file_exists($srcPath)) {
+ gs_script_error( 'File "' . $srcPath . '" not found!' );
+}
+$trgPath = GS_VM_AUDIO_DIR . '/' . sprintf(GS_VM_AUDIO_FILEFORMAT, $opts['user'], $opts['source']);
+
+if (file_exists($trgPath)) {
+ echo 'Warning. Target file "' . $trgPath . '" will be overwritten!' . PHP_EOL;
+}
+
+if ( !copy($srcPath, $trgPath) ) {
+ gs_script_error( 'Failed to copy "' . $srcPath . '" to "' . $trgPath . '"!' );
+}
+
+echo 'Set VM announcement of user ' . $opts['user'] . ' for ' . $opts['source'] . ' calls to "' . $opts['file'] . '".' . PHP_EOL;
+
+?>
+{% endhighlight %}
+
+
+`/opt/gemeinschaft/sbin/do-event`:
+
+{% highlight bash %}
+#!/bin/sh
+
+GS_DIR=/opt/gemeinschaft/scripts
+GS_USER=99
+GS_QUEUE=100
+GS_SOURCE=external
+LOGFILE=/var/log/gemeinschaft/do-event.log
+
+case "$1" in
+ mittag)
+ $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=mittag 2>&1 >>$LOGFILE
+ $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=std 2>&1 >>$LOGFILE
+ ;;
+ momeeting)
+ $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=momeeting 2>&1 >>$LOGFILE
+ $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=std 2>&1 >>$LOGFILE
+ ;;
+ off)
+ $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=no 2>&1 >>$LOGFILE
+ $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=default 2>&1 >>$LOGFILE
+ ;;
+ *)
+ echo "Usage: $0 {mittag|momeeting|off}"
+ exit 1
+ ;;
+esac
+
+exit 0
+{% endhighlight %}
+
+
+**crontab**:
+
+~~~
+MAILTO=mab@intranet.silversolutions.de
+#m h dom mon dow command
+00 10 * * 1 /opt/gemeinschaft/sbin/do-event momeeting
+00 11 * * 1 /opt/gemeinschaft/sbin/do-event off
+00 13 * * 1-5 /opt/gemeinschaft/sbin/do-event mittag
+00 14 * * 1-5 /opt/gemeinschaft/sbin/do-event off
+~~~
+
+
+*[GUI]: Graphical User Interface
+*[AGI]: Asterisk Gateway Interface
+*[AJAX]: Asynchronous Javascript and XML