Mein Raspberry Pi spricht jetzt Telegram – er ist nun ein Bot! (Teil 1)

Die Idee hinter dem Projekt ist eine Alarmierung aufgrund eine Schaltkontaktes über eine gängige Messanger App umzusetzen. Relativ schnell bin ich auf Telegram und die Telegram Bot Api gestoßen. Über die Bot Api ist es möglich per http Calls Messages zu senden und zu empfangen. Also ging es nach ein paar Tests im Browser ans Werk.

Als erstes wird über den Telegram „BotFather“ ein Bot eingerichtet. Dazu in Telegram den Chat mit dem  „BotFather“ mit /newbot beginnen und den Anweisungen des BotFather folgen. Nach erfolgreichem Anlegen, es muss nur der Bot Name und der Bot Username angegeben werden, bekommt man vom Botfather einen Token für die HTTP API in dieser Form: 123456789:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Nun kann man den Bot benutzen. Eine schnelle und einfache Möglichkeit ist es, den Bot im Browser (nicht IE) über

https://api.telegram.org/bot123456789:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getMe

aufzurufen.

Als Ergebnis bekommt man ein JSON zurück;

{"ok":true,"result":{"id":eineNummer,"first_name":"Hier erscheint der Botname","username":"und hier der bot username"}}

Die Kommunikation mit dem Bot wird anhand der chat_id eindeutig identifiziert. Das bedeutet das der Bot nur dann mit einem User kommunizieren kann wenn dieser dem Bot eine initiale Nachricht schickt und der Bot damit die eindeutige chat_id auslesen kann. Also schicken wir nun erstmal ein einfaches “Hallo Bot!” – über die Telegram App – an den Bot. Anschließend können wir über
https://api.telegram.org/bot123456789:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getUpdates
die Nachricht an den Bot, über den Browser, abrufen. Das Ergebnis sieht dann in etwa so aus:

{"ok":true,"result":[{"update_id":697462298,
     "message":
             {"message_id":123,"from":{"id":123456,"first_name":"Dein","last_name":"Name","username":"DeinUserName"},
     "chat":{"id":123456,"first_name":"Dein","last_name":"Name","username":"DeinUserName","type":"private"},
"date":1478552111,"text":"Hallo Bot!"}}]}

Nun haben wir die ID damit der Bot mit uns “sprechen” kann. Mit dieser chat_id kann man nun per HTTP Request eine Nachricht verschicken:

https://api.telegram.org/bot123456789:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/sendMessage?chat_id=123456&text=Hallo User

Im zweiten Teil beschreibe ich dann wie ich das Ganze in php umgesetzt habe und über den Bot GPIO’s schalte.

Simple way to control Raspberry GPIO and Omxplayer with Javascript and php

image

I was looking for an easy way to control the RaspberryPi via a web based user interface. As I’m not familar whith Python I wanted to implement this via php an Javascript/jQuery.

I also wanted to write a php script that schould be able to be reused for other projects.

After some testing and smashing my head to some walls a lot of time I developed this, in my eys, simple solution.

So what’s needed on the RaspberryPi is:

The Scripts

PHP: phprunner.php

The php is build to run as a webservice that consumes a simple JSON via GET.

   1: <?php

   2: $sProject  =  $_GET['project'];

   3: $sCommand  =  $_GET['command'];

   4: $sValue    =  $_GET['value'];

   5:  

   6: switch ($sProject){

   7:     case "PiStarShip":

   8:         switch ($sCommand){

   9:             case "play":

  10:                 exec("omxplayer $sValue",$response);

  11:                 $result  =  array(status=>"playing",value=>$response);

  12:                 break;

  13:             case "stop":

  14:                 exec("killall omxplayer & killall omxplayer.bin &",$response);

  15:                 $result  =  array(status=>"stopped",value=>$response);

  16:                 break;

  17:             case "GPIOOut":

  18:                 $arrValue    = split(",",$sValue);

  19:                 exec("gpio -g mode $arrValue[0] out");

  20:                 exec("gpio -g write $arrValue[0] $arrValue[1]",$response);

  21:                 exec("gpio -g read $arrValue[0]",$response);

  22:                 $result  =  array(status=>"GPIO",value=>$response);

  23:                 break;

  24:             default:

  25:         }    

  26:         break;

  27:     default:

  28:         $result  =  array(status=>"No Project defined!");

  29:         break;

  30: }

  31: echo json_encode($result);

  32: ?>

