Статьи

Баловство в домашней автоматизации

Моя шведская коллега однажды сказала мне, что шведская женщина называет Клас Ослон «детским садом мужа», и я должен признать, что если я когда-нибудь буду поблизости, я загляну, потому что ты никогда не знаешь, когда тебе понадобится  запасная цепь бензопилыдополнительный флэш — накопитель  или  запасная часть вашей лодки .

Так или иначе, во время моей последней прогулки я обнаружил, что они начали снабжать комплект домашней автоматизации и предлагали скидку в 10 фунтов за каждые потраченные 50 фунтов. 100 фунтов стерлингов  (ну 80 фунтов стерлингов)  спустя я ушел с различными гаджетами, но не знал, что мне с ними делать.

Для управления и контроля я купил Tellstick USB, который был подключен к серверу хранения NAS  (автоматическое архивирование носителей + uPNP / SMB для  RaspBMC ) , для потолочных светильников я купил несколько  NEXA LWNR 210,  которые позволяют вам контролировать источники света, использующие беспроводную связь 300 МГц или переопределенные с помощью существующего коммутатора, для розеток я использовал комбинацию NEXA LMCR 1000  и  NEXA EYCR 2300  (очевидно , для розеток  в Великобритании) .

Подключив около 50% из них, я понял, что оставил власть, которую я должен признать, это наследие работы с центром данных, где время безотказной работы было более важным, чем здоровье и безопасность  (ах, это были дни) . Подберите быстрый переход к блоку предохранителей, чтобы жена не получила уведомления о том, что я в итоге получу удар током.

Как только все было подключено и предохранители не перегорели, пришло время начинать автоматизацию!

Поскольку мне было лень, я решил использовать централизованный продукт «Telldus Live»  http://live.telldus.com/ )  вместо того, чтобы понять, как общаться с USB  напрямую (хотя Telldus  поддерживает это ),  и быстро взломать их вместе. виджет Android  (мы используем Motorola Xoom с док-станцией в качестве контроллера XBMC / lighting / everything)  и прокси-сервер PHP для связи OAUTH с Telldus в реальном времени;

Виджет Android очень прост;

package net.networksaremadeofstring.zeus;
 
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
 
public class ZeusTallLampWidget extends AppWidgetProvider 
{
  int N = 0;
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
	{
		N = appWidgetIds.length;
        for (int i=0; i<N; i++) 
        {
            int appWidgetId = appWidgetIds[i];
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget2);
            
            
            views.setTextViewText(R.id.textView1, "Tall Lamp");
            
            Intent offIntent = new Intent(context, ZeusTallLampWidget.class);
            offIntent.putExtra("id", 197068);
            offIntent.putExtra("type", false);
            PendingIntent pendingOffIntent = PendingIntent.getBroadcast(context, 0, offIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            views.setOnClickPendingIntent(R.id.button1, pendingOffIntent);
            appWidgetManager.partiallyUpdateAppWidget(appWidgetId, views);
            
            Intent onIntent = new Intent(context, ZeusTallLampWidget.class);
            onIntent.putExtra("id", 197068);
            onIntent.putExtra("type", true);
            PendingIntent pendingOnIntent = PendingIntent.getBroadcast(context, 1, onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            views.setOnClickPendingIntent(R.id.button2, pendingOnIntent);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
	}
	
	@Override
	public void onReceive(Context context, Intent intent) 
	{
		super.onReceive(context, intent);
 
	    if (intent.getIntExtra("id", 0) != 0)
	    {
	    	API.switchSomething(intent.getIntExtra("id", 0),intent.getBooleanExtra("type", false));
	    }
	}
}

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="32dp"
    android:minHeight="32dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/widget2"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard">
</appwidget-provider>

<receiver android:name="net.networksaremadeofstring.zeus.ZeusHalogenWidget" android:label="Zeus Halogen Widget">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
	</intent-filter>
	<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" />
</receiver>

Функция switchsomething одинаково проста:

public static void switchSomething(final int ID, final boolean toggle)
  {
		((Thread) new Thread()
    	{
			public void run()
			{
				try
				{
					DefaultHttpClient client = new DefaultHttpClient(); 
					HttpParams params = new BasicHttpParams();
			        SchemeRegistry registry = new SchemeRegistry();
			        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
			        ThreadSafeClientConnManager mgr = new ThreadSafeClientConnManager(params, registry);
			        
			        DefaultHttpClient httpclient = new DefaultHttpClient(mgr, client.getParams());
			    	HttpGet request = null;
			    	
			    	if(toggle)
			    	{
			    		Log.i("switchSomething","On");
			    		request = new HttpGet("http://fictional.tld/telldus/on.php?deviceid=" + Integer.toString(ID));
			    	}
			    	else
			    	{
			    		Log.i("switchSomething","Off");
			    		request = new HttpGet("http://fictional.tld/off.php?deviceid=" + Integer.toString(ID));
			    	}
			        
			        HttpResponse response = httpclient.execute(request);
			        
			        String rawJSON = EntityUtils.toString(response.getEntity());
			        response.getEntity().consumeContent();
					JSONObject TagObject = new JSONObject(rawJSON);
					
					Log.i("JSON",TagObject.toString(3));
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
    		}
    	}).start();
	}

Который в свою очередь называет:

<?php
	require_once 'common.php';
	$DEVICEID = $_GET['deviceid'];
	$consumer = new HTTP_OAuth_Consumer(constant('PUBLIC_KEY'), constant('PRIVATE_KEY'), 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX');
	$params = array(
		'supportedMethods' => constant('TELLSTICK_TURNON') | constant('TELLSTICK_TURNOFF'),
		'id' => $DEVICEID,
		'response' => 'json'
	);
	$response = $consumer->sendRequest(constant('REQUEST_URI').'/device/turnOn', $params, 'GET');
	echo $response->getBody();

В течение 20 минут я включал и выключал потолочные светильники, торшеры и другие гаджеты со своего планшета!

Код хакерский, и OAUTH действительно нужно сделать изначально в Android, чтобы сохранить шаг, но я достаточно доволен этим, с одним устройством Android, которое я могу искать и загружать некоторые носители в NAS, ставить их в очередь на  RaspBMC ,  чтобы играть по какой бы ни телевизор в доме , я хочу , а затем отрегулировать освещение в комнате  (или любой другой комнате) ,  чтобы удовлетворить настроение и все с помощью программного обеспечения с открытым исходным кодом.