Hauptmenü

Werkzeuge

Kategorien

Archiv

Einhell

Phillips HUE Lampen über Standby Modus der Dreambox deaktivieren

Erstellt in Allgemein am 25. Dezember 2014 vom Daschmi

Ziel war es die Lampen des Phillips Hue Systems, die links und rechts von meinem TV angebracht sind mit dem Standby Modus der Dreambox zu deaktivieren.

Phillips stellt für die Kontrolle der Lampen und der Bridge eine REST Api zur Verfügung, die über das JSON Format kommuniziert. Um die Anfragen an die Bridge zu senden habe ich mich entschieden das Systemkommando curl zu verwenden. Alternativ wäre auch python-requests oder ähnliches möglich. Es gibt auch mehrer Schnittstellen (verwenden auch python-requests) zu Python direkt, eine Übersicht gibt es hier.

Schritt 1 – Curl auf der Dreambox installieren

Die Installation von Curl ist von dem verwendeten Image abhängig. Bei mir war Curl im Repository direkt verfügbar und konnte mittels

opkg install curl

direkt installiert werden.

Schritt 2 – API User bei der Bridge registrieren

Zuerst muss man die IP der Phillips HUE Bridge herausfinden, in meinem Fall ist dies die 192.168.1.2.

Damit die API verwendet werden kann, muss ein Benutzer an der Bridge angemeldet werden. Klicken sie dazu den Link Button an der Phillips HUE Bridge und führen sie direkt danach folgendes Kommando auf der Dreambox aus:

curl -d '{"devicetype":"dm800","username":"testapiuser"}' 192.168.1.2/api

devicetype und username können beliebig sein. Bei meinen Tests hat sich aber herausgestellt, das der username mindestens aus 10 Zeichen bestehen muss.

Die Rückgabe müsste wie folgt aussehen:
[{„success“:{„username“:“testapiuser“}}]

Schritt 3 – Lampen testen

Die einzelnen an der HUE Bridge angeschlossenen Lampan lassen sich über eigene API Urls ansprechen. Um zum Beispiel die 3. Lampe auszuschalten kann folgendes Kommando benutzt werden:

curl -d '{"on":false}' -X PUT 192.168.1.2/api/testapiuser/lights/3/state

Am besten einfach alle Lampen einschalten und dann testen welche Lampe welche Nummer bekommen hat.

Schritt 4 – Script zum ausschalten der Lampen schreiben

Ich habe ein einfaches Shell Script geschrieben welches ich unter /mnt/hdd/hueoff.sh abgelegt habe. Die Datei muss mittels chmod +x ausführbar gemacht werden. Das Shell Script sieht in meinem Fall wie folgt aus:

#!/bin/sh
sleep 30s
curl -d '{"on":false}' -X PUT  192.168.1.2/api/testapiuser/lights/1/state
curl -d '{"on":false}' -X PUT  192.168.1.2/api/testapiuser/lights/3/state

In Zeile 2 habe ich ein Sleep eingebaut, so habe ich nach 30 Sekunden noch Licht nachdem ich die Dreambox in den Standby Modus geschaltet habe.

 Schritt 5 – Script beim Standby der Dreambox ausführen

Die Dreambox führ das Script /usr/lib/enigma2/python/Screens/Standby.ph aus, wenn die Box in den Standby Modus geschalten wird. Damit wir externe Befehle aufrufen können, müssen wir die os Bibliothek importieren. Dies geschieht mittels

import os 

Das Scriptt aus Schritt 4 führen wir mittes

os.system("sh /mnt/hdd/hueoff.sh &") 

aus. Der Systemaufruf sollte hinter die Zeile print „enter standby“ platziert werden.
Schritt 6 – Dreambox neu starten und testen

Damit die Änderungen am standby.py wirksam werden, muss Enigma neu gestartet werden. Anschließend sollten die Lampen ausgehen sobald die Dreambox in den Standby Modus geschaltet wird.

HTTP Requests mit Apple Swift abschicken und verarbeiten