I put a first switch in line 6 to seperate different projects – for later development.

Tho first running project is the “PiStarShip”. I built a woodden model of a star ship for my son, it shoul play sounds and do some light effects via the Pi and controlled via a web interface on a smartphone or tablet. 

Current implemented php functions:

“play”: Play sound (mp3 file) – line 9-12

JSON:

PlayIntro        : {

    command    : "play",

    value        : "/var/www/StarShip/intro.mp3"

    },

So the command play will call the omxplayer to play the file in value.

 

stop”: Stop all processes of omxlplayer

Yes, I know, this is a hard way to stop the omxplayer, but as of now, I didn’t find a smoother way. Any ideas?

JSON:

Stop        : {

    command:    "stop"   
    },

GPIOOut”: Set’s the value of a given GPIO-Port – line 17-23

JSON:

GPIOOut17    :    {

    command    : "GPIOOut",

    value        :    "17,1"

},

The “GPIOOut”command puts the GPIO Port in the “out”mode – line 19

The value is split into the portnumber and the GPIO value. Line 20 calls gpio to switch the port to the given value. In this case GPIO 17 will be switched on.

After that the port will be read to get the current value (line 21) and will return the result in a JSON again.

Javascript

To call the php function I implemented a global JSON variable and an Ajax call. So this is my JSON:

   1: var g_arrPHPJob;

   2:     g_arrPHPJob = {

   3:             project    : "PiStarShip",

   4:             Stop        : {

   5:                 command:    "stop"    

   6:                 },

   7:             PlayIntro        : {

   8:                 command    : "play",

   9:                 value        : "/var/www/StarShip/intro.mp3"

  10:                 },

  11:             PlaySound01        : {

  12:                 command    : "play",

  13:                 value        : "/var/www/StarShip/sounds/LaserShotII.mp3"

  14:                 },    

  15:             PlaySound02        : {

  16:                 command    : "play",

  17:                 value        : "/var/www/StarShip/sounds/LaserShot01.mp3"

  18:                 },    

  19:             GPIOOut17    :    {

  20:                 command    : "GPIOOut",

  21:                 value        :    "17,1"

  22:             },

  23:         };

The JSON includes the commands and the defalut values to call run the ajax calls.

The ajax call “F_PHPRunnerDoJob” itselfes looks like this:

   1: function F_PHPRunnerDoJob(sProject,objJobData) {

   2:         var arrPHPJob = {

   3:             project : sProject,

   4:             command : objJobData.command,

   5:             value        : objJobData.value,

   6:         };

   7:         

   8:     $.ajax({ 

   9:         url: '/core/phprunner.php', 

  10:         type: 'get',

  11:         datatype: 'json',

  12:         data: arrPHPJob,

  13:         success: function(data) { 

  14:             // // Do something with data that came back.  

  15:             // var objData = jQuery.parseJSON(data);

  16:                          console.log("Success");

  17:         },

  18:         error:function(exception){

  19:           console.log(exception);

  20:         }

  21:     });

  22: }

To impelment this in an HTML file I put a button on the page that has an onclick event:

onclick="F_PHPRunnerDoJob(g_arrPHPJob.project, g_arrPHPJob.PlayIntro)"

That’s it.

