Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
D
domotikad
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
domotika
domotikad
Commits
f4087849
Commit
f4087849
authored
8 years ago
by
Franco (nextime) Lanza
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Image now are working!
parent
dcd83891
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
145 additions
and
19 deletions
+145
-19
weather.py
domotika/clouds/openweathermap/weather.py
+23
-3
dmdb.py
domotika/db/dmdb.py
+13
-0
domotika.py
domotika/domotika.py
+15
-0
bot.py
domotika/web/bot.py
+94
-16
No files found.
domotika/clouds/openweathermap/weather.py
View file @
f4087849
...
...
@@ -26,6 +26,12 @@ from dmlib.utils import webutils as wu
import
json
import
logging
from
domotika.db
import
dmdb
try
:
#python2
from
urllib
import
urlencode
except
ImportError
:
#python3
from
urllib.parse
import
urlencode
try
:
...
...
@@ -34,6 +40,18 @@ except:
log
=
logging
.
getLogger
(
'Core'
)
HEADERS
=
{
'User-Agent'
:
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"
,
"Accept"
:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
,
"Accept-Encoding"
:
"gzip, deflate, sdch"
,
"Cache-Control"
:
"no-cache"
,
"Connection"
:
"keep-alive"
,
"DNT"
:
"1"
,
"Host"
:
"api.openweathermap.org"
,
"Pragma"
:
"no-cache"
,
"Upgrade-Insecure-Request"
:
"1"
,
}
class
OWMWeather
(
object
):
usecity
=
False
...
...
@@ -56,11 +74,13 @@ class OWMWeather(object):
def
_getReport
(
self
):
log
.
debug
(
"Weather get report"
)
if
self
.
usecity
:
page
=
"http://api.openweathermap.org/data/2.5/weather?
q="
+
str
(
self
.
city
)
+
"&units=metric"
page
=
"http://api.openweathermap.org/data/2.5/weather?
"
+
urlencode
({
'q'
:
str
(
self
.
city
)}
)
+
"&units=metric"
else
:
page
=
"http://api.openweathermap.org/data/2.5/weather?lat="
+
str
(
self
.
lat
)
+
"&lon="
+
str
(
self
.
lon
)
+
"&mode=json&units=metric"
page
+=
"&APPID="
+
str
(
self
.
owmid
)
cb
=
wu
.
getPage
(
page
,
headers
=
{
'x-api-key'
:
str
(
self
.
owmid
)})
.
addCallbacks
(
self
.
onData
,
self
.
onError
)
page
+=
"&APPID="
+
str
(
self
.
owmid
)
log
.
info
(
"Requesting for "
+
str
(
page
))
uagent
=
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"
cb
=
wu
.
getPage
(
page
,
headers
=
HEADERS
)
.
addCallbacks
(
self
.
onData
,
self
.
onError
)
def
updateDatabase
(
self
):
for
k
in
self
.
data
.
keys
():
...
...
This diff is collapsed.
Click to expand it.
domotika/db/dmdb.py
View file @
f4087849
...
...
@@ -939,3 +939,16 @@ def getVoiceCommandList():
qstring
=
"SELECT speech_string FROM speech_actions WHERE active=1"
return
runQuery
(
qstring
)
def
getScreenshotUri
(
target
):
qstring
=
"select screenshot from mediasources where button_name LIKE '"
+
target
+
"
%
' limit 1"
return
runQuery
(
qstring
)
def
getClimaUniques
():
qstring
=
"select name, value from uniques where name='climastatus' OR name='last.rain' OR name LIKE 'owm.
%
'"
return
runQuery
(
qstring
)
def
getThermostats
():
qstring
=
"select t.button_name, t.setval, a.status, t.function from thermostats as t, anastatus as a WHERE a.ananame=t.name"
return
runQuery
(
qstring
)
This diff is collapsed.
Click to expand it.
domotika/domotika.py
View file @
f4087849
...
...
@@ -2455,6 +2455,21 @@ class domotikaService(service.Service):
def
web_on_getScreenshotList
(
self
,
screenshot
=
True
):
return
dmdb
.
getScreenshotList
(
screenshot
=
screenshot
)
def
web_on_getScreenshot
(
self
,
target
):
def
imageReturn
(
img
):
return
img
def
prepareScreenshot
(
res
):
if
res
:
return
wu
.
getPage
(
res
[
0
][
0
])
.
addCallback
(
imageReturn
)
return
False
return
dmdb
.
getScreenshotUri
(
target
)
.
addCallback
(
prepareScreenshot
)
def
web_on_getClimaUniques
(
self
):
return
dmdb
.
getClimaUniques
()
def
web_on_getThermostats
(
self
):
return
dmdb
.
getThermostats
()
def
web_on_getChartData
(
self
,
chartname
):
log
.
debug
(
'GET CHART DATA FOR '
+
str
(
chartname
))
return
dmdb
.
getChartData
(
chartname
)
.
addCallback
(
self
.
getChartData
,
chartname
)
...
...
This diff is collapsed.
Click to expand it.
domotika/web/bot.py
View file @
f4087849
...
...
@@ -11,14 +11,15 @@ from dmlib.utils import webutils as wu
import
hashlib
import
hmac
import
six
import
time
from
Queue
import
Queue
import
uuid
from
domotika.singleton
import
messengerlinks
_MESSENGER_LINKS
=
messengerlinks
.
MessengerLinkRegistry
()
_MESSENGER_PSID
=
messengerlinks
.
MessengerPSIDRegistry
()
try
:
#python2
from
urllib
import
urlencode
...
...
@@ -68,6 +69,13 @@ def messengerValidator():
return
checkRequest
class
MessengerMessage
(
object
):
def
__init__
(
self
,
headers
,
payload
,
uri
):
self
.
headers
=
headers
self
.
payload
=
payload
self
.
uri
=
uri
class
MessengerCore
(
object
):
def
_cfgGet
(
self
,
keyword
):
...
...
@@ -78,6 +86,8 @@ class MessengerBot(BotCore, MessengerCore):
path
=
"messenger"
graphuri
=
'https://graph.facebook.com/v2.6'
sendQueue
=
Queue
()
sendlock
=
False
#graphuri = 'http://192.168.4.2/v2.6'
@
property
...
...
@@ -106,9 +116,19 @@ class MessengerBot(BotCore, MessengerCore):
def
_dataError
(
self
,
res
):
log
.
info
(
'Messenger BOT Datasent ERROR'
)
log
.
error
(
res
)
log
.
debug
(
res
.
value
.
reasons
[
0
]
.
printTraceback
())
try
:
log
.
debug
(
res
.
value
.
reasons
[
0
]
.
printTraceback
())
except
:
pass
def
_sendRaw
(
self
):
if
not
self
.
sendQueue
.
empty
()
and
not
self
.
sendLock
:
message
=
self
.
sendQueue
.
get
()
return
wu
.
getPage
(
message
.
uri
,
method
=
'POST'
,
headers
=
message
.
headers
,
postdata
=
message
.
payload
)
.
addCallbacks
(
self
.
_dataSent
,
self
.
_dataError
)
def
sendAPI
(
self
,
payload
,
req_uri
=
'/me/messages'
):
request_endpoint
=
self
.
graphuri
+
req_uri
...
...
@@ -207,16 +227,19 @@ class MessengerBot(BotCore, MessengerCore):
if
txt
==
u'hello'
or
txt
==
u'ciao'
:
self
.
sendMessage
(
senderid
,
'Hello
%
s, how can i help you?'
%
(
_MESSENGER_PSID
.
get_link
(
senderid
)))
elif
txt
==
u'?'
or
txt
==
u'help'
:
self
.
sendMessage
(
senderid
,
'Ok, devo ancora implementare l
\'
aiuto!'
)
self
.
sendMessage
(
senderid
,
'Ok, devo ancora implementare l
\'
aiuto! Sorry for that!'
)
self
.
sendMessage
(
senderid
,
'Anyway, i comandi che hai sono: "command list", "screenshot list", "screenshot" e "clima".'
)
self
.
sendMessage
(
senderid
,
'Qualsiasi altro comando viene interpretato come un potenziale comando vocale.'
)
elif
txt
==
u'logout'
:
self
.
sendMessage
(
senderid
,
'Ok, devo ancora implementare anche il logout'
)
elif
txt
==
u'command list'
:
elif
txt
==
u'command list'
or
txt
==
'cmd list'
:
self
.
sendCommandList
(
senderid
)
elif
txt
==
u'screenshot list'
:
elif
txt
==
u'screenshot list'
or
txt
==
u'ss list'
:
self
.
sendScreenshotList
(
senderid
)
elif
txt
.
startswith
(
'screenshot '
):
elif
txt
.
startswith
(
'screenshot '
)
or
txt
.
startswith
(
'ss '
)
:
self
.
sendScreenshot
(
senderid
,
" "
.
join
(
txt
.
split
()[
1
:]))
elif
txt
==
u'clima'
:
self
.
sendClima
(
senderid
)
else
:
self
.
core
.
voiceReceived
(
txt
,
confidence
=
1.0
,
lang
=
"it"
)
.
addCallback
(
voiceResult
)
...
...
@@ -246,20 +269,39 @@ class MessengerBot(BotCore, MessengerCore):
self
.
sendMessage
(
senderid
,
"Target list for string/voice commands (call them with the right action like up,down,open,close and so on.):"
)
self
.
core
.
getVoiceCommandList
()
.
addCallback
(
pushList
)
def
sendScreenshotList
(
self
,
sender
id
):
def
sendScreenshotList
(
self
,
recipient_
id
):
def
pushList
(
res
):
for
r
in
res
:
self
.
sendMessage
(
sender
id
,
" * "
+
str
(
r
[
0
]))
self
.
sendMessage
(
sender
id
,
"Cam list:"
)
self
.
sendMessage
(
recipient_
id
,
" * "
+
str
(
r
[
0
]))
self
.
sendMessage
(
recipient_
id
,
"Cam list:"
)
self
.
core
.
getScreenshotList
()
.
addCallback
(
pushList
)
def
sendScreenshot
(
self
,
sender
id
,
target
):
def
sendScreenshot
(
self
,
recipient_
id
,
target
):
def
pushImage
(
res
):
self
.
sendImageMessage
(
recipient_id
,
res
)
self
.
core
.
getScreenshot
(
target
)
.
addCallback
(
pushImage
)
if
res
:
self
.
sendImageMessageData
(
recipient_id
,
res
)
else
:
self
.
sendMessage
(
recipient_id
,
'Cannot retrieve image of '
+
str
(
target
))
if
target
.
endswith
(
'
%
'
):
target
=
target
[:
-
1
]
if
len
(
target
)
>
0
:
self
.
core
.
getScreenshot
(
target
)
.
addCallback
(
pushImage
)
def
sendClima
(
self
,
recipient_id
):
def
pushClima
(
res
):
for
r
in
res
:
if
r
[
0
]
==
'last.rain'
:
msg
=
r
[
0
]
+
": "
+
time
.
strftime
(
'
%
d-
%
m-
%
Y
%
H:
%
M:
%
S'
,
time
.
localtime
(
int
(
r
[
1
])))
else
:
msg
=
r
[
0
]
+
": "
+
str
(
r
[
1
])
self
.
sendMessage
(
recipient_id
,
msg
)
def
pushThermo
(
res
):
for
r
in
res
:
msg
=
r
[
0
]
+
": set "
+
str
(
r
[
1
])
+
" read "
+
str
(
float
(
r
[
2
])
/
10
)
+
" function "
+
r
[
3
]
self
.
sendMessage
(
recipient_id
,
msg
)
return
self
.
core
.
getClimaUniques
()
.
addCallback
(
pushClima
)
self
.
core
.
getThermostats
()
.
addCallback
(
pushThermo
)
def
sendMessage
(
self
,
recipient_id
,
message
):
payload
=
{
...
...
@@ -288,6 +330,42 @@ class MessengerBot(BotCore, MessengerCore):
}
return
self
.
sendAPI
(
payload
)
def
sendImageMessageData
(
self
,
recipient_id
,
imagedata
):
payload
=
{
'recipient'
:
{
'id'
:
recipient_id
},
'message'
:
{
'attachment'
:
{
'type'
:
'image'
,
'payload'
:
{}
}
}
}
fname
=
str
(
uuid
.
uuid4
()
.
get_hex
())
+
'.jpg'
bond
=
"------------------------"
+
str
(
uuid
.
uuid4
()
.
get_hex
())[:
16
]
data
=
"--"
+
bond
+
"
\r\n
"
data
+=
"Content-Disposition: form-data; name=
\"
recipient
\"\r\n\r\n
"
data
+=
"{
\"
id
\"
:
\"
"
+
str
(
recipient_id
)
+
"
\"
}
\r\n
"
data
+=
"--"
+
bond
+
"
\r\n
"
data
+=
"Content-Disposition: form-data; name=
\"
message
\"\r\n\r\n
"
data
+=
'{"attachment":{"type":"image", "payload":{}}}'
+
"
\r\n
"
data
+=
"--"
+
bond
+
"
\r\n
"
data
+=
'Content-Disposition: form-data; name="filedata"; filename="'
+
fname
+
'"'
+
"
\r\n
"
data
+=
'Content-Type: image/jpeg'
+
"
\r\n\r\n
"
data
+=
str
(
imagedata
)
data
+=
"
\r\n
--"
+
bond
+
"--
\r\n
"
headers
=
{
'Accept'
:
'*/*'
,
'Content-Type'
:
'multipart/form-data; boundary='
+
bond
}
request_endpoint
=
self
.
graphuri
+
'/me/messages'
request_uri
=
request_endpoint
+
'?'
+
urlencode
(
self
.
auth_args
)
return
wu
.
getPage
(
request_uri
,
agent
=
"curl/7.50.1"
,
method
=
'POST'
,
headers
=
headers
,
postdata
=
data
,
expect100
=
True
)
.
addCallbacks
(
self
.
_dataSent
,
self
.
_dataError
)
def
sendAuthRequest
(
self
,
recipient_id
):
payload
=
{
'recipient'
:
{
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment