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