Erstellt in Allgemein am 24. Dezember 2014 vom Daschmi

Um mittels Swift eine Anfrage an eine URL zu stellen kann wie folgt vorgegangen werden:

Zuerst die URL mit den GET Parametern definieren:

let strURL : NSString = "http://daschmi.de/api/?variable1=value1"

Dann muss der Request erstellt und die Connection aufgebaut werden:

let request : NSURLRequest = NSURLRequest(URL: strUrl)
let MyRequestDelegate : RequestDelegate()
var connection : NSURLConnection!  = NSURLConnection(request: request, delegate: MyRequestDelegate, startImmediately: true);
connection.start();

Im Delegate können dann folgende Interface Methode verwendet werden um die Rückgabe zu verarbeiten:

class RequestDelegate: NSURLConnectionDelegate {

  var data : NSMutableData = NSMutableData();

  func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {

    // Empfangene Daten anhängen
    self.data.appendData(data)

  }

  func connectionDidFinishLoading(connection: NSURLConnection!) {

    // Verbindung beendet

  }

}

MD5 Checksumme mit Apple Swift berechnen

Erstellt in Apple Swift am 24. November 2014 vom Daschmi

Leider fehlt der Programmiersprache Swift von Apple eine implementation des MD5 Hash Algorithmuses. Dieser kann aber leicht durch eine Erweiterung des String Datentypes nachgerüstet werden:

extension String  {
    var md5: String! {
        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)

        CC_MD5(str!, strLen, result)

        var hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }

        result.destroy()

        return String(format: hash)
    }
}

Angewendet wird das ganze dann einfach wie folgt:

var strHASH : NSString = strToHash.md5

MySQL Tabellenname als Prefix für Alias

Erstellt in Allgemein am 21. Oktober 2014 vom Daschmi

Wenn man zum Beispiel bei einem komplexen Join automatisch alle Spalten mit Prefixen für eine Tabelle versehen will kann man folgenden Code verwenden:

function fetchAssoc(&$db, $strQuery)
{

  $result = $db->query($strQuery);

  $arReturn = array();

  while ($row = $result->fetch_assoc())
  {

    $arReturn[] = $row;

  }

  return $arReturn;

} 

function prefixed_table(&$db, $table_alias, $table)
{

  $columns = fetchAssoc($db, "SHOW COLUMNS FROM `".$table."`");

  $field_names = array();

  foreach ($columns as $column)
  {

    $field_names[] = $column["Field"];

  }

  $prefixed = array();

  foreach ($field_names as $field_name)
  {

  	$prefixed[] = "`".$table_alias."`.`".$field_name."` AS `".$table.".".$field_name."`";

  }

	return implode(", ", $prefixed);

}

Beispielhafte Anwendung für einen xtCommerce Export:

define(TBL_PRODUCTS, ‚xt_products‘);
define(TBL_PRODUCTS_DESCRIPTION, ‚xt_products_description‘);
define(TBL_PRODUCTS_CATEGORIE, ‚xt_products_to_categories‘); 

