Tellstick Duo och vad man kan göra(1-wire,php,python,mysql)

Hur ser ditt mät- och/eller hemautomations-system ut? Dela med dig av hur just Ditt projekt ser ut och fungerar, eller hur dina planer ser ut för framtiden. Att läsa om andra är bästa inspirationen.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Tellstick Duo och vad man kan göra(1-wire,php,python,mysql)

Inlägg av Niklas »

Så, fick hem min nya Duo idag.

Jag hade tidigare lite frågor om hur man skulle göra i denna tråd men eftersom att jag har tagit reda på mer och mer själv så har detta förvandlats till en "så här gör jag"-tråd. :)

Hittade en kodsnutt här: http://www.telldus.se/forum/viewtopic.php?p=6253#p6253):

Kod: Markera allt

<?php
$s = stream_socket_client('unix:///tmp/TelldusEvents');
while(1){
    echo stream_socket_recvfrom($s,1024)."\n";
}
?>
ETT tryck på en Nexafjärr modell PBT-707 sprutar ur sig detta:

Kod: Markera allt

16:TDRawDeviceEvent93:class:command;protocol:arctech;model:selflearning;house:2887766;unit:1;group:0;method:turnon;i-1s
16:TDRawDeviceEvent79:class:command;protocol:sartano;model:codeswitch;code:1111011001;method:turnoff;i-1s
16:TDRawDeviceEvent87:class:command;protocol:everflourish;model:selflearning;house:261;unit:2;method:turnoff;i-1s
16:TDRawDeviceEvent93:class:command;protocol:arctech;model:selflearning;house:2887766;unit:1;group:0;method:turnon;i-1s
16:TDRawDeviceEvent79:class:command;protocol:sartano;model:codeswitch;code:1111011001;method:turnoff;i-1s
16:TDRawDeviceEvent87:class:command;protocol:everflourish;model:selflearning;house:261;unit:2;method:turnoff;i-1s
16:TDRawDeviceEvent93:class:command;protocol:arctech;model:selflearning;house:2887766;unit:1;group:0;method:turnon;i-1s
16:TDRawDeviceEvent79:class:command;protocol:sartano;model:codeswitch;code:1111011001;method:turnoff;i-1s
16:TDRawDeviceEvent87:class:command;protocol:everflourish;model:selflearning;house:261;unit:2;method:turnoff;i-1s
16:TDRawDeviceEvent93:class:command;protocol:arctech;model:selflearning;house:2887766;unit:1;group:0;method:turnon;i-1s
16:TDRawDeviceEvent79:class:command;protocol:sartano;model:codeswitch;code:1111011001;method:turnoff;i-1s
16:TDRawDeviceEvent87:class:command;protocol:everflourish;model:selflearning;house:261;unit:2;method:turnoff;i-1s
16:TDRawDeviceEvent93:class:command;protocol:arctech;model:selflearning;house:2887766;unit:1;group:0;method:turnon;i-1s
16:TDRawDeviceEvent79:class:command;protocol:sartano;model:codeswitch;code:1111011001;method:turnoff;i-1s
16:TDRawDeviceEvent87:class:command;protocol:everflourish;model:selflearning;house:261;unit:2;method:turnoff;i-1s
Inte dåligt. Det verkar som att fjärren pulsar ut samma kod 5 gånger.

Jag är lite rostig på det här. Om jag vill göra något speciellt när protocol = arctech, code = 123456 och method = turnoff/turnon, hur gör jag då?
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och PHP?

Inlägg av Niklas »

Vill man få något gjort snabbt så får man göra det själv. ;)

Har lagt in i Phytonexemplet som finns på Telldus hemsida att den skall öppna en URL vid on och off.
Nu kan jag släcka och tända hela husets fönsterbelysning från en knapptryckning på fjärren. Phytonscriptet skickar med ID och om det är ON eller OFF vid anrop till PHP-scriptet.

Jag har ju ett par knappar kvar på fjärrkan att leka med så lite andra saker ska jag nog få den att göra också.
Bl.a. ett "exsvärmors"-läge genom en knapptryckning. När hon är här så måste belysningen vara tänd lite annorlunda för att hon ska kunna sova. ;)