Complete HTML page:

   1: <!DOCTYPE html>

   2: <html lang="de">

   3:   <head>

   4:         <meta http-equiv="content-type" content="text/html; charset=UTF-8">

   5:         <meta http-equiv="expires" content="0" />

   6:         <meta http-equiv="cache-control" content="no-cache" />

   7:         <meta http-equiv="pragma" content="no-cache" />

   8:                 

   9:     <title>RasPi-Wars (c) by PiHunter</title>

  10:         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  11:         <link rel="apple-touch-icon" sizes="144x144" href="iOsIcon114.png" />

  12:  

  13:         <link href="/core/pi.css" rel="stylesheet" /> 

  14:     <link href="/jquery.mobile-1.4.5.css" rel="stylesheet" />

  15:         <script type='text/javascript' src='/jquery-1.11.3.js'></script>
   1:     

   2:         <script type='text/javascript' src='/jquery.mobile-1.4.5.js'>

   1: </script>        

   2:       <script type='text/javascript' src='/core/phprunner.js'>

   1: </script>

   2:         <script type='text/javascript' src='effects.js'>

</script>

  16:   </head>

  17:   <body>

  18:     <div id="ContentContainer">

  19:                 <div id="ContentHeader">RasPi-Wars (c) by PiHunter

  20:                 </div>

  21:                 <div id="Content">

  22:         <fieldset>

  23:                     <div data-role="fieldcontain" onclick="F_PHPRunnerDoJob(g_arrPHPJob.project, g_arrPHPJob.PlayIntro)">

  24:                     <a class="ui-btn ui-btn-inline ui-icon-audio ui-btn-icon-right" href="#">Start Intro</a>

  25:           </div>

  26:           <div data-role="fieldcontain" onclick="F_PHPRunnerDoJob(g_arrPHPJob.project, g_arrPHPJob.PlaySound01)">

  27:                     <a class="ui-btn ui-btn-inline ui-icon-audio ui-btn-icon-right" href="#">Laser Shot II</a>

  28:           </div>

  29:           <div data-role="fieldcontain" onclick="F_PHPRunnerDoJob(g_arrPHPJob.project, g_arrPHPJob.PlaySound02);F_LaserFlash(50)">

  30:                     <a class="ui-btn ui-btn-inline ui-icon-audio ui-btn-icon-right" href="#">Laser mit LED</a>

  31:           </div>

  32:         </fieldset>

  33:         <fieldset>

  34:           <div data-role="fieldcontain" onclick="F_PHPRunnerDoJob(g_arrPHPJob.project, g_arrPHPJob.Stop)">

  35:                     <a class="ui-btn ui-btn-inline ui-icon-delete ui-btn-icon-right" href="#">Stop</a>

  36:          </div>

  37:         </fieldset>

  38:           <br>

  39:           </div>

  40:           (c) by <a href="http://eta-arts.de" target="_blank">eta-arts.de</a>

  41:     </div>

  42:   </body>

  43: </html>

Complete Javascript functions:

   1: var g_FlashTimer;

   2: var g_arrPHPJob;

   3:     g_arrPHPJob = {

   4:             project    : "PiStarShip",

   5:             Stop        : {

   6:                 command:    "stop"    

   7:                 },

   8:             PlayIntro        : {

   9:                 command    : "play",

  10:                 value        : "/var/www/StarShip/intro.mp3"

  11:                 },

  12:             PlaySound01        : {

  13:                 command    : "play",

  14:                 value        : "/var/www/StarShip/sounds/LaserShotII.mp3"

  15:                 },    

  16:             PlaySound02        : {

  17:                 command    : "play",

  18:                 value        : "/var/www/StarShip/sounds/LaserShot01.mp3"

  19:                 },    

  20:             GPIOOut17    :    {

  21:                 command    : "GPIOOut",

  22:                 value        :    "17,1"

  23:             },

  24:         };

  25:         

  26:  

  27: function F_LaserLEDOn(iTimer){

  28:     var objJobData = {

  29:         command    : "GPIOOut",

  30:         value        :    "17,1"

  31:     };

  32:     F_PHPRunnerDoJob(g_arrPHPJob.project,objJobData);

  33:     if(iTimer>0){

  34:         var result = setTimeout(F_LaserLEDOff, iTimer);

  35:     }

  36: }

  37:  

  38: function F_LaserLEDOff(){

  39:     var objJobData = {

  40:         command    : "GPIOOut",

  41:         value        :    "17,0"

  42:     };

  43:     F_PHPRunnerDoJob(g_arrPHPJob.project,objJobData);

  44:     //clearInterval(g_FlashTimer);

  45: }

  46:  

  47: function F_LaserFlash(iTimer){

  48:     intrvl=0;

  49:     for(nTimes=0;nTimes<iTimer;nTimes++){

  50:         intrvl += 100;

  51:         setTimeout(F_LaserLEDOn(),intrvl);

  52:         intrvl += 100;

  53:         setTimeout(F_LaserLEDOff(),intrvl);

  54:   }

  55:     F_LaserLEDOff();

  56: }

