Моя шведская коллега однажды сказала мне, что шведская женщина называет Клас Ослон «детским садом мужа», и я должен признать, что если я когда-нибудь буду поблизости, я загляну, потому что ты никогда не знаешь, когда тебе понадобится запасная цепь бензопилы , дополнительный флэш — накопитель или запасная часть вашей лодки .
Так или иначе, во время моей последней прогулки я обнаружил, что они начали снабжать комплект домашней автоматизации и предлагали скидку в 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 , чтобы играть по какой бы ни телевизор в доме , я хочу , а затем отрегулировать освещение в комнате (или любой другой комнате) , чтобы удовлетворить настроение и все с помощью программного обеспечения с открытым исходным кодом.