Nu gör ju pythonscriptet lite behandling innan allt skickas till php-scriptet men om jag vill så kan jag skicka hela "raw-outputen" direkt till PHP och sköta all behandling där om jag vill. Funkar rätt bra ändå. Bäst vore ju om man kunde snacka med tellsticken direkt via PHP. Det finns ett php-tillägg som telldus har skrivit men det är inte uppdaterat med stöd för Duo. Senaste uppdateringen var för ca 2 år sedan om jag inte minns fel. Det finns dock källkod så vem som helst kan ju bygga på det.

Annars så har jag mycket gott att säga om Tellstick Duo. Räckvidden här hemma är kanon. Jag bor i ett trähus som har tre våningar och stickan täcker in hela huset och alla rum + våningar. Det gjorde inte min gama icke-duo-sticka. Den är mycket snabb på att skicka kommandon också. Körde med 5 sekunder mellan varje sändning då jag hade gamla stickan för annars fanns risken att vissa lampor missades. Nu har jag helt tagit bort tidsgränsen och det går riktigt snabbt. Har inte varit med om att den har missat någon lampa alls än så länge. I och med bytet till Duo så passade jag på att dumpa rfcmd till fördel för tdtool. tdtool håller ju reda på läget, om prylen är på eller av plus att det är samma konfiguration som används av TelldusCenter så detta körs parallellt med alla script och jag kan även använda mig av Telldus Live samtidigt.
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Tellstick Duo och PHP?

Inlägg av daromer »

Beställde en. Hoppas innerligt den är så mycke bättre. Kan säga att jag blev innerligt besviken på deras dev duo som man fick ut. Men nu så. Denna kombinerat med Plugwise i huset så. Har redan trådlöst i flertalet olika rum hemma så det ska bara integreras. Har skrivit mycke av koden till Tellsticken duon med så.

Det php exemplet kommer från min arbetskolega :D
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och PHP?

Inlägg av Niklas »

Man skulle enligt Telldus inte lyssna på filerna i tmp så jag använder mig av Phyton-exemplet som jag har modifierat för att skicka det som händer till mina PHP-script.

Jag har skrivit ett system som sköter om belysning och annat i mitt hus i PHP. Jag kan lägga till jobb som skall köras när man trycker på en viss knapp på fjärren. Jag har tre olika program som körs beroende på vilken knapp man trycker på. Funkar kanon!

Databasen med mina enheter ser ut så här:
ScreenShot027.jpg
f_job_on anger vilket program som ska köras när den tar emot PÅ från fjärren och f_job_off vad som ska köras om man trycker på OFF. Jobben finns specificerade i en annan tabell. För tillfället kan jag enkelt lägga till ett jobb som tänder eller släcker en mottagare, skickar ett e-mail och/eller ett sms.
1-wiredatan uppdateras varje minut och statusen på mottagarna uppdateras med hjälp av tdtool så fort Tellsticken har tagit emot eller skickat något kommando. Namnen på mottagarna hämtas också direkt från tdtool.

Jag har inte skrivit något admin-gränssnitt än så jag får lägga till allt i databasen manuellt men jag behöver inte koda något för att lägga till en ny mottagare, 1-wire-enhet eller ett nytt jobb. Jag har dock en sida där jag kan se status på mina enheter och så kan jag tända och släcka dem:
ScreenShot028.jpg
ScreenShot028.jpg (17.25 KiB) Visad 38326 gånger
Jag använde tidigare rfcmd med en vanlig Tellstick. Fördelen med att jag nu använder tdtool istället är för att tdtool alltid har koll på statusen. Om mottagaren är på eller av. Jag kan använda TelldusCenter och andra program samtidigt men alltid hämta aktuell status via tdtool. Med rfcmd så fick jag själv logga status i databasen för att kunna veta om en enhet var på eller av.
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av Niklas »

Jag har min Tellstick ansluten till en dator som sitter bak på TVn.

Servern står i källaren.

Dessa script är på TV-datorn:
callbacks.py:

Kod: Markera allt

from ctypes import c_int, c_ubyte, c_void_p, POINTER, string_at #imports allowing the use of our library
from threading import Timer
import time
import platform
#import urllib2
import os
#import MySQLdb

#platform specific imports:
if (platform.system() == 'Windows'):
	#Windows
	from ctypes import windll, WINFUNCTYPE
	lib = windll.LoadLibrary('TelldusCore.dll') #import our library
else:
	#Linux
	from ctypes import cdll, CFUNCTYPE
	lib = cdll.LoadLibrary('libtelldus-core.so.2') #import our library

timers = {} #timerlist

def turn():
	if (devid == "12" or devid == "13" or devid == "14"):
		run = "/usr/bin/php /var/www/autosys/python_to_php.php " + statusen + " " + devid
		print "...RUNNING " + run
		os.system(run)
		print "...DONE running " + run

	
#function to be called when a device event occurs		
def callbackfunction(deviceId, method, value, callbackId, context):
	global timers
	
	t = 0
	print "Received event for device %d" % (deviceId,)
	
	global devid
	global statusen
	devid = str(deviceId)
	statusen = str(method)
	
	os.system('/usr/bin/php /var/www/autosys/tdtool_status.php')
		
	if (deviceId in timers):
		# a timer already exists for this device, it might be running so interrupt it
		# Many devices (for example motion detectors) resends their messages many times to ensure that they
		# are received correctly. In this example, we don't want to run the turnOn/turnOff methods every time, instead we
		# start a timer, and run the method when the timer is finished. For every incoming event on this device, the timer
		# is restarted.
		t = timers[deviceId] 
		t.cancel()
	
	t = Timer(0.5, turn) #start timer

	t.start()
	timers[deviceId] = t #put timer in list, to allow later cancellation

#function to be called when device event occurs, even for unregistered devices
def rawcallbackfunction(data, controllerId, callbackId, context):
	raw1 = string_at(data)
	run_raw = "/usr/bin/php /var/www/autosys/python_to_raw.php \"" + raw1 + "\""
	print "...RUNNING " + run_raw
	os.system(run_raw)
	print "...DONE running" + run_raw

if (platform.system() == 'Windows'):
	CMPFUNC = WINFUNCTYPE(c_void_p, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p) #first is return type
	CMPFUNCRAW = WINFUNCTYPE(c_void_p, POINTER(c_ubyte), c_int, c_int, c_void_p)
else:
	CMPFUNC = CFUNCTYPE(c_void_p, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p)
	CMPFUNCRAW = CFUNCTYPE(c_void_p, POINTER(c_ubyte), c_int, c_int, c_void_p)

cmp_func = CMPFUNC(callbackfunction)
cmp_funcraw = CMPFUNCRAW(rawcallbackfunction)

lib.tdInit()
lib.tdRegisterDeviceEvent(cmp_func, 0)
lib.tdRegisterRawDeviceEvent(cmp_funcraw, 0) #uncomment this, and comment out tdRegisterDeviceEvent, to see data for not registered devices

print "Waiting for events..."
while(1):
	time.sleep(0.5) #don't exit
Detta är python_to_php.php på samma dator:

Kod: Markera allt

<?php
include 'opendb.php';
include 'func.php';
$dbname = 'auto';

$command = $argv[1];
$device =  $argv[2];

mysql_select_db($dbname);
$query = "select * from t_devices where f_tdtool_id=$device";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result);

if ($command == "2") {
$job = $row['f_job_off'];
} else {
$job = $row['f_job_on'];
}

$url = "http://adress_till_servern_i_källaren/run_job.php?job=$job";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$status = curl_exec($ch);
curl_close($ch);

include 'closedb.php';
?>

Detta är tdtool_status.php, den uppdaterar databasen med enheternas namn och läge (on eller off)

Kod: Markera allt

<?
include 'opendb.php';
mysql_select_db("auto") or die(mysql_error());

exec("tdtool --list",$datan);
unset($datan[0]); // Vi tar bort första raden. Annars består rad 1 av "Number of devices: 14".
$count = count($datan)+1; //Vi räknar hur många rader det blev

function explodeTabs($singleLine) {
  $tabsArr = explode("\t", $singleLine); //vi delar upp statusen från tdtool i delar och skiljer dem åt genom att kolla efter tab.
  return $tabsArr;
}