$db = mysqli_connect(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

$strQuery = "
  SELECT
    ".prefixed_table($db, ‚P‘, TBL_PRODUCTS).",
    ".prefixed_table($db, ‚PD‘, TBL_PRODUCTS_DESCRIPTION).",
    GROUP_CONCAT(PC.`categories_id`) AS `".TBL_PRODUCTS_CATEGORIE.".categories_id`,
    GROUP_CONCAT(PC.`master_link`) AS `".TBL_PRODUCTS_CATEGORIE.".master_link`
  FROM
    `".TBL_PRODUCTS."` AS P
      LEFT JOIN `".TBL_PRODUCTS_DESCRIPTION."` AS PD ON (P.`products_id` = PD.`products_id`)
      LEFT JOIN `".TBL_PRODUCTS_CATEGORIE."` AS PC ON (P.`products_id` = PC.`products_id`)
  GROUP BY
    P.`products_id`
";

$product_data = fetchAssoc($db, $strQuery);

Templavoilá Template Domainbezogen umschalten / gleicher Seitenbaum

Erstellt in Allgemein am 14. Oktober 2014 vom Daschmi

Möchte man im TYPO3 für einen Seitenbaum mehrere Templavoilá Templates verwenden, so ist dies bisher nicht möglich. Das Seitentemplate ist direkt in dem Datensatz der Seite zugeordnet. Über eine kleine Userfunktion und etwas Typoscript kann dies aber umgangen werden.

Hier die Userfunktion:

class user_tv
{

  function main($content, $conf)
  {

    $GLOBALS[‚TSFE‘]->page[‚tx_templavoila_to‘] = 5;

  }

}

Die 5 muss durch die ID des Templavoila Templateobjects ersetzt werden. Das Umschalten des Templats erfolgt dann mittels folgendem Typoscript Schnipsel:

...
page.10 = USER
page.10.userFunc = tx_templavoila_pi1->main_page

[hostname = m.add-solution.de] || [globalString = IENV:HTTP_HOST = m.add-solution.de]
includeLibs.lang = fileadmin/user_tv.php
page.1 = USER
page.1.userFunc = user_tv->main

page.10 = USER
page.10.userFunc = tx_templavoila_pi1->main_page
[global]
...

Push Mitteilungen an Android Smartphones mit PHP versenden

Erstellt in Allgemein am 6. Oktober 2014 vom Daschmi

Kleine Funktion, mit der es möglich ist Push Mitteilungen über den GoogleCloud Message Dienst an registrierte Android Geräte zu versenden.

function android_sendPush($arDeviceIDs, $data)
{

  $apiKey = “; // API Schlüssel eintragen
  $url = ‚https://android.googleapis.com/gcm/send‘;

  $post = array(
	‚registration_ids‘ =>$arDeviceIDs,
 	‚data‘ => $data
  );

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    ‚Authorization: key=‘.$apiKey,
    ‚Content-Type: application/json‘
  ));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));

  $result = curl_exec($ch);

  if (curl_errno($ch))
  {

    die(‚CURL Fehler: ‚.curl_error($ch));
    curl_close($ch);
    return 0;

  }

  return sizeof($arDeviceIDs);

}

Platzhalter mit „placeholder“ Attribut in Inputfeldern vom Typ „password“

Erstellt in Allgemein am 26. September 2014 vom Daschmi

Damit man einen klartext Platzhalter für Inputfelder vom Typ „password“ verwenden kann, kann folgender Beispielcode verwendet werden:

<form method="POST" action="">

<div class="pwd_fields">
  <input type="text" name="pw_old" value="" autocomplete="off" placeholder="Altes Passwort" />
  <input type="text" name="pw1" value="" autocomplete="off" placeholder="Neues Passwort" />
  <input type="text" name="pw2" value="" autocomplete="off" placeholder="Neues Passwort (Wiederholung)" />
</div>

</form>

<script type="text/javascript">/* <![CDATA[ */

  jQuery(document).ready(function() {
    jQuery(‚.pwd_fields input‘).bind(‚focus‘, function() {
      if (jQuery(this).attr("type") == "text") { jQuery(this).val(“); jQuery(this).attr("type", "password"); }
    } ).bind(‚blur‘, function() {
      if (jQuery(this).val().trim() == “) jQuery(this).attr("type", "text");
    } );
  } );

/* ]]> */</script>

Bei einer Validierung oder serverseitigen Verarbeitung muss dies aber berücksichtigt werden!

Beispiel



WordPress Plugin in Pluginverwaltung verstecken/verbergen

Erstellt in Allgemein am 24. September 2014 vom Daschmi

Manchmal ist es notwendig ein Plugin in der Pluginverwaltung von WordPress zu verstecken. Möchte man beispielsweise das WordPress Shop Plugin System wpShopGermany in der Pluginverwaltung von WordPress verstecken, kann folgender Code verwendet werden:

function my_hide_plugin()
{

  global $wp_list_table;

  foreach ($wp_list_table->items as $key => $val)
  {

    if ($key == ‚wpshopgermany/wpshopgermany.php‘)
    {

      unset($wp_list_table->items[$key]);

    }

  }

}