Raspberry Pi automatischer Login und Auto Start

Auto Login

Um sich automatisch beim Neustart mit dem User pi am Raspberry anzumelden müssen folgende Schritte durchgeführt werden:

1. Mit dem pi verbinden (z.b. mit putty) und die Datei inittab bearbeiten:

sudo nano /etc/inittab

2. Den getty command auskommentieren:

Zur folgenden Zeile gehen in der inittab gehen

1:2345:respawn:/sbin/getty 115200 tty1

und # am Anfang einfügen

#1:2345:respawn:/sbin/getty 115200 tty1

3. Login in die initab einfügen

Die folgennde Zeile unter die gerade auskommentierte Zeile einfügen

1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1

Diese Zeile sorg fafür das das login progem mit dem user pi aber ohne Authentifizierung ausgeführt wird.

4. Speichern und beenden

Mit Strg + o und Enter die Datei abspeichern und mit Strg + x den nano editor beenden

Nun muß man den Pi nur noch durchbooten

sudo reboot

Der pi startet nun automatisch in den command promt ohne das sich jemand anmelden muss. Nun muss man nur noch definieren welche skripte oder tools automatisch gestartet werden sollen.

Auto Start (folgt in Kürze)

1: Datei /etc/profile bearbeiten

sudo nano /etc/profile

2: Am Ende die folgende Zeile anfügen

. /home/pi/your_script_name.sh

3. Speichern und beenden

Mit Strg + o und Enter die Datei abspeichern und mit Strg + x den nano editor beenden. Wichtig ist das man die Datei ausführbei macht.

sudo chmod +x  /home/pi/your_script_name.sh

Dieser Beitrag ist eine Übersetzung des folgenden Artikels: http://www.opentechguides.com/how-to/article/raspberry-pi/5/raspberry-pi-auto-start.html

GPIOson – Raspberry GPIO’s über php, javascript und jQuery steuern

image.png

Der Weihnachtsmann brachte diese Jahr einen Raspberry PI mit diversen LED’s, Schaltern und Kabeln. Der Elektroniker in mir wurde wieder wach. Schnell fand ich Anleitungen im Web per console und php dieses tolle Teil unter Kontrolle zu bringen.

Relativ schnell konnte ich die ersten LED’s über die Konsole aufleuchten lassen – auch wenn es meine Tochter nur wenig begeisterte das mir auch mal ein Licht aufging…

In Zeiten von HTML5, jQuery und Mobile First wollte ich nun über das Smartphone auch die Lampen leuchten lassen und den Schalter abfragen, ohne ständig die php Datei neu aufzurufen.

Folgende Lösung ist dabei endstanden:
Es gibt 3 Komponenten, eine Webseite (index.html) welche die Buttons rendert und die Bibliotheken zusammenführt. Eine javascript Datei (GPIOson.js) welche die Logik auswertet und dafür sorgt das die php Datei (gpio.php) aufruft um die GPIO’s zu setzten bzw. abzufragen.

