forked from OpenZWave/python-openzwave
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhello_world.html
More file actions
249 lines (239 loc) · 19 KB
/
Copy pathhello_world.html
File metadata and controls
249 lines (239 loc) · 19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>python-openzwave hello_world — python-openzwave 0.3.0b8 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '0.3.0b8',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="python-openzwave 0.3.0b8 documentation" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">python-openzwave 0.3.0b8 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="python-openzwave-hello-world">
<h1>python-openzwave hello_world<a class="headerlink" href="#python-openzwave-hello-world" title="Permalink to this headline">¶</a></h1>
<p>Here is the hello_world example for the python-openzwave API. In this
tutorial we will implement a simple sniffer. The full code is available
in the examples directory : hello_world.py.</p>
<div class="section" id="some-theory">
<h2>Some theory<a class="headerlink" href="#some-theory" title="Permalink to this headline">¶</a></h2>
<p>OpenZwave uses the mechanism of notifications to manage events network.
When the driver is ready, the node is added, a value is modified, ... openzwave
generates a notification you must catch with a callback function.</p>
<p>Python-openzwave API catch the notification and send a louie signal.</p>
<p>Some words about python-louie : it’s a simple mechanism where a dispatcher
send a signal on a channel, and clients connect to him.</p>
<p>Here is the way a sender dispatch a signal :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">dispatcher</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">SIGNAL_NODE</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s">'network'</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span> <span class="s">'node'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="s">'nodeId'</span><span class="p">]]})</span>
</pre></div>
</div>
<p>Here is the way a client connect to a channel :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_node_update</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_NODE</span><span class="p">)</span>
</pre></div>
</div>
<p>The first argument is a call back function :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_node_update</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Louie signal : Node update : </span><span class="si">%s</span><span class="s">.'</span> <span class="o">%</span> <span class="n">node</span><span class="p">)</span>
</pre></div>
</div>
<p>It receives as parameters the ones populate by the sender : the network ans a node in ths case.
The callback must set its parameter names as the same as the sender.</p>
</div>
<div class="section" id="hello-from-zwave">
<h2>Hello from ZWave<a class="headerlink" href="#hello-from-zwave" title="Permalink to this headline">¶</a></h2>
<p>The import clauses :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">openzwave</span>
<span class="kn">from</span> <span class="nn">openzwave.node</span> <span class="kn">import</span> <span class="n">ZWaveNode</span>
<span class="kn">from</span> <span class="nn">openzwave.value</span> <span class="kn">import</span> <span class="n">ZWaveValue</span>
<span class="kn">from</span> <span class="nn">openzwave.scene</span> <span class="kn">import</span> <span class="n">ZWaveScene</span>
<span class="kn">from</span> <span class="nn">openzwave.controller</span> <span class="kn">import</span> <span class="n">ZWaveController</span>
<span class="kn">from</span> <span class="nn">openzwave.network</span> <span class="kn">import</span> <span class="n">ZWaveNetwork</span>
<span class="kn">from</span> <span class="nn">openzwave.option</span> <span class="kn">import</span> <span class="n">ZWaveOption</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">louie</span> <span class="kn">import</span> <span class="n">dispatcher</span><span class="p">,</span> <span class="n">All</span>
</pre></div>
</div>
<p>First thing to do is to defined some options for the manager :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">options</span> <span class="o">=</span> <span class="n">ZWaveOption</span><span class="p">(</span><span class="n">device</span><span class="p">,</span> <span class="n">config_path</span><span class="o">=</span><span class="s">"../openzwave/config"</span><span class="p">,</span> <span class="n">user_path</span><span class="o">=</span><span class="s">"."</span><span class="p">,</span> <span class="n">cmd_line</span><span class="o">=</span><span class="s">""</span><span class="p">)</span>
<span class="n">options</span><span class="o">.</span><span class="n">set_log_file</span><span class="p">(</span><span class="s">"OZW_Log.log"</span><span class="p">)</span>
<span class="n">options</span><span class="o">.</span><span class="n">set_append_log_file</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="n">options</span><span class="o">.</span><span class="n">set_console_output</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="n">options</span><span class="o">.</span><span class="n">set_save_log_level</span><span class="p">(</span><span class="s">'Debug'</span><span class="p">)</span>
<span class="n">options</span><span class="o">.</span><span class="n">set_logging</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="n">network</span> <span class="o">=</span> <span class="bp">None</span>
</pre></div>
</div>
<p>We also defined a network object, we will populate it later.</p>
<p>To use this options, you must lock them. No further modification could be done on them.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">options</span><span class="o">.</span><span class="n">lock</span><span class="p">()</span>
</pre></div>
</div>
<p>We can now create the network :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">network</span> <span class="o">=</span> <span class="n">ZWaveNetwork</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">autostart</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="the-signals-listeners">
<h2>The signals listeners<a class="headerlink" href="#the-signals-listeners" title="Permalink to this headline">¶</a></h2>
<p>We will now create some connection to the louie dispatcher. We will then to 3
main signals, they will notify us about the state of the network :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_network_started</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_NETWORK_STARTED</span><span class="p">)</span>
<span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_network_failed</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_NETWORK_FAILED</span><span class="p">)</span>
<span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_network_ready</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_NETWORK_READY</span><span class="p">)</span>
</pre></div>
</div>
<p>To do that we use 3 callback functions :</p>
<p>When the driver is ready, we simply print some options on the screen :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_network_started</span><span class="p">(</span><span class="n">network</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Hello from network : I'm started : homeid </span><span class="si">%0.8x</span><span class="s"> - </span><span class="si">%d</span><span class="s"> nodes were found."</span> <span class="o">%</span> <span class="p">(</span><span class="n">network</span><span class="o">.</span><span class="n">home_id</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">nodes_count</span><span class="p">))</span>
</pre></div>
</div>
<p>When the driver fails, we reports the error to screen :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_network_failed</span><span class="p">(</span><span class="n">network</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Hello from network : can't load :(."</span><span class="p">)</span>
</pre></div>
</div>
<p>This an important event. It means that all nodes have been queried on the network.
You can now use the network object pass in parameter to query nodes. To do that we connect
to some louie signals. It also sleep during 5 minutes. After that, the scripts
will continue and the network will be stopped.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_network_ready</span><span class="p">(</span><span class="n">network</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Hello from network : I'm ready : </span><span class="si">%d</span><span class="s"> nodes were found."</span> <span class="o">%</span> <span class="n">network</span><span class="o">.</span><span class="n">nodes_count</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Hello from network : my controller is : </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">network</span><span class="o">.</span><span class="n">controller</span><span class="p">)</span>
<span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_node_update</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_NODE</span><span class="p">)</span>
<span class="n">dispatcher</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">louie_value_update</span><span class="p">,</span> <span class="n">ZWaveNetwork</span><span class="o">.</span><span class="n">SIGNAL_VALUE</span><span class="p">)</span>
</pre></div>
</div>
<p>When a node is updated, added, removed, ...</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_node_update</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Hello from node : </span><span class="si">%s</span><span class="s">.'</span> <span class="o">%</span> <span class="n">node</span><span class="p">)</span>
</pre></div>
</div>
<p>When a value is updated, added, removed, ...</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">louie_value_update</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Hello from value : </span><span class="si">%s</span><span class="s">.'</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="the-start-code">
<h2>The start code<a class="headerlink" href="#the-start-code" title="Permalink to this headline">¶</a></h2>
<p>We start the network</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">network</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</pre></div>
</div>
<p>And we wait for the network. You MUST NOT use the network objects before
network is ready.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">90</span><span class="p">):</span>
<span class="k">if</span> <span class="n">network</span><span class="o">.</span><span class="n">state</span><span class="o">>=</span><span class="n">network</span><span class="o">.</span><span class="n">STATE_READY</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"***** Network is ready"</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"."</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
</pre></div>
</div>
<p>We now change the name of the controller. You will have a notification.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">network</span><span class="o">.</span><span class="n">controller</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Hello name"</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">10.0</span><span class="p">)</span>
</pre></div>
</div>
<p>Same when changing the location.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">network</span><span class="o">.</span><span class="n">controller</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="s">"Hello location"</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">120.0</span><span class="p">)</span>
</pre></div>
</div>
<p>And we wait for 2 minutes. If you have sensors on your network, you will
see the value notifications on the screen. If you have switch or dimmers,
activate them manually, ...</p>
<p>Now stop the network and release objects.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">network</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
</pre></div>
</div>
<p>That’s all :)</p>
<p>Full source code is in examples/hello_world.py</p>
<p>To see a more functionnal example, look at ozwsh code.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">python-openzwave hello_world</a><ul>
<li><a class="reference internal" href="#some-theory">Some theory</a></li>
<li><a class="reference internal" href="#hello-from-zwave">Hello from ZWave</a></li>
<li><a class="reference internal" href="#the-signals-listeners">The signals listeners</a></li>
<li><a class="reference internal" href="#the-start-code">The start code</a></li>
</ul>
</li>
</ul>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/hello_world.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">python-openzwave 0.3.0b8 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2012,2013,2014,2015, bibi21000.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>