add_action(‚pre_current_active_plugins‘, ‚my_hide_plugin‘);

Das Plugin ist weiterhin normal einsatzbereit, erscheint aber nicht mehr in der Pluginverwaltung. Der obige Code kann einfach in der functions.php des aktuellen Themes platziert werden. Wechselt man auf das Standard Theme oder kommentiert den Code aus, so ist das Plugin auch wieder normal sichtbar.

WordPress Shortcode Funktion zur Anzeige einer Skala / Energieausweis

Erstellt in Wordpress am 2. September 2014 vom Daschmi

Mit einer einfachen Shortcode Funktion und etwas CSS und einer Grafik kann der Energieausweis einer Immobilie wie folgt visualisiert werden:

[ds_energieausweis value=“100″]

Dazu muss einfach folgender Code in die functions.php des Themes kopiert werden:

function ds_energieausweis($atts, $content = null)
{

return ‚<div class="ds_energieausweis"><div style="left:‘.(($atts[‚value‘] / 470) * 376).’px;"></div></div>‘;

}

add_shortcode(‚ds_energieausweis‘, ‚ds_energieausweis‘);

Zur Darstellung ist dann in der style.css noch folgender CSS Code notwendig:

.ds_energieausweis { position:relative; width:376px; height:48px; background-image:url('gfx/energieausweis.png'); background-repeat:no-repeat; }
.ds_energieausweis div { position:absolute; top:0px; height:48px; width:2px; background-color:#FFFFFF; }

 

Problem zwischen wpShopGermany und dem awake Theme

Erstellt in Wordpress am 12. August 2014 vom Daschmi

Es gibt bis Version 3.4.2 ein Problem beim Einsatz von wpShopGermany mit dem WordPress awake Theme. Das awake Theme versucht die Namen der Input Felder als Shortcodes zu interpretieren, was zum einen zu einer merkwürdigen Darstellung der Shop Templates führt und zum anderen die Formularfelder nicht korrekt gespeichert werden.

Im awake Theme gibt es eine nicht dokumentierte Funktion, um das parsen der Shortcodes zu verhindern. Alles was zwischen [raw] und [/raw] steht wird nicht als Shortcode interpretiert. Eine Möglichkeit wäre nun alle phtml Templates in [raw] und [/raw] einzuschließen, was aber einen erheblichen Aufwand bedeutet. Ab der wpShopGermany Version 3.4.3 gibt es unter wpShopGermany -> Konfiguration -> Erweitert eine neue Funktion, die automatisch alle Frontendtemplates in [raw] und [/raw] einschließt ohne die Templates zu modifizieren.

Leider gibt es im awake Theme noch eine weitere Funktion, die offenbar den Inhalt für die Verarbeitung der Shortcodes vorbereiten soll:

function mysite_texturize_shortcode_before($content) {
$content = preg_replace(‚/\]\[/im‘, "]\n[", $content);
return $content;

Diese Funktion ersetzt aber zum Beispiel:

<input type="text" id="email" name="wpsg[checkout][email]" value="" />

durch

<input type="text" id="email" name="wpsg[checkout]
[email]" value="" />

Dies führt dann dazu, dass die Variablen nicht korrekt übergeben und gespeichert werden.

Abhilfe schafft die Änderung der mysite_texturize_shortcode_before function durch:

function mysite_texturize_shortcode_before($content) {

$pattern_full = ‚{(\[raw\].*?\[/raw\])}is‘;
$pattern_contents = ‚{\[raw\](.*?)\[/raw\]}is‘;

$pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
$new_content = “;

foreach ($pieces as $piece)
{

if (preg_match($pattern_contents, $piece, $matches))
{

// [raw](.*)[/raw]
$new_content .= $piece;

}
else
{

$new_content .= preg_replace(‚/\]\[/im‘, "]\n[", $piece);

}

}

return $new_content;

}

so wird die Ersetzung zwischen den [raw] und [/raw] Tags nicht mehr durchgeführt.