Index.html:

   1: <html>

   2: <head>

   3:     <title>Pi Hunter - GPIOson</title>

   4:     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

   5:     <meta http-equiv="content-type" content="text/html; charset=UTF-8" />

   6:   <script type='text/javascript' src='/jquery-1.11.1.min.js'></script>
   1:

   2:   <script type='text/javascript' src='/jquery.mobile-1.4.5.js'>

   1: </script>

   2:   <link href="/jquery.mobile-1.4.5.css" rel="stylesheet" />

   3:   <script type='text/javascript' src='GPIOson.js'>

</script>

   7:     <style type="text/css">

   8:     </style>

   9: </head>

  10: <body>

  11:     <h1>Pi Hunter - GPIOson</h1>

  12:   <fieldset>

  13:     <div data-role="fieldcontain" onclick="switchValue(17)">

  14:       <label for="checkbox-based-flipswitch">GPIO 17:</label>

  15:       <input type="checkbox" id="GPIO17" data-role="flipswitch"  >

  16:     </div>

  17:   </fieldset>

  18:

  19:   <fieldset>

  20:     <div data-role="fieldcontain" onclick="switchValue(27)">

  21:       <label for="checkbox-based-flipswitch">GPIO 27:</label>

  22:       <input type="checkbox" id="GPIO27" data-role="flipswitch"  >

  23:     </div>

  24:   </fieldset>

  25:

  26:   <fieldset >

  27:   <div data-role="fieldcontain" onclick="autoRefresh()" >

  28:   <label for="AutoRefresh">Auto Refresh:</label>

  29:     <select name="flip-select" id="AutoRefresh" data-role="flipswitch"  >

  30:         <option selected="">Off</option>

  31:         <option >On</option>

  32:     </select>

  33:     </div>

  34:   </fieldset>

  35:

  36:   <div id='UpdateResult' ><div>

  37:     <p>Created by eta-arts - Dirk Huntemann</p>

  38:

  39: </body>

  40: </html>

Wichtig sind hier die  onclick events. Diese rufen die Javascript Funktionen in der GPIOson.js auf

Aufbau GPIOson.js :

   1: var g_GpioPins = [

   2:     {

   3:         gpio: '17', mode: 'out', value: 0

   4:     },

   5:     {

   6:         gpio: '24', mode: 'in', value: 0

   7:     },

   8:     {

   9:         gpio: '27', mode: 'out', value: 0

  10:     }

  11: ];

  12:

  13: var g_RefreshTimer = null;

  14:

  15: function getSetPin(pinData) {

  16:     $.ajax({

  17:         url: 'gpio.php',

  18:         type: 'post',

  19:         datatype: 'json',

  20:         data: pinData,

  21:         success: function(data) {

  22:             // Do something with data that came back.  

  23:             var objData = jQuery.parseJSON(data);

  24:             $('#UpdateResult').html(objData.status);

  25:         }

  26:     });

  27: }

  28:

  29: function switchValue(gpio) {

  30:     for (var i_Pin in g_GpioPins) {

  31:         if (g_GpioPins[i_Pin].gpio == gpio) {

  32:             switch (g_GpioPins[i_Pin].mode) {

  33:                 case 'out':

  34:                     switch (g_GpioPins[i_Pin].value) {

  35:                         case 0:

  36:                             g_GpioPins[i_Pin].value = 1;

  37:                             break;

  38:                         case 1:

  39:                             g_GpioPins[i_Pin].value = 0;

  40:                             break;

  41:                     }

  42:                     break;

  43:                 case 'in':

  44:                     console.log('auslesen' + g_GpioPins[i_Pin].gpio);

  45:                     break;

  46:             }

  47:             getSetPin(g_GpioPins[i_Pin]);

  48:             break;

  49:         }

  50:     }

  51: }

  52:

  53: function autoRefresh() {

  54:     //console.log($('#AutoRefresh').val());

  55:     if ($('#AutoRefresh').val() == 'On') {

  56:         autoRefreshStart();

  57:     }

  58:     else {

  59:         autoRefreshStop();

  60:     }

  61: }

  62:

  63: function autoRefreshStop() {

  64:     //console.log('Auto OFF!');

  65:     clearInterval(g_RefreshTimer);

  66:     g_RefreshTimer = null;

  67: }

  68:

  69: function autoRefreshStart() {

  70:     //console.log('Auto On!');

  71:     g_RefreshTimer = setInterval('getSetPin(g_GpioPins[1])', 100);

  72:     getSetPin(g_GpioPins[1]);

  73: }