for($i=1;$i<$count;$i++) { //vi kör en loop som börjar på 1 (eftersom att vi har tagit bort 0) och slutar när den har kommit till i antal rader.
$datetime = date('Y-m-d H:i:s');
  $lineDetails = explodeTabs($datan[$i]);
  $query = "UPDATE t_devices set f_value='" .$lineDetails[2]. "', f_name='" .utf8_decode($lineDetails[1]). "', f_last_sensed='" . $datetime . "' where f_tdtool_id=" . $lineDetails[0];
$result = mysql_query($query)
or die(mysql_error());
    //echo "ID : " . $lineDetails[0];
    //echo "<br>Namn : " . $lineDetails[1];
    //echo "<br>Status: " . $lineDetails[2];
    //echo "<br />DB-fr&aring;ga: $query <br /><br />";
}
?>
Jag kan inte Python så det scriptet har modifierats så gott jag kan. PHP kan jag nog helt OK iallafall. Jag kör ingen validering av datan som scripten matas med eftersom att de bara körs internt. Ingen utifrån har ju tillgång till scripten så några sql-injections eller liknande kommer inte att ske.

Alltså, Pythonscriptet körs på tv-datorn och lyssnar på Duo'n. När man trycker på en knapp på en Nexafjärr så reagerar pythonscriptet. Om det är device 12, 13 eller 14 så skall python_to_php.php köras och till scriptet så skickas deviceid och event (på eller av) med till scriptet. Scriptet kollar i sin tur i databasen vilket jobb som skall köras och anropar sedan ett script via HTTP som kör jobbet. Anledningen till att den anropar via HTTP är för att scripten körs på två olika servrar. Jag kan också göra anropet via SSH men eftersom att jag vill kunna anropa jobb-körar-scriptet via HTTP från olika ställen så blev det bäst så. Varje gång Duon tar emot något så körs också tdtool_status.php som uppdaterar databasen med status och namn på alla mottagare. Detta gör att jag alltid har aktuell status på mina mottagare (ON eller OFF) i databasen. Fördelen med det är att jag kan kolla status i databasen istället för att köra tdtool varje gång. Lite mindre resurser som går åt mao.

Rörigt men förhoppningsvis har någon användning av detta. :)
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av daromer »

Härligt.

Liknar det jag kör med redan nu fast via Plugwise.
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av daromer »

Hmm jag får varken output från python scriptet eller några tempfiler denna gången... Måste missat når
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av Niklas »

daromer skrev:Hmm jag får varken output från python scriptet eller några tempfiler denna gången... Måste missat når
Funkar tdtool som det ska?
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av daromer »

det ger inget fel men det skickar inte ut nåt heller. Dvs den blinkar inte.

Får kolla mer senare. Håller på att uppdatera mitt plugwisenät och donar... 34 enheter. Och det tar tiiiid. :D
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av daromer »

Den blinkar när jag kör tdtool för att skicka signaler samt blinkar när jag trycker på knappar i huset. Men jag ser inga events i filerna i temp eller via pythonscriptet... skumt. kör ubuntu på den burken med senaste från telldus.
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av Niklas »

daromer skrev:Den blinkar när jag kör tdtool för att skicka signaler samt blinkar när jag trycker på knappar i huset. Men jag ser inga events i filerna i temp eller via pythonscriptet... skumt. kör ubuntu på den burken med senaste från telldus.
Har du kommit vidare?

Har du "aktiverat" raden som lyssnar på raw i Pythonskriptet?
look2
Gillar hemautomation
Inlägg: 37
Blev medlem: 04 sep 2008, 11:46
Ort: arboga

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av look2 »

Gammal tråd, men jag måste ändå fråga.

Betyder detta att du kan fråga efter status på nexa brytare?
Alltså att man faktiskt vet om pryler ifråga är på eller av?
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av Niklas »

look2 skrev:Gammal tråd, men jag måste ändå fråga.

Betyder detta att du kan fråga efter status på nexa brytare?
Alltså att man faktiskt vet om pryler ifråga är på eller av?
Nej, det är inte möjligt. Pluggarna har inga sändare. Jag noterar bara vad som skickades senast.
Sen jag skrev den här tråden så är det Domoticz som sköter allt sånt åt mig.
look2
Gillar hemautomation
Inlägg: 37
Blev medlem: 04 sep 2008, 11:46
Ort: arboga

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av look2 »

trist...

För att få den funktionen måste man alltså använda det mycket dyrare z-wave ?
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Tellstick Duo och vad man kan göra(1-wire,php,python,mys

Inlägg av Niklas »

look2 skrev:trist...

För att få den funktionen måste man alltså använda det mycket dyrare z-wave ?
Svar ja. Om du vill kunna läsa status så att produkten verkligen är påslagen.
1-wire finns ju också men det är ju inte trådlöst..
Skriv svar