In Zeile 1-11 werden die Startzustände der GPIO’d definiert.
function getSetPin(pinData) macht den Json call an die gpio.php

gpio.php

   1: if(count($_POST) > 0){

   2:   $gpiocmd = '/usr/local/bin/gpio -g ';

   3:   //echo $gpiocmd; 

   4:   $result=array();

   5:   switch ($_POST['mode']){

   6:     case 'out':

   7:      exec($gpiocmd . 'mode ' . $_POST['gpio'] . ' out');

   8:      exec($gpiocmd . 'write ' . $_POST['gpio'] . ' ' . $_POST['value'],$gpioValue);

   9:      //$result ='Success: Pin ' . $_POST['gpio'];

  10:      $result['value'] = ($gpioValue[0]);

  11:      break;

  12:     case 'in':

  13:      exec($gpiocmd . 'mode ' . $_POST['gpio'] . ' in');

  14:      exec($gpiocmd . 'read ' . $_POST['gpio'],$gpioValue);

  15:      //$result['value'] = ($gpioValue[0]);

  16:      $result=array('status' => $gpioValue[0],'gpio'=>$_POST['gpio']);

  17:      break;

  18:     default:

  19:       $result='Error:wrong mode';

  20:   }

  21: }

  22: else{

  23:   $result='Error:';

  24:   }

  25: echo json_encode($result);

Auch die gpio.php ist recht übersichtlich. Hier wird das Json ausgewertet und anschließen über php exec der

Konsolenbefehl (“Licht an oder Aus”, “Was macht der Schalter?” ) aufgerufen.

Durch einbinden von jQueryMobile und jQuery Mobile sieht das Ganze dann im Browser so aus:

image      image

Rufumleitung bei t-mobile (von iPhone und anderen Smartphones)

Bei den erwähnten bedingten Umleitungen ist das Ziel die Mailbox-Kurzwahl 3311. An ihrer Stelle können Sie auch eine andere Nummer einsetzen, zum Beispiel eine Festnetznummer oder die Nummer eines zweiten Handys. Vergessen Sie dabei die Vorwahl des Orts- oder Handynetzes nicht. Mit **62*08912345678# leiten Sie zum Beispiel Anrufer bei nicht erreichbarem iPhone auf die Münchener Festnetznummer (Vorwahl 089) 12345678 um.

Ist bereits eine Nummer für die bedingte Rufleitung gesetzt worden,

kann sie beim nächsten Mal ohne erneute Angabe der Nummer reaktiviert werden. Hierzu geben Sie nur *61#, *62# beziehungsweise *67# ein.

 

Rufumleitung auf Voicemail

**67*3311#

Rufumleitung auf Voicemail, wenn besetzt, aktivieren

**62*3311#

Rufumleitung auf Voicemail, wenn nicht erreichbar, aktivieren

**61*3311#

Rufumleitung auf Voicemail nach 15 Sekunden

**61*3311*11*ZEIT#

Rufumleitung auf Voicemail nach 5, 10, 15, 25 oder 30 Sekunden (Zahl anstelle von ZEIT eingeben)

**004*3311#

Aktivieren aller bedingten Umleitungen auf Voicemail

**21*3311#

Sofortige Rufumleitung auf Voicemail für alle Anrufe

Voicemail-Umleitung deaktivieren

## 67 #

Rufumleitung, wenn besetzt, deaktivieren

## 62 #

Rufumleitung, wenn nicht erreichbar, deaktivieren

## 61 #

Verzögerte Rufumleitung deaktivieren

## 004 #

Alle bedingten Rufumleitungen deaktivieren

## 002 #

Alle Rufumleitungen deaktivieren

Status für bedingte Rufumleitung abfragen

*# 67 #

Zeigt an, ob die Rufumleitung im Besetztfall aktiv ist

*# 62 #

Zeigt an, ob die Rufumleitung bei Nichterreichbarkeit aktiv ist

*# 61 #

Zeigt an, ob die verzögerte Rufumleitung aktiv ist

 

Nützliche Codes

*#06#

Abfrage der IMEI des iPhone

*135#

Eigene Rufnummer bei T-Mobile abfragen

*#5005*74663#

Eigene Rufnummer von SIM-Karte lesen

SIM-Karten anderer Anbieter nutzen

*#5005*86#

Anzeige der Rufnummer der Mailbox

*5005*86*MAILBOX#

Setzen der Mailbox-Nummer (statt MAILBOX eintragen)

##5005*86#

Löschen der Mailbox-Nummer

*#5005*7672#

Aktuelle Nummer der SMS-Zentrale anzeigen

*5005*7672*SMS#

Setzen der Nummer der SMS-Zentrale (statt SMS eingeben)

##5005*7672#

Löschen der Nummer der SMS-Zentrale

Allgemeine Rufumleitung konfigurieren

**21*ZIEL#

oder Festnetz) programmieren

*21#

Umleitung zur gespeicherten Nummer aktivieren

#21#

Rufumleitung ausschalten

##21#

Nummer für Rufumleitung löschen

Übermittlung der eigenen Nummer einstellen

*31#ZIEL

Nummer ZIEL anrufen, dabei eigene Nummer zeigen

#31#ZIEL

Nummer ZIEL anrufen, dabei eigene Nummer unterdrücken

*#31#

Status der Rufnummerübermittlung anzeigen

Verhalten bei Anruf im laufenden Gespräch

*43#

Anklopfen erlauben (Voraussetzung für Konferenzen)

#43#

Anklopfen nicht erlauben

*#43#

Status für Funktion Anklopfen anzeigen

Verhalten von Zweitkarten (Multi-SIM)

*222#

Diese Karte für SMS/MMS Empfang aktivieren (T-Mobile)

*221#

Status für SMS/MMS-Empfang anzeigen (T-Mobile)

*125#

SMS-Empfang mit dieser Karte (O2)

*126#

MMS-Empfang mit dieser Karte (O2)

PINs ändern und mit PUK entsperren

**04*PIN*NEUE_PIN*NEUE_PIN#

PIN in NEUE_PIN ändern

**05*PUK*NEUE_PIN*NEUE_PIN#

PIN mit PUK entsperren

**042*PIN2*NEUE_PIN2*NEUE_PIN2#

PIN 2 in NEUE_PIN2 ändern

**052*PUK2*NEUE_PIN2*NEUE_PIN2#

PIN 2 mit PUK 2 entsperren

WordPress: Kategorie(n) auf Startseite ausblenden

Bestimmte Kategorien (wie z.B. Archiv) können sehr einfach auf der Startseite (“aktuelle Beiträge”) ausgeblendet werden.

Folgenden code in die functions.php des Templates einfügen:

/** eine bestimmte Kategorie ausschliessen! **/

function exclude_category_home( $query ) {
    if ( $query->is_home ) {
        $query->set( ‚cat‘, ‚-27‚ );
    }
    return $query;
}
 
add_filter( ‚pre_get_posts‘, ‚exclude_category_home‘ );

 

Die 27 ist die ID der auszublendenden Kategorie

1 2 3 4