<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4797167376881538347</id><updated>2024-08-30T05:45:59.392+03:00</updated><category term="django"/><category term="debian"/><category term="Eclipse"/><category term="musicmans.ru"/><category term="OpenHAB"/><category term="умный дом"/><category term="1-wire"/><category term="linux"/><category term="cubietruck"/><category term="owfs"/><category term="Redmine"/><category term="SmartGWT"/><category term="python"/><category term="subversion"/><category term="философия"/><category term="apache2"/><category term="form"/><category term="freebsd"/><category term="openremote"/><category term="owserver"/><category term=".NET"/><category term="ARM"/><category term="DS18B20"/><category term="DS9490R"/><category term="Google Chorme"/><category term="Google Web Toolkit"/><category term="Home Assistant"/><category term="cubieboard"/><category term="django-piston"/><category term="forms"/><category term="formset"/><category term="git"/><category term="gwt"/><category term="java"/><category term="javascript"/><category term="kvm"/><category term="pip"/><category term="postgresql"/><category term="rtorrent"/><category term="svn"/><category term="trac"/><category term="validation"/><category term="windows"/><category term="Бердяев"/><category term="жизнь"/><category term="любовь"/><category term="политика"/><category term="проза"/><category term="работа"/><category term="сайт"/><category term="ссылки"/><category term="#"/><category term=".NET C#"/><category term="3d"/><category term="AVerTV"/><category term="Asterisk"/><category term="C#"/><category term="C++"/><category term="CPU"/><category term="CentOS"/><category term="Context"/><category term="CppCMS"/><category term="D-Link DCS-950G"/><category term="DS2406P"/><category term="EGit"/><category term="Eclipse Marketplace"/><category term="Elastix"/><category term="Framework"/><category term="GWT Designer"/><category term="Google Code"/><category term="Google Web Toolkit 2"/><category term="HABDroid"/><category term="KDiff3"/><category term="LockHunter"/><category term="Nhibernate"/><category term="ORM"/><category term="OpenDNS"/><category term="Phusion Passenger"/><category term="Process Explorer"/><category term="Puma.NET"/><category term="PyDev"/><category term="REST"/><category term="RequestContext"/><category term="Restlet Framework"/><category term="SQL"/><category term="Sonoff"/><category term="South"/><category term="UNetbootin"/><category term="Vinagre"/><category term="Visual Studio"/><category term="Visual Studio 2005"/><category term="Web"/><category term="Xiaomi Gateway"/><category term="amd64"/><category term="apcupsd"/><category term="asus eee pc"/><category term="attrs"/><category term="backup"/><category term="bash"/><category term="blender"/><category term="chromebug"/><category term="csh"/><category term="debug"/><category term="django-annoying"/><category term="django-compressor"/><category term="django-json-rpc"/><category term="django-maintenancemode"/><category term="django-messages"/><category term="django-notification"/><category term="django-publicauth"/><category term="django-registration"/><category term="dns"/><category term="epel"/><category term="etch"/><category term="fabric"/><category term="field"/><category term="file manager"/><category term="firebug"/><category term="flash"/><category term="foobar2000"/><category term="formsets"/><category term="gitextensions"/><category term="gitosis"/><category term="googlefight.com"/><category term="gpg"/><category term="gui"/><category term="gwt-json-rpc"/><category term="img"/><category term="inclusion_tag"/><category term="ip-телефония"/><category term="izmenimsya.ru"/><category term="jabber"/><category term="kubuntu"/><category term="ldap"/><category term="lenny"/><category term="lighttpd"/><category term="mi home"/><category term="mod_rails"/><category term="modelform"/><category term="modelforms"/><category term="modules"/><category term="mprime"/><category term="mylyn"/><category term="mysql"/><category term="n800"/><category term="network manager"/><category term="now playing"/><category term="patterns"/><category term="pidgin"/><category term="pidgin-musictracker"/><category term="python-mssql"/><category term="queryset"/><category term="quickstart"/><category term="re"/><category term="regex"/><category term="render"/><category term="rutorrent"/><category term="scrolling position"/><category term="skydrive"/><category term="squeeze"/><category term="sysbench"/><category term="tar"/><category term="template"/><category term="traceback"/><category term="udf"/><category term="udftools"/><category term="unlock"/><category term="utils"/><category term="view"/><category term="virtual server"/><category term="vnc"/><category term="who lock me"/><category term="wicd"/><category term="widget"/><category term="wsgi"/><category term="yandex-disk"/><category term="Видеонаблюдение"/><category term="ЛУТ"/><category term="архивирование"/><category term="безопасность"/><category term="бекап"/><category term="блоги"/><category term="боль"/><category term="виртуализация"/><category term="гикство"/><category term="заработок"/><category term="интеренет"/><category term="интересное"/><category term="интернет"/><category term="истеричные женщины"/><category term="классика"/><category term="компьютеры"/><category term="мир объектов"/><category term="музыка"/><category term="музыкальные жанры и стили"/><category term="мысли"/><category term="нацизм"/><category term="национализм"/><category term="непонятнки"/><category term="объявление"/><category term="осень"/><category term="оффтопик"/><category term="очумелые ручки"/><category term="полезно"/><category term="программирование"/><category term="сео"/><category term="скачать"/><category term="смысл жизни"/><category term="софт"/><category term="толкования"/><category term="файловая система"/><category term="файловые менеджеры"/><category term="хранилище"/><category term="цитаты"/><title type='text'>Vermus</title><subtitle type='html'>Программирование, администрирование, музыка, мысли.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>104</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-540340544231905326</id><published>2020-10-15T10:18:00.001+03:00</published><updated>2020-10-15T10:19:47.935+03:00</updated><title type='text'>Создание переключателя Home Assistant для управления правилом фаервола Mikrotik</title><content type='html'>&lt;p&gt;Потребовалось тут выключать\включать правило в ip/firewall/filter в микротике. На данный момент нашел три компонента для работы с микротиком. &lt;a href=&quot;https://www.home-assistant.io/integrations/mikrotik/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Стандартная&lt;/a&gt;, которая ничего не умеет, кроме как обнаружить есть ли микротик в сети. &lt;a href=&quot;https://github.com/pilotak/homeassistant-mikrotik&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Простенький компонент&lt;/a&gt;, но без документации. &lt;a href=&quot;https://github.com/tomaae/homeassistant-mikrotik_router&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Серьезный компонент&lt;/a&gt;, работающий по winbox api.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Но мне хотелось более простого варианта. Чтобы не грузить лишние компоненты в Home Assistant (HA). И такой вариант есть - это работа через ssh.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Подключаем&amp;nbsp;SSH Public Key Authentication&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;С паролем работать из HA с ssh непросто,&amp;nbsp; по-крайней мере я нашел кучу тем без ответа как это делать и сразу перешекл к рабочему и более правильному варианту - авторизация по публичному ключу. Там все стандартно, создем пару ключей на клиенте (HA), закидываем публичный на микротик:&lt;/p&gt;

&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;ha_user@ha:~$ ssh-keygen -t rsa
ha_user@ha:~$ scp ~/.ssh/id_rsa.pub admin@192.168.1.1:mykey.pub
&lt;/pre&gt;


&lt;p&gt;Далее импортируем файл публичного ключа в пользователя:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYHQDdLdcYlH7RonhVFoejBjFKx9CmthQTHPmyphvWKpPTho21aUfrPHsn2IUNqByOf9EWN0-ZIoDq3369eTmi0WLs8B2tqIK8Cajeg_x08spsvNEea40EkhgNFjvisXYWpi1Es4q/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;329&quot; data-original-width=&quot;599&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYHQDdLdcYlH7RonhVFoejBjFKx9CmthQTHPmyphvWKpPTho21aUfrPHsn2IUNqByOf9EWN0-ZIoDq3369eTmi0WLs8B2tqIK8Cajeg_x08spsvNEea40EkhgNFjvisXYWpi1Es4q/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;Тестируем, что можем зайти в mikrotik без пароля &lt;span style=&quot;background-color: whitesmoke; color: #333333; font-family: Menlo, Monaco, Consolas, &amp;quot;courier new&amp;quot;, monospace; font-size: 13px; text-align: left;&quot;&gt;ssh admin@192.168.1.1 &quot;/system resource print&quot;.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Настраиваем Switch в Home Assistant.&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;прописываем в configuration.yaml:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;switch:
  - platform: command_line
    switches:
      rule_1:
        command_on: &quot;ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no admin@192.168.1.1 &#39;/ip firewall filter disable 1&#39;&quot;
        command_off: &quot;ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no admin@192.168.1.1 &#39;/ip firewall filter enable 1&#39;&quot;
        command_state: &quot;ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no admin@192.168.1.1 &#39;/put [ip firewall filter get number=1 disabled]&#39;&quot;
        value_template: &#39;{{ value == &quot;true&quot; }}&#39;
        friendly_name: Rule 1&amp;nbsp;&lt;/pre&gt;

&lt;p&gt;value_template - параметр который работает с ответом от command_state. Так как command_state нам возвращает &quot;true&quot;\&quot;false&quot; а не &quot;0&quot; как трубет command_state, то используем его. Конечно, лучше завести нового пользователя в микротике, с ограничением прав только на данные операции. Выключатель готов:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRS5slYsr95bzzPFRIXWXrzUh-inT_812ImhxO5Z3d5xTNw1_CEOv8LLZIjWMk3bLTTjwAteBwsKagz4iTeN8gTWgSF_ERhQwuP6OUQA25qm9V6oMhcqwlMQwgf1LgLqJVuRt3KijY/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;220&quot; data-original-width=&quot;994&quot; height=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRS5slYsr95bzzPFRIXWXrzUh-inT_812ImhxO5Z3d5xTNw1_CEOv8LLZIjWMk3bLTTjwAteBwsKagz4iTeN8gTWgSF_ERhQwuP6OUQA25qm9V6oMhcqwlMQwgf1LgLqJVuRt3KijY/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/540340544231905326/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2020/10/home-assistant-mikrotik.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/540340544231905326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/540340544231905326'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2020/10/home-assistant-mikrotik.html' title='Создание переключателя Home Assistant для управления правилом фаервола Mikrotik'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYHQDdLdcYlH7RonhVFoejBjFKx9CmthQTHPmyphvWKpPTho21aUfrPHsn2IUNqByOf9EWN0-ZIoDq3369eTmi0WLs8B2tqIK8Cajeg_x08spsvNEea40EkhgNFjvisXYWpi1Es4q/s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-5109016036329437068</id><published>2020-03-17T15:10:00.001+03:00</published><updated>2020-03-17T15:11:17.538+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Home Assistant"/><category scheme="http://www.blogger.com/atom/ns#" term="Sonoff"/><title type='text'>Подключение выключателя Sonoff T4EU1C к Home Assistant</title><content type='html'>Выключатели Xiaomi довольно дорогие, и не входят в стандартный российский подрозетник. Поэтому было решено купить выключатель Sonoff TXT4EU1C, который в два раза дешевле. Он работает поверх сети wifi. Никаких ZigBee. 
Это выключатель работает в разрыв фазы, дополнительно надо установить Antiflicker Module, параллельно лампе, который и будет замыкать цепь и питать наш выключатель.
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglQOBuiI0RMF5ndvShp5Z-QZ_pV_PLnRYG7DSeHIAOQVARylawWvWSitqZWmD6Vzn3gFxOhm5I9DKhtqVgiG0CnAiGklZG-3BZoK5CUr0n_sB_AKvmwXDDK85sv4acgRwWCyxJD-9h/s1600/sono.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglQOBuiI0RMF5ndvShp5Z-QZ_pV_PLnRYG7DSeHIAOQVARylawWvWSitqZWmD6Vzn3gFxOhm5I9DKhtqVgiG0CnAiGklZG-3BZoK5CUr0n_sB_AKvmwXDDK85sv4acgRwWCyxJD-9h/s320/sono.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Подключаем Sonoff T4EU1C к Home Assistant &lt;/b&gt;
&lt;br /&gt;
Буквально на днях наши соотечественники &lt;a href=&quot;https://github.com/AlexxIT/SonoffLAN&quot;&gt;выпустили перспектинвую библиотеку SonoffLAN&lt;/a&gt; для испозования Sonoff устройств в Home Assistant. Ну что же, попробуем. 
&lt;br /&gt;
Для начала устанавливаем приложение ewelink для регистрации устройства в профиле. Именного из профиля SonoffLAN будет брать всю информацию об устройствах Sonoff. Хотя вы можете прописать всю информацию врчуную, но в этом случае, я так понимаю, все равно нужно приложения, для подключния Sonoff устройства к вашей wifi сети.
&lt;br /&gt;
Качаем библиотеку 
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#wget https://github.com/AlexxIT/SonoffLAN/archive/master.zip
&lt;/pre&gt;
&lt;br /&gt;
Распаковываем библиотеку в директорию Home Assistant:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;/config/custom_components/sonoff/
&lt;/pre&gt;
&lt;br /&gt;
Прописываем логин пароль от eWeLink в /config/configuration.yaml:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;sonoff:
  username: mymail@gmail.com
  password: mypassword
&lt;/pre&gt;
&lt;br /&gt;
Перезапускаем сервер Home Assistant из web приложения. И получаем выключатель в Home Assistant&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvS5XM5TOERy-fd5Ep1oLHvNbG2Gu9Htcnamzl7yARF8dQ78An2MbxN5Wg4PwmkFerCSI3dAxxutQtzbaUHrY8qoBUE6drIX_moswNV0CdA36EcFm5GwKL8cnPsd0Dw521r1LsA9zy/s1600/svet.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;176&quot; data-original-width=&quot;1082&quot; height=&quot;52&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvS5XM5TOERy-fd5Ep1oLHvNbG2Gu9Htcnamzl7yARF8dQ78An2MbxN5Wg4PwmkFerCSI3dAxxutQtzbaUHrY8qoBUE6drIX_moswNV0CdA36EcFm5GwKL8cnPsd0Dw521r1LsA9zy/s320/svet.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
На удивление просто, и писать больше собственоо нечего. :) </content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/5109016036329437068/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2020/03/sonoff-t4eu1c-home-assistant.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/5109016036329437068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/5109016036329437068'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2020/03/sonoff-t4eu1c-home-assistant.html' title='Подключение выключателя Sonoff T4EU1C к Home Assistant'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglQOBuiI0RMF5ndvShp5Z-QZ_pV_PLnRYG7DSeHIAOQVARylawWvWSitqZWmD6Vzn3gFxOhm5I9DKhtqVgiG0CnAiGklZG-3BZoK5CUr0n_sB_AKvmwXDDK85sv4acgRwWCyxJD-9h/s72-c/sono.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-1698810149056756582</id><published>2020-03-16T17:45:00.000+03:00</published><updated>2020-03-16T18:02:16.152+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Home Assistant"/><category scheme="http://www.blogger.com/atom/ns#" term="mi home"/><category scheme="http://www.blogger.com/atom/ns#" term="Xiaomi Gateway"/><title type='text'>Подключение Xiaomi Gateway (Aqara) к Home Assistant</title><content type='html'>&lt;b&gt;Установка home assistant&lt;/b&gt;
&lt;br /&gt;
Я выбрал вариант для докера (установил docker и portainer (очень удобный веб интерфейс для управления контейнерами). Установка home-assistant описана тут: &lt;a href=&quot;https://www.home-assistant.io/docs/installation/docker/&quot;&gt;https://www.home-assistant.io/docs/installation/docker/&lt;/a&gt; .
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Режим разработчика или DIY Xiaomi Gateway (Aqara)&lt;/b&gt;
&lt;br /&gt;
Устанавливаем приложение Mi Home на телефон IOS или Android, добавляем шлюз средствами программы. Активируем режим разработчика (внимание, на данный момент поддерживаются только хабы Aqara версии v2, в дригух пока такого режима нет. В версии 3 можно использовать через Apple Home, гуглите).
&lt;br /&gt;
Заходим в хаб, нажимаем Сведения (About) в меню, нажимаем пять раз на версию приложения пока не появятся дополнительные меню на английском (нам нужно меню wireless communication protocol, в нем вы увидите пароль для хаба).
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtNDUyH3zqtrL7X-ihUs2pSwOQAco9MxVRu9KBcuZbHywZP1P1St2sfSkAityUy2yKqUgifQWL5KvEUYYfmqmcTjdwIuLVtjEsWgfimI9YGSijRs0upbiX6-eAWM18H0zWvFVLNSSO/s1600/pass.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1449&quot; data-original-width=&quot;723&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtNDUyH3zqtrL7X-ihUs2pSwOQAco9MxVRu9KBcuZbHywZP1P1St2sfSkAityUy2yKqUgifQWL5KvEUYYfmqmcTjdwIuLVtjEsWgfimI9YGSijRs0upbiX6-eAWM18H0zWvFVLNSSO/s320/pass.jpg&quot; width=&quot;160&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Привязываем хаб Xiaomi Gateway (Aqara) к home assistant&lt;/b&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.home-assistant.io/integrations/xiaomi_aqara/&quot; target=&quot;_blank&quot;&gt;Для привязки&lt;/a&gt; одного хаба пишем в configuration.yaml:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#yum install sysbench
# You can leave MAC empty if you only have one gateway.
xiaomi_aqara:
  discovery_retry: 5
  gateways:
    - key: xxxxxxxxxxxxxxxx
&lt;/pre&gt;
&lt;br /&gt;
Хаб найдется через мультикаст запрос, можно прописать ip хаба. Для привязки нескольких configuration.yaml:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#yum install sysbench
# 12 characters MAC can be obtained from the gateway.
xiaomi_aqara:
  gateways:
    - mac: xxxxxxxxxxxx
      key: xxxxxxxxxxxxxxxx
    - mac: xxxxxxxxxxxx
      key: xxxxxxxxxxxxxxxx&lt;/pre&gt;
&lt;br /&gt;
Перезапускаем сервер из веб приложения home assistant (настройки - сервер - перезапустить). И получаем.. ничего :) Ошибка:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBw0KulrODe1_PNJFabhmM-diIPZz6uaIDLLfyhOx-828FLMeWLDnRjZAJBj9ZkBEAqYWlbcpovZSlxk904yi6dFD5N6MPWVOnq8B17yHTFDYkgmzMG6qg4hja29hcDEaMUAZKdsk/s1600/error_aqara.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBw0KulrODe1_PNJFabhmM-diIPZz6uaIDLLfyhOx-828FLMeWLDnRjZAJBj9ZkBEAqYWlbcpovZSlxk904yi6dFD5N6MPWVOnq8B17yHTFDYkgmzMG6qg4hja29hcDEaMUAZKdsk/s320/error_aqara.png&quot; width=&quot;320&quot; height=&quot;169&quot; data-original-width=&quot;964&quot; data-original-height=&quot;508&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Проверяем порт Xiaomi Gateway (Aqara)&lt;/b&gt;
&lt;br /&gt;
Что бы HA подключился к хабу, нужны открытые UDP порты 4321/9898 на хабе. Говорят, в последних партиях хабов эти порты закрыты по умолчанию (Новые ревизии шлюзов (надпись около вилки идёт по кругу) поставляются с последней прошивкой). Узнаем ip адрес хаба в приложении  MI Home (About -&gt; Hub info). Тестируем порты:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
#  nmap -sU 192.168.1.109 -p 5353,9898,4321
PORT     STATE         SERVICE
4321/udp open|filtered rwhois
5353/udp open|filtered zeroconf
9898/udp open          monkeycom
&lt;/pre&gt;
&lt;br /&gt;
Если у вас порты закрыты - &lt;a href=&quot;https://habr.com/ru/post/487768/&quot;&gt;прочитайте статью&lt;/a&gt;.
&lt;br /&gt;
У меня была определенная проблема в том что, сеть докера была в bridge mode и multicast дискаверинг не срабатывал. Переключаем докер в host mode. Открываем порт 8123 на файерволе, а так же прохождение мультикаст пакетов (на хосте с докером), если необходимо. Получаем результат:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPeb7ajhlXxWj13NdLGtYmcl_6CC9vWwahOdqHV4QaXzDMsD-QEma4NR7o8fc6qx0qhK30OkifPqr1bGZQgEBXok48jxUAUISmnzl7KOkwpV4P5g31s4_dJRn9yqkBFtf_es5_vYV9/s1600/xia_gate.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPeb7ajhlXxWj13NdLGtYmcl_6CC9vWwahOdqHV4QaXzDMsD-QEma4NR7o8fc6qx0qhK30OkifPqr1bGZQgEBXok48jxUAUISmnzl7KOkwpV4P5g31s4_dJRn9yqkBFtf_es5_vYV9/s320/xia_gate.png&quot; width=&quot;320&quot; height=&quot;246&quot; data-original-width=&quot;1165&quot; data-original-height=&quot;895&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/1698810149056756582/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2020/03/xiaomi-gateway-aqara-home-assistant.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/1698810149056756582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/1698810149056756582'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2020/03/xiaomi-gateway-aqara-home-assistant.html' title='Подключение Xiaomi Gateway (Aqara) к Home Assistant'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtNDUyH3zqtrL7X-ihUs2pSwOQAco9MxVRu9KBcuZbHywZP1P1St2sfSkAityUy2yKqUgifQWL5KvEUYYfmqmcTjdwIuLVtjEsWgfimI9YGSijRs0upbiX6-eAWM18H0zWvFVLNSSO/s72-c/pass.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-6189455125454377351</id><published>2020-03-12T14:05:00.002+03:00</published><updated>2020-03-12T14:29:15.552+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="CPU"/><category scheme="http://www.blogger.com/atom/ns#" term="epel"/><category scheme="http://www.blogger.com/atom/ns#" term="mprime"/><category scheme="http://www.blogger.com/atom/ns#" term="sysbench"/><title type='text'>Нагрузочное тестирование CPU в CentOS 8 (stress test)</title><content type='html'>&lt;br /&gt;
&lt;b&gt;EPEL&lt;/b&gt;
&lt;br /&gt;
EPEL (Extra Packages for Enterprise Linux)  — репозиторий с дополнительными пакетами для Enterprise Linux, предоставляемый командой Fedora, которые не включены в установку по умолчанию в некоторых дистрибутиве CentOS. 
&lt;br /&gt;
Устанавливаем с помощью пакета epel-release и проверяем, что все работает:&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# yum install epel-release
# yum repolist | grep -i &quot;epel\|repo id&quot;
repo id           repo name                                               status
*epel             Extra Packages for Enterprise Linux 8 - x86_64          4,979
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Sysbench&lt;/b&gt;
&lt;br /&gt;
Устанавливаем и запускаем тест (cpu - этот тест проверит производительность процессоров, используя вычисления с 64-разрядными числами.):
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#yum install sysbench
#sysbench cpu --threads=4 --cpu-max-prime=10000000 run
&lt;/pre&gt;
где
&lt;br /&gt;
--num-threads=4 - это количество потоков, у меня двухъядерный четырёхпотоковый Intel® Core™ i3 (мобильная U версия), поэтому 4;
&lt;br /&gt;
--cpu-max-prime=10000000 - это максимальное количество выполненных операций. Вы можете увеличть это число, если надо тестировать дольше.
&lt;br /&gt;
Вот так загружается процессор при выполнении:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZWzCc6g8zZDYyTAyljP2lIffa-sayKQ3XlS_t8EEtFVIWbpblhIvA7nTzZk1-We1ELAc_yoQsKdqOr1KqzClEPzs8ydB3i59p9nuZHNznupQHLrnYZYAoGrYnruhSJicJzacJa5w/s1600/sysbench.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;75&quot; data-original-width=&quot;1288&quot; height=&quot;19&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZWzCc6g8zZDYyTAyljP2lIffa-sayKQ3XlS_t8EEtFVIWbpblhIvA7nTzZk1-We1ELAc_yoQsKdqOr1KqzClEPzs8ydB3i59p9nuZHNznupQHLrnYZYAoGrYnruhSJicJzacJa5w/s320/sysbench.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Отслеживание температуры&lt;/b&gt;
&lt;br /&gt;
Смысл нагрузки процессора, в моем случае, был не только в проверке в проверке скорости работы процессора, но и в проверки температуры процессора в безвентиляторной системе. Поэтом во время нагрузочного теста, неплохо бы и отслеживать температуру.
&lt;br /&gt;
Устанавливаем sensors.
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#yum install lm_sensors
&lt;/pre&gt;
&lt;br /&gt;
Запускаем программу обнаружения датчиков. Для простоты жмите Enter, когда задаются вопросы.
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#sensors-detect 
&lt;/pre&gt;
&lt;br /&gt;
Добавим 0 в --cpu-max-prime=100000000 (чтобы тест пошел больше, чем 1 минуту)  и запускаем sysbench. В отдельной консоли отслеживаем температуру:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#watch -n 1 -d sensors
&lt;/pre&gt;
&lt;br /&gt;
Моя температура до запуска:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVJyR9b79Vb9na5o7WqSj2YCxMSMzuqLKKNIhV67XMocq9KR-OWnBUoAbEij3KGwfT6Hqz4lmOy-mnY8Mljud5QfogAmPKs43YIeHTBLBRHGhjYgHk41SYHh7WP-rK7JTfpai4X9t1/s1600/temp1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;242&quot; data-original-width=&quot;1116&quot; height=&quot;69&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVJyR9b79Vb9na5o7WqSj2YCxMSMzuqLKKNIhV67XMocq9KR-OWnBUoAbEij3KGwfT6Hqz4lmOy-mnY8Mljud5QfogAmPKs43YIeHTBLBRHGhjYgHk41SYHh7WP-rK7JTfpai4X9t1/s320/temp1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Тест длился 570 секунд, температура на пике:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMJyHEUEKTBicKUrYGQyBkOvnc5dirDt0SIadiGAPMrgcDV5tQwZaIm0bzcUOvx3H6DbLuGxEWmcxmHmRc-FBVDKoGPnqyn4PIvqouqX0je6Ft5A7vDWMsuTeQl-YxqIU_NzjvmvBq/s1600/temp2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMJyHEUEKTBicKUrYGQyBkOvnc5dirDt0SIadiGAPMrgcDV5tQwZaIm0bzcUOvx3H6DbLuGxEWmcxmHmRc-FBVDKoGPnqyn4PIvqouqX0je6Ft5A7vDWMsuTeQl-YxqIU_NzjvmvBq/s320/temp2.png&quot; width=&quot;320&quot; height=&quot;74&quot; data-original-width=&quot;1032&quot; data-original-height=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Достаточно низкая температура, попробуем другую утилиту.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mersenne prime (mprime 95)&lt;/b&gt;
&lt;br /&gt;
Качаем &lt;a href=&quot;https://www.mersenne.org/download/#stresstest&quot;&gt;Mersenne prime&lt;/a&gt; и запускаем.
&lt;br /&gt;
В моем случае:
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
#mkdir mprime &amp;&amp; cd mprime
#wget http://www.mersenne.org/ftp_root/gimps/p95v298b6.linux64.tar.gz
#tar -zxvf p95v298b6.linux64.tar.gz
#./mprime -m
&lt;/pre&gt;
Нажмите N, если не хотите выполнять задания с сервера и перейти к тесту torture (пытка :) ). Выберем количество потоков. Дальше выбираем:
&lt;br /&gt;
&lt;pre&gt;
Choose a type of torture test to run.
  1 = Smallest FFTs (tests L1/L2 caches, high power/heat/CPU stress).
  2 = Small FFTs (tests L1/L2/L3 caches, maximum power/heat/CPU stress).
  3 = Large FFTs (stresses memory controller and RAM).
  4 = Blend (tests all of the above).
&lt;/pre&gt;
Я выбрал 2, так как пока не хочу нагружать память, возможно в следующий раз. Остальные опции по умолчанию. Пошел тест:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWwkkeUvUwJAnTeC0z0zeOhZPTaXQ-bUoL64zf7xG-W2IpHzt7bWwerRE4JE9itJX6c6p0l16jXrK8AU52QMR_UeS5MawoE1lZOUAHetD4uy_rPDv5QMeYn-j1Wk3rIQpZOeOBvGtJ/s1600/mprime.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWwkkeUvUwJAnTeC0z0zeOhZPTaXQ-bUoL64zf7xG-W2IpHzt7bWwerRE4JE9itJX6c6p0l16jXrK8AU52QMR_UeS5MawoE1lZOUAHetD4uy_rPDv5QMeYn-j1Wk3rIQpZOeOBvGtJ/s320/mprime.png&quot; width=&quot;320&quot; height=&quot;127&quot; data-original-width=&quot;1600&quot; data-original-height=&quot;634&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Загрузка в top те же 400%, но с температурой уже поинтереснее:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcFm8_cPo9yUDQmm3DEg77pHSJO7GGxcDkgsl8RxaDZlboiNvVVryt5Z60Or_ulhHs323xlMv0nwf2XhCQuFfwA8lVbo2hfctSaWQq44XG62IvZn-uWJkKDOffMnquqbei8LBWW40e/s1600/temp22.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcFm8_cPo9yUDQmm3DEg77pHSJO7GGxcDkgsl8RxaDZlboiNvVVryt5Z60Or_ulhHs323xlMv0nwf2XhCQuFfwA8lVbo2hfctSaWQq44XG62IvZn-uWJkKDOffMnquqbei8LBWW40e/s320/temp22.png&quot; width=&quot;320&quot; height=&quot;87&quot; data-original-width=&quot;977&quot; data-original-height=&quot;266&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Двухчасовое тестирование выдало максимальную температуру 60 градусов (в первый час 58). Максимальная температура PCH (&lt;a href=&quot;https://ru.wikipedia.org/wiki/Skylake&quot;&gt;южного моста Skylake&lt;/a&gt;) 54 градус (первый час 52). Считаю отличный результат для без вентиляторной системы (а для мобильной платформы шикарный), а mprime лучшей утилитой для подобного стресс теста. Sysbench, я думаю, лучше использовать просто, как подсчет попугаев.
&lt;br /&gt;
&lt;br /&gt;
ps. нормальный показатель температуры диода PCH ноутбуков составляет 45-70°C. Кратковременные поднятия до более высоких температур тоже. Так же и с мобильным процессором, до 70 градусов - абсолютная норма.

</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/6189455125454377351/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2020/03/cpu-centos-8-stress-test.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6189455125454377351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6189455125454377351'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2020/03/cpu-centos-8-stress-test.html' title='Нагрузочное тестирование CPU в CentOS 8 (stress test)'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZWzCc6g8zZDYyTAyljP2lIffa-sayKQ3XlS_t8EEtFVIWbpblhIvA7nTzZk1-We1ELAc_yoQsKdqOr1KqzClEPzs8ydB3i59p9nuZHNznupQHLrnYZYAoGrYnruhSJicJzacJa5w/s72-c/sysbench.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-3910429230543371058</id><published>2014-05-14T12:50:00.000+04:00</published><updated>2014-12-02T21:58:48.459+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="Видеонаблюдение"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Видеонаблюдение</title><content type='html'>Продолжим. Ну какой &lt;a href=&quot;http://vermus.blogspot.ru/search/label/%D1%83%D0%BC%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%BE%D0%BC&quot;&gt;умный дом&lt;/a&gt; без видео наблюдения?&lt;br /&gt;
&lt;br /&gt;
В связи с тем, что умный дом у нас DIY, соответственно бюджетный, мы будем делать видео наблюдение на основе регистратора и аналоговых камер. Качество сносное, лучший вариант - все таки ip камеры. С другой стороны аналоговые камеры - гораздо меньше размером и существуют, например, в виде глазка.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, я выбрал аналоговый вариант с регистратором. Что такое регистратор - по-простому это коробочка для подключения аналоговых камер и микрофонов, с линуксом внутри, что обычно подразумевает возможность подключить sata диск и записывать на него, а также подразумевает наличие ethernet порта, с различными сетевыми возможностями - записью на ftp, samba сервер или даже облако (китайское), возможность просмотра камер с доступом через определенный порт (rtsp) и т.д. Возможностей обычно много - например тот же ntp клиент, dynDns и прочее. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2HgmO-5y5Vec83s2bn8w6iIjd82Lq1ro-6V9TyyJ2jxZg7TV_-dnT6HdaF-tVYuPhpv7Aq1wLvbJ9qElktAo9OwX8Lj-y_Znx_FOPGG_xFU7LdEw-o9XokDmXlKLBLK81KzwIXVq/s1600/617503494_464.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2HgmO-5y5Vec83s2bn8w6iIjd82Lq1ro-6V9TyyJ2jxZg7TV_-dnT6HdaF-tVYuPhpv7Aq1wLvbJ9qElktAo9OwX8Lj-y_Znx_FOPGG_xFU7LdEw-o9XokDmXlKLBLK81KzwIXVq/s320/617503494_464.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
У меня выбор пал на &lt;a href=&quot;http://www.aliexpress.com/snapshot/281725692.html&quot;&gt;следующий регистратор&lt;/a&gt;. Сложно понять, что это за фирма и модель, тем не менее присутствие &lt;a href=&quot;http://ru.wikipedia.org/wiki/960H_Technology&quot;&gt;960H&lt;/a&gt; подкупило. Хотя вот кстати его шильдик: 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0n93mhGVBUkqgw1W4VAxwxTVbQtNd6IBwfHBdxsRwYa3o3_GOr60_a_hUd1vPjOy7XdigRlMjc87g6g4aPoTggyJOQ0LM4vD_c8XfoyYB8aezFQrr8y-1S1y1zhu-CCp_wLnqm61N/s1600/20131210_205010.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0n93mhGVBUkqgw1W4VAxwxTVbQtNd6IBwfHBdxsRwYa3o3_GOr60_a_hUd1vPjOy7XdigRlMjc87g6g4aPoTggyJOQ0LM4vD_c8XfoyYB8aezFQrr8y-1S1y1zhu-CCp_wLnqm61N/s320/20131210_205010.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не нашел возможность конфигурирования через веб-интерфейс (только просмотр с activex плагином). Конфигурировать возможно только непосредственно подключив мышь и монитор к регистратору или используя программу CMS (только под Windows), идущую на диске с регистратором (что говорит нам о том, что api управления есть - есть и конфигурация порта управления в настройках).
&lt;br /&gt;
&lt;br /&gt;
Дальнейшее разбирательство привело к следующим данным. Регистратор на основе hi3520d с такой начинкой:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;[root@registrator custom]$ cat ProductDefinition
{
   &quot;Vendor&quot; : &quot;General&quot;,
   &quot;Hardware&quot; : &quot;MBD6704T-E&quot;,
   &quot;PackSize&quot; : 17408,
   &quot;PreRecSize&quot; : 2048,
   &quot;LogoArea&quot; : {&quot;Begin&quot;: &quot;0xe80000&quot;, &quot;End&quot;: &quot;0xec0000&quot;}
}

[root@registrator custom]$ cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 1 (v7l)
BogoMIPS        : 1318.91
Features        : swp half thumb fastmult edsp
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x4
CPU part        : 0xc09
CPU revision    : 1

Hardware        : hi3520d
Revision        : 0000
Serial          : 0000000000000000
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Пароль для доступа через telnet к устройствам с таким контроллером xc3511. В принципе, там делать особо нечего, если не требуется каких-то сугубо специфических действий. Конфигурирование через telnet уж тем более на ваш страх и риск - не стоит там что либо править, если вы не уверены в своих действиях.
&lt;br /&gt;
&lt;br /&gt;
Это место в посты было переписано три раза :) Один раз кусок стер блогспот, второй раз я стер сам часто про то как я делал из rtsp jpeg. Провозившись три недели я все таки пришел к общему знаменателю вывода rtsp в веб для показа видео. И это связка -  ffmpeg, nginx и &lt;a href=&quot;https://github.com/arut/nginx-rtmp-module/&quot;&gt;nginx-rtmp&lt;/a&gt;. Для html5 в данный момент надо поддерживать целый зоопарк различно закодированных потоков. Это накладно для простых файлов, а для живого вещания вообще кошмар.
&lt;br /&gt;
&lt;br /&gt;
Как установить рассказывать не буду - вот хотя бы &lt;a href=&quot;http://smidth.ru/blog/miscellaneous/installing-nginx-rtmp/&quot;&gt;пример&lt;/a&gt;. Могу добавить, что для использования модуля надо пересобирать весь nginx целиком. Плюс добавлю, что после компиляции я создаю пакет и ставлю его:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;/usr/src/nginx/nginx-1.5.9# checkinstall -D --install=no
/usr/src/nginx/nginx-1.5.9# dpkg -i nginx_1.5.9-1_amd64.deb
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Дальше идем на https://github.com/arut/nginx-rtmp-module/ и читаем документацию. Пишем конфигурацию примерно такого содержания:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
rtmp {

    max_connections 50;

    server {
 notify_method get;
        listen 1935;
        application cams {
            live on;
            allow publish 127.0.0.1;
            allow publish 192.168.0.0/24;
     deny publish all;
     exec_static ffmpeg -i &quot;rtsp://ipregistrator:554/user=myuser&amp;password=mypasswd&amp;channel=1&amp;stream=1.sdp&quot; -c:v copy -profile:v baseline -c:a copy -f flv rtmp://localhost/cams/stream;
     exec_static ffmpeg -i &quot;rtsp://ipregistrator:554/user=myuser&amp;password=mypasswd&amp;channel=2&amp;stream=1.sdp&quot; -c:v copy -profile:v baseline -c:a copy -f flv rtmp://localhost/cams/stream2;
 }

    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Замечу, что exec_static выполняется при запуске nginx (ffmpeg забирает rtsp поток с регистратора и конвертирует в flv без перекодирования) , что очень удобно, не надо писать никаких дополнительных скриптов для запуска клиента.
&lt;br /&gt;
&lt;br /&gt;
Далее настраиваем flash плеер (uppod, flowplayer или др.) на html странице с адресом вида rtmp://server/cams/stream . В openhab с добавил Webview sitemap и в итоге у нас вышло нечто вроде:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLSdogzyGfEA_MEwD74YGXIlfOE_iTUyPPiLrTNVpTh_4GDrgcFQZCXt63CperyNLr_OWHJXIF8Jc24rWOg9fD0jmJsORo0lBXTHj3E4pRRtc_lrA-pRmhaccWfOvIZHb-ZQdWK2SM/s1600/video.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLSdogzyGfEA_MEwD74YGXIlfOE_iTUyPPiLrTNVpTh_4GDrgcFQZCXt63CperyNLr_OWHJXIF8Jc24rWOg9fD0jmJsORo0lBXTHj3E4pRRtc_lrA-pRmhaccWfOvIZHb-ZQdWK2SM/s320/video.png&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Повесил китайский планшет на стену - openhab теперь используется в виде видеоглазка. Регистратор записывает видео при обнаружении движения (настройка довольно таки не тривиальная, но можно поиcкать инструкцию к программе cms на русском, такая существует.&lt;br /&gt;&lt;br /&gt;
В будущем планирую видео &lt;a href=&quot;http://habrahabr.ru/post/209500/&quot;&gt;записывать в облако mail.ru&lt;/a&gt;, благо там получен 1 террабайт.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/3910429230543371058/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/05/blog-post.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3910429230543371058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3910429230543371058'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/05/blog-post.html' title='Видеонаблюдение'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL2HgmO-5y5Vec83s2bn8w6iIjd82Lq1ro-6V9TyyJ2jxZg7TV_-dnT6HdaF-tVYuPhpv7Aq1wLvbJ9qElktAo9OwX8Lj-y_Znx_FOPGG_xFU7LdEw-o9XokDmXlKLBLK81KzwIXVq/s72-c/617503494_464.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-6553372338440741379</id><published>2014-02-05T16:24:00.001+04:00</published><updated>2014-02-05T16:38:04.648+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jabber"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="owfs"/><category scheme="http://www.blogger.com/atom/ns#" term="owserver"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Управление и оповещение через jabber в openHAB</title><content type='html'>Отлично, у нас есть показания &lt;a href=&quot;http://vermus.blogspot.ru/2014/02/1-wire.html&quot;&gt;открытой двери и замка&lt;/a&gt;. Теперь было бы неплохо, получать какие-нибудь оповещения о событиях. Например, для начала, о том что замок закрылся или открылся.
&lt;br /&gt;
&lt;br /&gt;
Я решил оповещения сделать на основе jabber, тем более, что данный вариант позволяет даже управлять openHABом из jabber. Создаем &lt;a href=&quot;http://jabberworld.info/%D0%9F%D1%83%D0%B1%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D1%8B_Jabber&quot;&gt;учетную запись&lt;/a&gt; (xmpp или jabber). Ищем секцию xmpp в openhab.cfg. Прописываем сервер, логин, пароль.
&lt;br /&gt;
Отправляем команду help:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;(15:22:48) I: help
(15:22:49) my****@jabber.org: Usage: 
update ⟨item⟩ ⟨state⟩ - sends a status update for an item
send ⟨item⟩ ⟨command⟩ - sends a command for an item
status ⟨item⟩ - shows the current status of an item
items [⟨pattern⟩] - lists names and types of all items matching the pattern
say ⟨sentence to say⟩ - Says a message through TTS on the host machine
⟩ ⟨script to execute⟩ - Executes a script
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь разберемся, как нам послать сообщение о смене статуса открытого замка. Для этого просто создадим новое правило в home.rules:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;rule &quot;Door Check Lock Send&quot;
when
        Item Main_Door_Lock changed
then
        if(Main_Door_Lock.state==1)
        {
            sendXMPP(&quot;jabber@jabber.org&quot;, &quot;Замок двери открыт!&quot;)
        }
        else if(Main_Door_Lock.state==0)
        {
            sendXMPP(&quot;jabber@jabber.org&quot;, &quot;Замок двери закрыт!&quot;)
        }
        else{
            sendXMPP(&quot;jabber@jabber.org&quot;, &quot;Неполадки с датчиком замка двери!&quot;)
        }
end
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Очень помогает в написании правил функция авто-дополнения в дизайнере (Ctrl+Space), ибо документация по этому поводу хромает.
&lt;br /&gt;
&lt;br /&gt;
Поэкспериментировав понимаем, что время отклика оставляет желать лучшего. Смотрим лог owfs - датчик опрашивается openHAB&#39;ом раз в минуту - это как раз настройка в openHAB. К сожалению на данный момент &lt;a href=&quot;https://github.com/openhab/openhab/issues/592&quot;&gt;время обновления едино&lt;/a&gt; для всех датчиков 1-wire в openHAB. Поэтому ничего не остается, как сменить частоту обновления хотя бы на раз в 10 секунд.
&lt;br /&gt;
&lt;br /&gt;
Кеш owfs для датчиков &lt;a href=&quot;http://owfs.org/index.php?page=what-is-uncached&quot;&gt;по умолчанию&lt;/a&gt; 15 секунд. Поэтому, чтобы получать свежие значения, надо изменить его на 10 секунд. Пропишем в owfs.conf:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;timeout_volatile = 10
#error_print = 1
error_print = 3
error_level = 2
&lt;/pre&gt;
&lt;br /&gt;
error_print = 3 обозначает подавление логов - при опросе раз в 10 секунд из слишком много. 
&lt;br /&gt;
&lt;br /&gt;
Протестировав я понял, что и 10 секунд слишком много. Но дальше увеличивать частоту опросов всех датчиков накладно. И вообще неплохо бы использовать unchached значения из owfs для датчиков, а кеш использовать только для датчиков, данные которых не критичны в времени опроса - например, датчики температуры. Но в openHAB пока с этим &lt;a href=&quot;https://github.com/openhab/openhab/issues/592&quot;&gt;проблемы&lt;/a&gt;. Поэтому будем использовать небольшой хак. Для датчиков мы будем использовать exec binding и получать данные с файловой системы. Формат запроса:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;in:  exec:&quot;&amp;lt;[&amp;lt;commandline execute=&quot;&quot; to=&quot;&quot;&amp;gt;:&amp;lt;refreshintervalinmilliseconds&amp;gt;:&amp;lt;transformationrule&amp;gt;]&quot;
&lt;/pre&gt;
&lt;br /&gt;
items:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Number Main_Door_Lock &quot;Замок в двери C: [MAP(ru.map):%s]&quot;&amp;lt;door&amp;gt;(Doors) { exec=&quot;&amp;lt;[/bin/cat /mnt/1wire/uncached/12.A214B2000000/sensed.A:5000:REGEX((.*?))]&quot; }
&lt;/pre&gt;
&lt;br /&gt;
В принципе, тут можно использовать и Contact.
&lt;br /&gt;
Результат срабатывания правила:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihwEFF-yA88df9zWjC_KX780lKSGl4jnTwnKyMyBf54OWEYz2W3WGLFP09UhZNqeln93JJHUv028LTF_UJ8DXZ3qoy7cV2z5C1zEynGLjEdBc4vHY-4AV5bwrdm-YahG-ylUVzUH2v/s1600/jabber.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihwEFF-yA88df9zWjC_KX780lKSGl4jnTwnKyMyBf54OWEYz2W3WGLFP09UhZNqeln93JJHUv028LTF_UJ8DXZ3qoy7cV2z5C1zEynGLjEdBc4vHY-4AV5bwrdm-YahG-ylUVzUH2v/s320/jabber.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Последний штрих - теперь нам надо настроить запуск приложения файловой системы owfs, потому что мы с него получаем данные. (Проверьте, что у вас запускается при старте в директориях rc.d).
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# update-rc.d owfs defaults 30
&lt;/pre&gt;
&lt;br /&gt;
Не забудьте выставить очередь запуска после owserver (у меня, как видно 30, а у owserver 20)!</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/6553372338440741379/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/02/jabber-openhab.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6553372338440741379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6553372338440741379'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/02/jabber-openhab.html' title='Управление и оповещение через jabber в openHAB'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihwEFF-yA88df9zWjC_KX780lKSGl4jnTwnKyMyBf54OWEYz2W3WGLFP09UhZNqeln93JJHUv028LTF_UJ8DXZ3qoy7cV2z5C1zEynGLjEdBc4vHY-4AV5bwrdm-YahG-ylUVzUH2v/s72-c/jabber.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-8651924174126496201</id><published>2014-02-04T14:46:00.000+04:00</published><updated>2014-02-04T14:54:29.611+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="DS2406P"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="owfs"/><category scheme="http://www.blogger.com/atom/ns#" term="ЛУТ"/><title type='text'>Датчик открытого замка\двери\окна на 1-wire и openHAB</title><content type='html'>После небольшого перерыва на &lt;a href=&quot;http://vermus.blogspot.ru/search/label/OpenHAB&quot;&gt;софт&lt;/a&gt; вновь перейду к железной стороне. Следующим устройством в сети мне надо сделать датчик открытого замка. Если вы помните, мы &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html&quot;&gt;использовали электронную метку ds2401&lt;/a&gt; для определения наличия датчика в сети. Как мы убедились, а умные люди нам &lt;a href=&quot;http://www.ab-log.ru/forum/viewtopic.php?f=1&amp;amp;t=586#p10812&quot;&gt;подсказали&lt;/a&gt; - это работает слишком медленно. Поэтому мы будем использовать не определение датчика в сети, а сигналы от датчика-ключа ds2406p (такую микросехму я нашел, можно использовать и другие). Заодно мы сделаем и датчик открытой двери, ибо в таком исполнении у микросхемы два канала.
&lt;br /&gt;
&lt;br /&gt;
DS2406P универсальный элемент стандарта 1-Wire-net. Она содержит два независимых транзисторных ключа, с током потребления до 50 мА на предельном коммутируемом напряжении +13 В (для канала А) и до 8 мА на предельном коммутируемом напряжении +6 В (для канала B). DS2406P может быть использована также для контроля двух независимых датчиков дискретных сигналов типа &quot;сухой контакт&quot;. &lt;a href=&quot;http://blog-i.ru/elementi-umnogo-doma/ds2406p-element-1-wire-seti&quot;&gt;(с)&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Изучаем схему с сайта &lt;a href=&quot;http://www.benuks.ru/&quot;&gt;http://www.benuks.ru/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi290y6xvpzqBFrQiJn7mEOZo7uVE23p0Cf3zlYWjxwtgFALtJnDXTh14tR4asmfsBKN2jzU-8WGqvNqmgA-HfVCxdD4HxP3OaDkx1WfI3tbAAWbMYl9iQVAGLsr27etaQUXnX6pd-I/s1600/sh_dvi.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi290y6xvpzqBFrQiJn7mEOZo7uVE23p0Cf3zlYWjxwtgFALtJnDXTh14tR4asmfsBKN2jzU-8WGqvNqmgA-HfVCxdD4HxP3OaDkx1WfI3tbAAWbMYl9iQVAGLsr27etaQUXnX6pd-I/s320/sh_dvi.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Схема аналогична &lt;a href=&quot;http://www.benuks.ru/walpers/sh_io_1.jpg&quot;&gt;этой&lt;/a&gt;. Только тут используется более &quot;продвинутая&quot; микросхема.&lt;br /&gt;
&lt;br /&gt;
Освоим технологию создания плат (типа продинутый ЛУТ), мне понравилось вот это видео (пришлось даже ламинатор купить):
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/gjMBI2RfaKM?feature=player_embedded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Единственно, я заменил самоклейку на фотобумагу. Но с ней у меня ничего не вышло, в итоге я взял лист от тонкого глянцевого журнала. Процесс травления не показан, ну можно поискать, или вот он:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;object class=&quot;BLOGGER-youtube-video&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot; data-thumbnail-src=&quot;https://ytimg.googleusercontent.com/vi/n_j6r27LSnE/0.jpg&quot; height=&quot;266&quot; width=&quot;320&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;https://youtube.googleapis.com/v/n_j6r27LSnE&amp;source=uds&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;embed width=&quot;320&quot; height=&quot;266&quot;  src=&quot;https://youtube.googleapis.com/v/n_j6r27LSnE&amp;source=uds&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Качаем&amp;nbsp;&lt;a href=&quot;http://www.benuks.ru/data/lay4.rar&quot;&gt;архив со схемами в формат&lt;/a&gt;е layout4. Находим там схему и печатаем на листе &amp;nbsp;тонкого глянцевого журнала, прогоняем результат с ламинатором.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkufDgWKOt1QsgAEhbnqfIUO3uWi5DhmCMzc5qiwHV16Zdy8VUGyJM_c3m2LN9oSoSb7HT20OLXs2ySChQYMz6_iGzPUA7xWqoOrYTTRozunKRz_qe-FM-k5d_19oH5PdolhHFbhpP/s1600/in_out12_lay.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkufDgWKOt1QsgAEhbnqfIUO3uWi5DhmCMzc5qiwHV16Zdy8VUGyJM_c3m2LN9oSoSb7HT20OLXs2ySChQYMz6_iGzPUA7xWqoOrYTTRozunKRz_qe-FM-k5d_19oH5PdolhHFbhpP/s1600/in_out12_lay.jpg&quot; height=&quot;294&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
То, что получилось у меня после печати и прогона в ламинаторе (160 градусов Цельсия):
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpJin2Pfr6zdAqQANF-1LjXhDHgv0ssbIvE-6nXziOt6dyOL5BIHv2tMWi82qhQxtKXEuR5XY6ovPSnlK5cDTU8NJA1hOGSdC3-dt5ujY0DoXGKekbXznw6GgGd4_fpes0XXQyVfa/s1600/20140126_221147.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpJin2Pfr6zdAqQANF-1LjXhDHgv0ssbIvE-6nXziOt6dyOL5BIHv2tMWi82qhQxtKXEuR5XY6ovPSnlK5cDTU8NJA1hOGSdC3-dt5ujY0DoXGKekbXznw6GgGd4_fpes0XXQyVfa/s320/20140126_221147.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Травим, получаем (снизу артефакты от первой печати с фотобумагой, сверху - плохой журнальный лист - тонер отскочил от него - подкрасил маркером):
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_fMN6z6F4NbuTzv3pMZysxUfNIC85rNkbYPOmU5PrjajgK1IPbiIBUGjU3OawhZKh4QWpuuhMwgFdi1vsT1Ao52OYzpV4ejrhM3YtARLZuIBWIKg1jUIAgGyimnH5Giss-AnNafC/s1600/20140126_225945.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_fMN6z6F4NbuTzv3pMZysxUfNIC85rNkbYPOmU5PrjajgK1IPbiIBUGjU3OawhZKh4QWpuuhMwgFdi1vsT1Ao52OYzpV4ejrhM3YtARLZuIBWIKg1jUIAgGyimnH5Giss-AnNafC/s320/20140126_225945.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Моем (бензин или ацетон) и сверлим отверстия (я собрал мини дрель - держатель в сборе в радио магазине, двигатель от детской машины).
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp7_fUjqw4HhUmiy5t-MGIKYerxyA1fsJEf8sNbycEp3JUk0Ee-0Wh7dqoP5hn6LIfvl9vwMNCBMbmTsyNQVldmAW_r4aAH-OWySRizPNtNeMFumNQCjRAzXgL8ke_wUu8Ca1t0uAA/s1600/20140128_211956.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp7_fUjqw4HhUmiy5t-MGIKYerxyA1fsJEf8sNbycEp3JUk0Ee-0Wh7dqoP5hn6LIfvl9vwMNCBMbmTsyNQVldmAW_r4aAH-OWySRizPNtNeMFumNQCjRAzXgL8ke_wUu8Ca1t0uAA/s320/20140128_211956.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Для покупки-сбора инструмента, освоение технологий, ушло пару-тройку рабочих недель. Цанговый патрон брал в местном радио-магазине, сверла &lt;a href=&quot;http://www.aliexpress.com/item/Discount-10pcs-0-3-1-2mm-PCB-Print-Circuit-Board-Drill-Bits-Carbide-Micro-Drill-Bits/1432824721.html&quot;&gt;здесь&lt;/a&gt;. Отличные сверла, рекомендую. Лудим, паяем плату.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEC5Xw6uBx-F8aE7oVyReieVOV-57UBJz0fFvavA5iH8CoYmEvcKrWvmfh9QJ-_0PCF7d5P3yNBURt3IeoH_TRH-mf5VLu8IASayoZ3GlIzg8tHBgdnYCZrACcfmOMgV7LENao6Ao4/s1600/20140201_222443.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEC5Xw6uBx-F8aE7oVyReieVOV-57UBJz0fFvavA5iH8CoYmEvcKrWvmfh9QJ-_0PCF7d5P3yNBURt3IeoH_TRH-mf5VLu8IASayoZ3GlIzg8tHBgdnYCZrACcfmOMgV7LENao6Ao4/s320/20140201_222443.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjGAQvGBE827FiHaJKsHq5aaeIGPX4q20xwwc46k4KNRfzDMb8Mq0lUrEk1IAS3ebLKdMMu1Stkd5CALU7WJEz53AkWmjhxlJr0P8OtIHqethJJvF6-_aZE9lEVT49lgGu__O1ewV/s1600/20140201_223640.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjGAQvGBE827FiHaJKsHq5aaeIGPX4q20xwwc46k4KNRfzDMb8Mq0lUrEk1IAS3ebLKdMMu1Stkd5CALU7WJEz53AkWmjhxlJr0P8OtIHqethJJvF6-_aZE9lEVT49lgGu__O1ewV/s320/20140201_223640.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Обратите внимание - в схеме надо делать перемычку для подачи 5 вольт на ds2406. Далее, я подпаял разъем rj11 и подключил к &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/1-wire.html&quot;&gt;нашей сети&lt;/a&gt; 1wire . &lt;a href=&quot;http://vermus.blogspot.ru/2014/02/owfs.html&quot;&gt;Заходим в директорию&lt;/a&gt; /mnt/1wire и смотрим - у нас должен появиться новый датчик. Подключив геркон к выводу &quot;земля&quot; и А (или B), а магнит приклеив к замку - получаем датчик закрытого\открытого замка:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;root@truck:/mnt/1wire/12.***4B2000000# cat sensed.A
0
root@truck:/mnt/1wire/12.***4B2000000# cat sensed.B
1
&lt;/pre&gt;
&lt;br /&gt;
B - можно использовать тут же, например, для датчика закрытой двери.
&lt;br /&gt;
&lt;br /&gt;
Стабилизатор с 18 на 12 вольт я впаивать не стал - в данном случае нам 12 вольт не нужно.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;OpenHAB&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь нам надо показания датчиков открытия отобразить в OpenHAB. Я пытался использовать стандартный Contact item. Но по-видимому &lt;a href=&quot;http://knx-user-forum.de/openhab/25101-zustandsabfrage-per-1-wire-binding.html&quot;&gt;он еще не&lt;/a&gt; работает с 1wire. Поэтому пришлось прописать показания открытого замка как Number. 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;/* Active Group */
Group:Number:SUM        Doors   &quot;Двери [открыто: %d]&quot;   &lt;door&gt;  (All)

/* Contacts */

Number  Main_Door      &quot;Входная дверь: [MAP(ru.map):%s]&quot;       &amp;lt;door&amp;gt;  (Doors) { onewire=&quot;12.A234B4000000#sensed.B&quot; }
Number  Main_Door_Lock &quot;Замок в двери: [MAP(ru.map):%s]&quot;        &amp;lt;door&amp;gt;  (Doors) { onewire=&quot;12.A234B4000000#sensed.A&quot; }
&lt;/door&gt;&lt;/pre&gt;
&lt;br /&gt;
1 - открытая дверь/замок, 0 - закрытая. Группа Doors (привет поклонникам Джима :) ) - показывает суммарное значение показаний item в группе - соответственно, количество открытых дверей.
&lt;br /&gt;
ru.map пишем по аналогу en.map. В sitemap выводим просто группу.
&lt;br /&gt;
&lt;br /&gt;
Так как doors у нас через number, а иконка door завязана на Contact с показаниями open\close, то картинку door-open.png копируем в door-1.png, а door-close.png копируем в door-0.png.
&lt;br /&gt;
&lt;br /&gt;
Результат:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpIlZ1cE-vbgzEqNsC-7dS1SOGj41iFS485ASSW1-UDTjmD1NnfpTIPDAehZhuVVnznebCg7i-emGYqVrfD3Q7Xe-q9hPG6hqvRaq-XpHuOrKVwyzWjKPMC0tDwtEL0kpWuePZ-27-/s1600/doors.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpIlZ1cE-vbgzEqNsC-7dS1SOGj41iFS485ASSW1-UDTjmD1NnfpTIPDAehZhuVVnznebCg7i-emGYqVrfD3Q7Xe-q9hPG6hqvRaq-XpHuOrKVwyzWjKPMC0tDwtEL0kpWuePZ-27-/s320/doors.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ps. Только я спросил про патч, сразу товарищи разработчики его &lt;a href=&quot;https://github.com/openhab/openhab/issues/355&quot;&gt;наложили&lt;/a&gt;. Так что можете пробовать Contact item &lt;a href=&quot;https://openhab.ci.cloudbees.com/job/openHAB/&quot;&gt;в ночном билде&lt;/a&gt; (я думаю это исправление войдет в версию 1.4, которая выйдет 9-го февраля 2014 года). Я пробовать не буду, так как меня пока устраивает на основе Numbers.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/8651924174126496201/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/02/1-wire.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8651924174126496201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8651924174126496201'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/02/1-wire.html' title='Датчик открытого замка\двери\окна на 1-wire и openHAB'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi290y6xvpzqBFrQiJn7mEOZo7uVE23p0Cf3zlYWjxwtgFALtJnDXTh14tR4asmfsBKN2jzU-8WGqvNqmgA-HfVCxdD4HxP3OaDkx1WfI3tbAAWbMYl9iQVAGLsr27etaQUXnX6pd-I/s72-c/sh_dvi.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-5076696202428621766</id><published>2014-02-02T18:53:00.000+04:00</published><updated>2014-02-04T20:41:29.729+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="DS18B20"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="owfs"/><category scheme="http://www.blogger.com/atom/ns#" term="owserver"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Owfs - установка из исходников</title><content type='html'>Начнем с лирического отступления. Проанализировав показания термометра DS18B20 я понял, что он немного завышает показания. &amp;nbsp; Погуглив я нашел две причины: либо самонагрев датчика от частого опроса, либо неоткаллиброванный датчик. Решил получше изучить логи owfs.&lt;br /&gt;
&lt;br /&gt;
1. Включаем логи:
/etc/owfs.conf&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;error_print = 1 
error_level = 3 
&lt;/pre&gt;
&lt;br /&gt;
Перезапускаем owserver и смотрим что у нас в логах. (Обратите внимание, что я рассказываю про версию из deb пакета в init.d скрипте которого уже указан путь к конфигу). А в логах у нас пусто. Помните, &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3-nand.html&quot;&gt;как&lt;/a&gt; мы &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3.html&quot;&gt;устанавливали&lt;/a&gt; систему? Позже мы поставили &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/1-wire.html&quot;&gt;rsyslod&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Ищем # whereis owserver , чтобы запустить его не в режиме сервиса , а в &lt;a href=&quot;http://owfs.org/index.php?page=debug&quot;&gt;консоли&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#/usr/bin/owserver --debug  --error_level=9 --error_print=2 --foreground -c /etc/owfs.conf --pid-file /var/run/owfs/owserver.pid
DEBUG MODE
libow version:
        2.8p15
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
И снова пусто. Но не только &lt;a href=&quot;http://owfs-developers.1086194.n5.nabble.com/no-stderr-syslog-output-owserver-2-8p15-debian-wheezy-td9839.html&quot;&gt;у нас&lt;/a&gt;. Похоже, что в deb пакете owfs логирование выключено.
&lt;br /&gt;
&lt;br /&gt;
Посему удаляем owfs (сохраним init.d скрипты и owfs.conf - хотя они удалиться не должны). Качаем версию &lt;a href=&quot;http://owfs.org/index.php?page=download&quot;&gt;посвежее&lt;/a&gt;. Распаковываем tar -xvzf... &lt;a href=&quot;http://owfs.org/index.php?page=building-under-ubuntu&quot;&gt;Устанавливаем&lt;/a&gt; необходимое для компиляции и сборки.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#apt-get install autoconf libtool libusb-dev libfuse-dev make ed
#cd /usr/src/owfs-2.9p1
#./configure --help
#/owfs-2.9p1# autoreconf -i
&lt;/pre&gt;
&lt;br /&gt;
Я сконфигурировал следующим образом (также можно добавить опцию --enable-owtraffic Enable bus traffic reports (default false) - очень интересная опция, дающая возможность отслеживать трафик в самой 1-wire сети):
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#./configure --enable-debian --disable-owftpd --disable-owperl --disable-owphp --disable-parport --disable-owpython
# make -j4
# make install
&lt;/pre&gt;
&lt;br /&gt;
По умолчанию все устанавливается в директорию /opt/owfs/ . Сделаем линк в /usr/bin , что бы было проще использовать и не переписывать скрипты запуска.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# for p in owfs owserver owhttpd owftpd owread owwrite owdir ; do ln -sf /opt/owfs/bin/$p /usr/bin/$p ; done&lt;/pre&gt;
&lt;br /&gt;
Пробуем запускать:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;/usr/bin/owserver --debug  --error_level 9 --error_print 2 --foreground -c /etc/owfs.conf --pid-file /var/run/owfs/owserver.pid
&lt;/pre&gt;
&lt;br /&gt;
Если все хорошо, перезапускаем сервер с помощью init скрипта и смотрим syslog. Отлично! Теперь укажем всем клиентским приложениям использовать tcp сервер (owserver) для работы, ибо usb устройство уже занято им (то есть все приложения &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html&quot;&gt;пакета owfs&lt;/a&gt; должны работать через owserver - если он запущен, либо по одиночке). Пропишем в конфиг (он должен автоматически подхватываться (ключ -c) всеми init.d скриптами пакета owfs, которые у нас остались после установки deb пакета из репозитория):
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# With this setup, any client (but owserver) uses owserver on the
# local machine...
! server: server = localhost:4304
&lt;/pre&gt;
&lt;br /&gt;
В конфиге программы с репозитория эта строчка уже указана.&lt;br /&gt;
&lt;br /&gt;
Но скрипта для приложения (не пакет) owfs в init.d нет (вообще странный пакет в репозитории дебиана - логов нет, управление не понятно, такое ощущение, что делал человек, плохо знакомый с owfs). Можем сделать на основе скрипта owhttpd и запускаем:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# /etc/init.d/owfs start
[ ok ] Starting 1-Wire owfs Daemon: owfs.
root@debtruck:/etc/init.d# ps -A | grep ow
 2478 ?        00:00:01 owserver
 3262 ?        00:00:00 owfs
&lt;/pre&gt;
&lt;br /&gt;
Смотрим работающие логи.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/5076696202428621766/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/02/owfs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/5076696202428621766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/5076696202428621766'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/02/owfs.html' title='Owfs - установка из исходников'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-430226687530685759</id><published>2014-01-26T12:31:00.000+04:00</published><updated>2014-01-26T12:33:46.748+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="utils"/><title type='text'>Тестируем жесткие диски в debian/ubuntu</title><content type='html'>Чтобы не забыть.&lt;br /&gt;&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
# apt-get install smartmontools
# fdsik -l
# smartctl -A /dev/sda
# smartctl -t conveyance /dev/sda 
//через две минутки:
# smartctl -a /dev/sda
# smartctl -t long /dev/sda
//через пару часов
# smartctl -a /dev/sda
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;
Проверим kern.log , позиции связанные с ata рассмотреть.
&lt;br /&gt;&lt;br /&gt;
Быстрый опрос диска на предмет живучести, с предсказанием отказа диска в ближайшие 24 часа
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
sudo smartctl -H /dev/sda
&lt;/pre&gt;
Лучшее описание параметров &lt;a href=&quot;http://www.ixbt.com/storage/hdd-smart-testing.shtml&quot;&gt;здесь&lt;/a&gt;. На что стоит обратить внимание:&lt;br /&gt;
Attribute 04 (4) Start/Stop Count (Количество циклов запуск/останов шпинделя) &lt;br /&gt;
Attribute 05 (5) Reallocated Sector Count (Количество переназначенных секторов)&lt;br /&gt;
Attribute 09 (9) Power On Hours Count (Количество отработанных часов)&lt;br /&gt;
Attribute 0C (12) Power Cycle Count (Количество полных циклов запуска/останова) &lt;br /&gt;
Attribute C2 (194) Temperature (Температура диска)&lt;br /&gt;
Spin Up Time и Spin Retry Count - изменение значения может означать проблемы с питанием или с мотором. &lt;br /&gt;
Current Pending Sector Count - число &quot;кандидатов&quot; в ремапы. &lt;br /&gt;
Offline Scan Uncorrectable Count - число ошибок, обнаруженных при Offline самотесте (запускается автоматически, когда нет обращений к диску) &lt;br /&gt;
UltraDMA CRC Error Rate - изменение значения может означать плохой контакт в сигнальном кабеле (между MB и HDD).&lt;br /&gt;
&lt;br /&gt;
На остальное смотреть не обязательно, в поле raw может быть написано все что угодно и для каждого производителя по своему (в разных системах исчисления и т.д.).
&lt;br /&gt;&lt;br /&gt;
&quot;Следует отметить, что в винчестерах отдельных производителей Raw_Read_Error_Rate и Seek_Error_Rate параметры достигают максимума и обнуляютя несколько раз в день. Это связанно с политикой некоторых производителей в отношении SMART: в эти параметры пишутся все ошибки, а остальные производители только те, что не смог отловить контроллер.&quot; &lt;a href=&quot;http://mydebianblog.blogspot.com/2007/11/blog-post.html&quot;&gt;(с)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
Current_Pending_Sector - число кандидатов на Reallocate, если сектор успешно читается повторно, то он убирается из списка «плохих» секторов, параметр Current_Pending_Sector уменьшается а Reallocate не происходит.&lt;br /&gt;
Изменение счётчика Current_Pending_Sector без Reallocate может быть из-за неправильного температурного режима накопителя.&lt;br /&gt;&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/430226687530685759/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/debian_26.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/430226687530685759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/430226687530685759'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/debian_26.html' title='Тестируем жесткие диски в debian/ubuntu'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-3588025446722894519</id><published>2014-01-21T21:21:00.001+04:00</published><updated>2014-01-21T21:36:54.931+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="backup"/><category scheme="http://www.blogger.com/atom/ns#" term="gpg"/><category scheme="http://www.blogger.com/atom/ns#" term="yandex-disk"/><title type='text'>Резервная копия в сети, запуск по расписанию, шифрование (debian)</title><content type='html'>В общем, опять. Надо сделать бекап сайта (debian) или чего угодно, вcтречаем:
&lt;br /&gt;
&lt;br /&gt;
Резервная копия в сети, запуск по расписанию, шифрование. А теперь по-английски: Backup, mysqldump, yandex-disk, cron, gpg. 
&lt;br /&gt;
&lt;br /&gt;
1. Устанавливаем &lt;a href=&quot;http://habrahabr.ru/company/yandex/blog/191446/&quot;&gt;клиент yandex-disk&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
2. Скрипт сохранения и шифрования.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#!/bin/sh
# get the current timestamp for filename #
NOWDATE=`date +%d.%m.%y_%H%M`

echo &#39;zipping ...&#39;

BACKUP=&quot;/path/to/yadisk&quot;
TMPBACKUP=&quot;/path/to/temp&quot;

tar -cz /path/to/site/ | gpg --batch --yes -c --passphrase _passwordhere_ -o &quot;$BACKUP/$NOWDATE-site_files.tgz.gpg&quot;

echo &#39;mysql_dump ...&#39;

DB_USER=&quot;dbuser&quot;
DB_PASSWD=&quot;dbpassword&quot;
DB_BASE=&quot;dbname&quot;

mysqldump --user=$DB_USER --password=$DB_PASSWD --opt $DB_BASE &amp;gt; &quot;$TMPBACKUP/$NOWDATE-db_backup&quot;
gpg --batch --yes --passphrase _passwordhere_  -o &quot;$BACKUP/$NOWDATE-db_backup.gpg&quot; -c &quot;$TMPBACKUP/$NOWDATE-db_backup&quot; &amp;amp;&amp;amp; rm -f &quot;$TMPBACKUP/$NOWDATE-db_backup&quot;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
--batch --yes может даже лишнее. Но пригодится, если у вас одно и тоже имя для файла бекапа.
&lt;br /&gt;
&lt;br /&gt;
3. Пишем правило для crontab. Если вы путаетесь в параметрах crontab есть отличная вещь под названием &lt;a href=&quot;http://cronwtf.github.io/&quot;&gt;cronWTF&lt;/a&gt;. :)  
&lt;br /&gt;
&lt;br /&gt;
4. &lt;a href=&quot;http://ru.wikipedia.org/wiki/GnuPG&quot;&gt;gpg&lt;/a&gt; для windows &lt;a href=&quot;http://code.google.com/p/cryptophane/downloads/list&quot;&gt;здесь&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Удаления старых файлов пока нет, так как после удаления на клиенте файлы остаются в корзине на сервере яндекс диска и занимают место и их надо все равно удалять вручную.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/3588025446722894519/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/debian.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3588025446722894519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3588025446722894519'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/debian.html' title='Резервная копия в сети, запуск по расписанию, шифрование (debian)'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-6310203287944751574</id><published>2014-01-20T22:39:00.003+04:00</published><updated>2014-01-24T10:42:58.649+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Получение данных через интернет или сеть в OpenHAB. Использование Oracle Java 1.7</title><content type='html'>Температура дома &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/openhab_16.html&quot;&gt;у нас есть&lt;/a&gt;. Пока у меня нет внешней температуры, ее можно получить в интернете. Сделать это очень просто используя &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Http-Binding&quot;&gt;http binding&lt;/a&gt;. В демо есть пример.&lt;br /&gt;
&lt;br /&gt;
Итак, для начала попробуем использовать пример с демо. Ищем свой yahoo &lt;a href=&quot;http://www.flickr.com/places/info/23424936&quot;&gt;woeid&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Пишем в sitemap :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Frame label=&quot;Погода&quot; {
  Text item=Yahoo_Temperature {
   Frame {
    Text item=Yahoo_Temp_Max
    Text item=Yahoo_Temp_Min
   }
   Frame {
    Chart item=Yahoo_Chart period=h refresh=10000
   }
  }
 }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Пишем в items : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Group Yahoo_Chart   (Weather)
Number Yahoo_Temperature   &quot;Температура на улице yahoo [%.1f °C]&quot; &amp;lt;temperature&amp;gt; (Yahoo_Chart) { http=&quot;&amp;lt;[http://weather.yahooapis.com/forecastrss?w=_тут ваш woeid_&amp;amp;u=c:60000:XSLT(yahoo_weather_temperature.xsl)]&quot; }
Number Yahoo_Temp_Max   &quot;Сегодня максимум [%.1f °C]&quot; &amp;lt;temperature&amp;gt; (Yahoo_Chart)
Number Yahoo_Temp_Min   &quot;Сегодня минимум [%.1f °C]&quot; &amp;lt;temperature&amp;gt; (Yahoo_Chart)
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Загляните в yahoo_weather_temperature.xsl - это шаблон для извлечения данных из возращенного xml. &lt;br /&gt;
&lt;br /&gt;
Сейчас мы видим, что item Yahoo_Temp_Max и Yahoo_Temp_Min не привязаны к источнику данных. Откуда же их брать? Смотрим &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Rules&quot;&gt;demo.rules&lt;/a&gt;, а также &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Actions&quot;&gt;документацию здесь&lt;/a&gt; и прописываем себе тоже в файл home.rules:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;             
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

rule &quot;Update max and min temperatures&quot;
when
    Item Yahoo_Temperature changed or
    Time cron &quot;0 0 0 * * ?&quot; or
    System started
then
    postUpdate(Yahoo_Temp_Max, Yahoo_Temperature.maximumSince(now.toDateMidnight).state)
    postUpdate(Yahoo_Temp_Min, Yahoo_Temperature.minimumSince(now.toDateMidnight).state)
end
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну и последнее, сохранение. Добавим в rrd4j.persist:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Weather*, PersistTemp* : strategy = everyMinute, restoreOnStartup
&lt;/pre&gt;
Перезапускаем сервер и я получил ошибку в логах:

&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt; Executing startup rule &#39;Startup&#39;
22:32:27.859 ERROR o.e.x.x.s.XbaseScopeProvider[:189]- error during scoping
com.google.inject.ProvisionException: Guice provision errors:

1) Error injecting constructor, java.lang.NullPointerException: null key
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ошибка решается установкой &lt;a href=&quot;https://groups.google.com/forum/#!msg/openhab/ZsPLjTiV5I8/-uZv4ba3ovkJ&quot;&gt;Oracle Java&lt;/a&gt;.
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Удаляем OpenJDK, &lt;a href=&quot;http://www.webupd8.org/2013/12/oracle-java-ppa-updated-with-arm-support.html&quot;&gt;устанавливаем Oracle Java&lt;/a&gt; (инсталлер качает oracel java с интеренета). 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# /etc/init.d/openhab stop
# apt-get remove icedtea-6-jre-jamvm
# apt-get autoremove
# echo &quot;deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main&quot; | tee -a /etc/apt/sources.list
# echo &quot;deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main&quot; | tee -a /etc/apt/sources.list
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
# apt-get update
# apt-get install oracle-java7-installer
# java -version
java version &quot;1.7.0_51&quot;
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode)
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Вчера настроил yahoo, а сегодня сервер мне уже показывает вместо -20C реальных: -2C. Поэтому я решил не использовать погоду от yahoo. Решил добавить gismeteo, openweathermap.org и worldweatheronline.net и вычислить среднее арифметическое с показаний. Забирать температуру буду раз в полчаса, чтобы не нагружать сервер.
&lt;br /&gt;
&lt;br /&gt;
В общем-то, имея демо, несложно написать следующий сценарий, который пришел мне в голову (в скобках, какая часть конфигурации отвечает за действие).
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Запрашиваем данные раз в полчаса с трех источников (чаще нет смысла - их обычно обновляют раз в три часа). (items)&lt;/li&gt;
&lt;li&gt;Сохраняем данные раз в полчаса с каждого ресурса. (persist)&lt;/li&gt;
&lt;li&gt;Вычисляем среднюю температуру после обновления хотя бы одного источника (rules)&lt;/li&gt;
&lt;li&gt;Вычисляем максимальную и минимальную температуру после обновления средней температуры (rules)&lt;/li&gt;
&lt;li&gt;Сохраняем среднюю, максимальную и минимальную температуру при их обновлении (everyChange в persist)&lt;/li&gt;
&lt;li&gt;Выводим среднюю температуру, а также график средней, минимальной и максимальной (аналогично как в демо)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;Update.&lt;/b&gt; &lt;strike&gt;Тут обнаружилась проблема (версия openHAB 1.4 - графики не выводятся, если данные сохранены реже, чем раз в минуту. Поэтому сохраняем раз в минуту пока.&lt;/strike&gt; В общем, это не проблема, а фича. &lt;a href=&quot;http://code.google.com/p/openhab/wiki/rrd4jPersistence&quot;&gt;rrd&lt;/a&gt; имеет шаг (step) и сердцебиение (heartbeat). Шаг - время обновления базы rrd, сердцебиение - время в течении которого данные сохраняются. То есть, если мы не попадаем в heartbeat (сохраняем реже) - &lt;a href=&quot;http://apfelboymchen.net/gnu/rrd/create/&quot;&gt;данные&lt;/a&gt; не сохраняются! heartbeat в openhab забит жестко (по крайней мере, пока) - и составляет 60 секунд. Поэтому лучше всего сохранять не реже 1 минуты. Шаг, насколько я понял, это параметр во время которого rrd принимает решение о хранении данных. В openhab оно настроено так:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
 rrdDef.addArchive(function, 0.5, 4, 360); // one day (granularity 4 min)
                rrdDef.addArchive(function, 0.5, 15, 644); // one week (granularity 15 min)
                rrdDef.addArchive(function, 0.5, 60, 720); // one month (granularity 1 hour)
                rrdDef.addArchive(function, 0.5, 720, 730); // one year (granularity 12 hours)
                rrdDef.addArchive(function, 0.5, 10080, 520); // ten years (granularity 7 days)
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
То есть, после первого дня хранения, точность данных меняется на 4 минуты, после одной недели на 15 минут, одного месяца на на 1 час и так далее...
&lt;br /&gt;
&lt;br /&gt;
В принципе, все шаги очевидны, единственно, я немного затормозил на этапе вычисления средней температуры. Значения надо предварительно перевести в DecimalType:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;rule &quot;Update average temp&quot;
when
    Item Owm_Temperature changed or
    Item Gismeteo_Temperature changed or
    Item Wwo_Temperature changed or
    System started
then
    var Number owm = Owm_Temperature.state as DecimalType
    var Number gismeteo = Gismeteo_Temperature.state as DecimalType
    var Number wwo = Wwo_Temperature.state as DecimalType
    postUpdate( Average_Temperature, ( owm + gismeteo + wwo ) / 3  )
end
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLI5nz2fhXTA1dMOBJbj1IGVs1hbUlTUWYbyMpniw4VYFoRkDoiKOyKt4Eai_cAW-jvQkvgm_rRhQD4-ES8cWkga42Ed0WXDabAheShtgThoyx6sBPGk7EXTrVYXAARP-KYDMeW1K/s1600/temp_outside.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLI5nz2fhXTA1dMOBJbj1IGVs1hbUlTUWYbyMpniw4VYFoRkDoiKOyKt4Eai_cAW-jvQkvgm_rRhQD4-ES8cWkga42Ed0WXDabAheShtgThoyx6sBPGk7EXTrVYXAARP-KYDMeW1K/s320/temp_outside.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK1j-OYwhQ5_mzw1RPrB1QkyWNDMjKDOQ6RkcRy0LVf12lvMg7jqLEOWF9fd_r32JRflzGD4n1wlSoBmtWfsN1RCT6gFjbeszrSqkjTyEpMRQPdrRHGvUPq3_LIuUYkk4-AH07K8Id/s1600/chart.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK1j-OYwhQ5_mzw1RPrB1QkyWNDMjKDOQ6RkcRy0LVf12lvMg7jqLEOWF9fd_r32JRflzGD4n1wlSoBmtWfsN1RCT6gFjbeszrSqkjTyEpMRQPdrRHGvUPq3_LIuUYkk4-AH07K8Id/s320/chart.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ps. Заодно поменяем ntp сервер для даты в файле конфигурации. Я люблю pool.ntp.org.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/6310203287944751574/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab-oracle-java-17.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6310203287944751574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6310203287944751574'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab-oracle-java-17.html' title='Получение данных через интернет или сеть в OpenHAB. Использование Oracle Java 1.7'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLI5nz2fhXTA1dMOBJbj1IGVs1hbUlTUWYbyMpniw4VYFoRkDoiKOyKt4Eai_cAW-jvQkvgm_rRhQD4-ES8cWkga42Ed0WXDabAheShtgThoyx6sBPGk7EXTrVYXAARP-KYDMeW1K/s72-c/temp_outside.png" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-3469005935586274494</id><published>2014-01-16T00:05:00.000+04:00</published><updated>2014-01-21T22:19:40.242+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="HABDroid"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><title type='text'>Сохранение данных OpenHAB. Графики</title><content type='html'>Отлично, &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/openhab.html&quot;&gt;температура&lt;/a&gt; у нас есть.
&lt;br /&gt;
&lt;br /&gt;
Кстати, теперь можно протестировать и &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.openhab.habdroid&quot;&gt;android приложение&lt;/a&gt;, &lt;a href=&quot;https://openhab.ci.cloudbees.com/job/HABDroid/&quot;&gt;тут самая&lt;/a&gt; последняя версия. У меня на планшете заработало сразу, единственный момент, надо указывать не полный url, а вида http(s)://server:port/ , выбор sitemap происходит в самом приложении, а если он один, то и запускается сразу. К сожалению, работает на android только начиная с версии 4.0.3.
&lt;br /&gt;
&lt;br /&gt;
Переходим к теме. Для того чтобы заиметь график температуры ее надо сначала сохранить. 
&lt;br /&gt;
&lt;br /&gt;
Изучаем &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Persistence&quot;&gt;документацию&lt;/a&gt; по Persistence (сохранение состояния) и rrd4j. Процитирую слова разработчика: &quot;As said above, I would recommend rrd4j&quot;, тем не менее OpenHAB поддерживает больше число мест сохранения данных (db4o, sql и др.), которые могут работать одновременно. Для начала нам нужен org.openhab.persistence.rrd4j-1.3.1.jar в папке addons. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Конфигурация&lt;/b&gt;.
&lt;br /&gt;
&lt;br /&gt;
Для редактирования конфигурации &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Persistence&quot;&gt;советуют использовать&lt;/a&gt; openHAB Designer, так как там есть проверка и автодополнение синтаксиса. Основная идея файла конфигурации, сообщить OpenHAB, &lt;i&gt;какие&lt;/i&gt; данные и &lt;i&gt;когда&lt;/i&gt; сохранять. Для для того, чтобы определить &quot;когда&quot; сохранять данные используют слово &quot;strategies&quot; в файле конфигурации. Синтаксис:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Strategies {
    &amp;lt;strategyname1&amp;gt; : &quot;&amp;lt;cronexpression1&amp;gt;&quot;
    &amp;lt;strategyname2&amp;gt; : &quot;&amp;lt;cronexpression2&amp;gt;&quot;
    ...
    
    default = &amp;lt;strategynamex&amp;gt;, &amp;lt;strategynamey&amp;gt;
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующие &quot;стратегии&quot; предварительно сконфигурированы, их можно не описывать, но можно прописать в default:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;everyChange: сохранять состояние при его изменении&lt;/li&gt;
&lt;li&gt;everyUpdate: сохранят состояние при его обновлении, даже если значение не изменилось&lt;/li&gt;
&lt;li&gt;restoreOnStartup: если состояние не определено при запуске, последнее сохраненное значение будет загружено и элемент будет проинициализирован им. Это очень удобно для всех &quot;виртуальных&quot; устройств, которые не имеют связи с реальным железом. (например &quot;Presence&quot;).
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Структура описания элементов для сохранения.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Items {
    &amp;lt;itemlist1&amp;gt; [-&amp;gt; &quot;&amp;lt;alias1&amp;gt;&quot;] : [strategy = &amp;lt;strategy1&amp;gt;, &amp;lt;strategy2&amp;gt;, ...]
    &amp;lt;itemlist2&amp;gt; [-&amp;gt; &quot;&amp;lt;alias2&amp;gt;&quot;] : [strategy = &amp;lt;strategyX&amp;gt;, &amp;lt;strategyY&amp;gt;, ...]
    ...
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;itemlist&amp;gt; разделенный запятыми список следующих опций:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;* - эта линия должна применяться для всех элементов в системе. Пример: &lt;br /&gt;
// persist all items once a day and on every change and restore them from the db at startup &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
* : strategy = everyChange, everyDay, restoreOnStartup&lt;/li&gt;
&lt;li&gt; &amp;lt;itemName&amp;gt; - одиночный элемент (его имя). Это может быть группа, но в таком случае сохранится только значение группы, не значения элементов.&lt;/li&gt;
&lt;li&gt; &amp;lt;groupName&amp;gt;* - все члены группы будут сохранены, но не сама группа. если стратегия не предоставлена, используется стратегия по умолчанию, описанная в первой в используемой секции. Как опция, может быть предоставлен псевдоним, если сервис сохранения требует специального имени (например таблица в БД и т.п.).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Ну что же попробуем сохранить температуру. Создадим группу. Назовем ее PersistTemp. Добавляем в Items:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Group PersistTemp (All)
/* Indoor Temperatures */
Number Temperature_Hall &quot;Температура [%.1f °C]&quot; &amp;lt;temperature&amp;gt; (Hall, PersistTemp) { onewire=&quot;28.1A821E040000#temperature&quot; }
&lt;/pre&gt;
&lt;br /&gt;
Пишем rrd4j.persist (не забудьте про addons/org.openhab.persistence.rrd4j-1.3.1.jar ):
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;// persistence strategies have a name and a definition and are referred to in the &quot;Items&quot; section
Strategies {
 // for rrd charts, we need a cron strategy
 everyMinute : &quot;0 * * * * ?&quot;
}

Items {
 // let&#39;s only store temperature values in rrd
 PersistTemp* : strategy = everyMinute, restoreOnStartup
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что крон тут не стандартный и начинается с секунд - &lt;a href=&quot;http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-06&quot;&gt;подробнее здесь&lt;/a&gt;.
Если все ок, смотрим директорию openHAB/etc/rrd4j/ . Там лежат файлы с данными.
&lt;br /&gt;
&lt;br /&gt;
Данные мы сохранили, а что делать с ними дальше? Изучаем демо, там есть &lt;b&gt;график температуры&lt;/b&gt;.
&lt;br /&gt;
&lt;br /&gt;
Меняем sitemap. Группа в sitemap по умолчанию синхронизируется с элементами в группе в Items (довольно не очевидно и не очень понятно вначале, тем более в документации об этом не написано вроде). Теперь у нас группа в sitemap Hall будет состоять из Item и Chart, поэтому будет перезаписана правилами sitemap. В примере в демо такие &quot;вручную описанные&quot; блоки имеют вид &quot;Text label=&quot;Widget Overview&quot; icon=&quot;chart&quot; {}&quot;. Но я оставил группу - и так работает, добавляем (пояснение по параметрам ниже):
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Group item=Hall label=&quot;Зал&quot; icon=&quot;office&quot;
   {
   Frame {
         Text item=Temperature_Hall
         Chart item=Temperature_Hall period=D refresh=10000
         Chart item=Temperature_Hall period=W refresh=10000
         }
   }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Заходим и не работает график. Копируем url изображения и переходим на него в новой вкладке. Ошибка 500  Probable fatal error:No fonts found.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# apt-get install ttf-bitstream-vera ttf-dejavu ttf-liberation ttf-linux-libertine xfonts-terminus ttf-inconsolata
# /etc/init.d/openhab restart
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Кстати, &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/1-wire.html&quot;&gt;напоминаю&lt;/a&gt;, у меня OpenHAB и 1-wire сеть, которые работают на cubietruck.
&lt;br /&gt;
&lt;br /&gt;
Небольшая &lt;a href=&quot;http://code.google.com/p/openhab/wiki/Charts&quot;&gt;информация&lt;/a&gt; по графикам. Параметры, которые можно передавать:
&lt;br /&gt;
&lt;br /&gt;
w: ширина, опция, по умолчанию 480 пикселей&lt;br /&gt;
h: высота, опция, по умолчанию 240&lt;br /&gt;
period: время по оси X. Значения могут быть h,4h,8h,12h,D,3D,W,2W,M,2M,4M,Y - параметр опциональный, по умолчанию &quot;D&quot;, то есть за последние 24 часа.&lt;br /&gt;
items: разделенные запятыми элементы (items).&lt;br /&gt;
или&lt;br /&gt;
groups: разделенные запятыми группы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxN5qAtlIwu0x0HSe8cn1s9nu0Mxneomj9aQbY92qU0F7-JMskXerG3tFT7t_u1bEcJ_f-4NdktaLzIxn_RVY3L8j5OXjZzikoQGrEJxpEZbbfPxQzv9Mcq-KswtVPz99zAx22AQrE/s1600/charts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxN5qAtlIwu0x0HSe8cn1s9nu0Mxneomj9aQbY92qU0F7-JMskXerG3tFT7t_u1bEcJ_f-4NdktaLzIxn_RVY3L8j5OXjZzikoQGrEJxpEZbbfPxQzv9Mcq-KswtVPz99zAx22AQrE/s320/charts.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/3469005935586274494/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab_16.html#comment-form' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3469005935586274494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3469005935586274494'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab_16.html' title='Сохранение данных OpenHAB. Графики'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxN5qAtlIwu0x0HSe8cn1s9nu0Mxneomj9aQbY92qU0F7-JMskXerG3tFT7t_u1bEcJ_f-4NdktaLzIxn_RVY3L8j5OXjZzikoQGrEJxpEZbbfPxQzv9Mcq-KswtVPz99zAx22AQrE/s72-c/charts.png" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-7251195181844559326</id><published>2014-01-14T13:16:00.002+04:00</published><updated>2014-02-04T14:32:48.543+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="openremote"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Знакомство с OpenHAB</title><content type='html'>В &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/openremote.html&quot;&gt;прошлой заметке&lt;/a&gt; я решил сменить платформу для управления умным домом. 
&lt;br /&gt;
&lt;br /&gt;
Архитектура &lt;a href=&quot;https://github.com/openhab/openhab/wiki&quot;&gt;OpenHAB&lt;/a&gt;:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdoIgJvgCWGm77QH4o4YKESPdceFMHgy-GU2m5j0JhV7ZwV030CICRZbtH1ORPfuWFZzMTIFmSYItbPBq35rCpZQ3U3jpCDBsPKXXGUiiWYL9t3t1hN9hf7gBT27N7MgzcRbYz-0EI/s1600/architecture.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdoIgJvgCWGm77QH4o4YKESPdceFMHgy-GU2m5j0JhV7ZwV030CICRZbtH1ORPfuWFZzMTIFmSYItbPBq35rCpZQ3U3jpCDBsPKXXGUiiWYL9t3t1hN9hf7gBT27N7MgzcRbYz-0EI/s320/architecture.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenHAB состоит из двух частей райнтайма (аналог контроллера в openremote, ну или просто сервер) и дизайнера. В принципе, дизайнером некоторые не пользуются - правят конфигурацию вручную.
&lt;br /&gt;
&lt;br /&gt;
Удаляем скрипт OpenRemote из автозагрузки.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# update-rc.d openremote remove
&lt;/pre&gt;
&lt;br /&gt;
Java у нас уже стоит.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Runtime&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Качаем &lt;a href=&quot;http://code.google.com/p/openhab/downloads/list?can=3&quot;&gt;runtime&lt;/a&gt; (проверьте версию, у меня на данный момент 1.3.1). 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# wget http://openhab.googlecode.com/files/openhab-runtime-1.3.1.zip
# wget https://openhab.googlecode.com/files/openhab-addons-1.3.1.zip
# unzip openhab-runtime-1.3.1.zip -d /srv/openHAB
# unzip openhab-addons-1.3.1.zip -d oh-addons
&lt;/pre&gt;
&lt;br /&gt;
Копируем необходимые addons в одноименную /srv/openHAB/addons. Я скопировал пока такие:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# ls -l
-rw-rw-r-- 1 root root   38725 Sep 19 00:25 org.openhab.action.mail-1.3.1.jar
-rw-rw-r-- 1 root root 1246014 Sep 19 00:26 org.openhab.action.xmpp-1.3.1.jar
-rw-rw-r-- 1 root root   31270 Sep 19 00:29 org.openhab.binding.http-1.3.1.jar
-rw-rw-r-- 1 root root   23164 Sep 19 00:31 org.openhab.binding.ntp-1.3.1.jar
-rw-rw-r-- 1 root root   29468 Sep 19 00:36 org.openhab.binding.onewire-1.3.1.jar
-rw-rw-r-- 1 root root   18734 Sep 19 00:46 org.openhab.persistence.exec-1.3.1.jar
-rw-rw-r-- 1 root root   19373 Sep 19 00:46 org.openhab.persistence.logging-1.3.1.jar
-rw-rw-r-- 1 root root  630764 Sep 19 00:46 org.openhab.persistence.rrd4j-1.3.1.jar
-rw-rw-r-- 1 root root     126 Aug 31 03:03 README
&lt;/pre&gt;
&lt;br /&gt;
Обратите внимание, org.openhab.binding.owserver-1.3.1.jar используется для железки под названием EDS OWServer . Нам же нужен org.openhab.binding.onewire-1.3.1.jar .
&lt;br /&gt;
Не забудьте, &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html&quot;&gt;у нас уже установлен&lt;/a&gt; owfs с его owserver.
&lt;br /&gt;
&lt;br /&gt;
Копируем файл configurations/openhab_default.cfg в configurations/openhab.cfg и правим. 
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Из чего состоит openHAB Runtime?&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
1. Асинхронная шина событий.&lt;br /&gt;
&lt;br /&gt;
Все узлы, которые не сохраняют свое состояние, должны информировать другие узлы о событиях, а также обновляться другими узлами реакцией на внешние события.&lt;br /&gt;
Существуют преимущественно два типа событий:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Команды, которые вызывают действие или изменение состояния некоторого элемента/устройства.&lt;/li&gt;
&lt;li&gt;Обновления статусов, которые информируют об изменении статуса некоторых элементов/устройств (часто в ответ на команду).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
2. Что такое элементы шины? Это items. Кто может запускать события? &amp;nbsp;Это sitemap и rules.&lt;br /&gt;
&lt;br /&gt;
Items - это представление наших устройств, их значения можно менять с помощью правил или через Sitemap. Sitemap - графическое представление и структура. Rules, соответственно правила.&lt;br /&gt;
&lt;br /&gt;
Вот еще одна красивая картинка шины событий openHAB:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCq7brYT6vYe66nUBfXSRvMkw9tFWGCNUH7nFGScsYZf_3Ub1bLT11apeLv9nrTv79A8TPfOsIQeNroYILmsn8dVAT7YW6ZaScTzueHC2J4JR3vlQjwZsFHrLsOBmyEy0YvuWBFgGE/s1600/events.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCq7brYT6vYe66nUBfXSRvMkw9tFWGCNUH7nFGScsYZf_3Ub1bLT11apeLv9nrTv79A8TPfOsIQeNroYILmsn8dVAT7YW6ZaScTzueHC2J4JR3vlQjwZsFHrLsOBmyEy0YvuWBFgGE/s320/events.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Дизайнер&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Так как у нас сервер без иксов и графики, то дизайнер мы будем использовать на машине с windows.&lt;br /&gt;
Качаем дизайнер, запускаем и получаю ошибку Failed to load the JNI shared library &quot;c:\soft\jdk1.7\\bin\..\jre\bin\server\jvm.dll&quot;. Это потому, что Дизайнер (основанный на eclipse) работает в 32 битной среде. Качаем &lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html&quot;&gt;32 (x86) битную яву&lt;/a&gt; и ставим. 
&lt;br /&gt;
&lt;br /&gt;
Меняем конфиг (openHAB-Designer.ini) дизайнера. 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;-vm C:/soft/jdk1.7_32/bin/javaw.exe
&lt;/pre&gt;
&lt;br /&gt;
И запускаем. Также скачаем папку configuration с сервера (напомню, я использую &lt;a href=&quot;http://winscp.net/eng/docs/lang:ru&quot;&gt;winscp&lt;/a&gt;). Укажем ее, как папку конфигурации (например c:\temp\openhab-demo-configuration-1.3.1\configurations\). Теперь скачем &lt;a href=&quot;https://code.google.com/p/openhab/downloads/detail?name=openhab-demo-configuration-1.3.1.zip&quot;&gt;демо&lt;/a&gt;&amp;nbsp;конфигурацию с сайта на рабочую машину, чтобы было на что ориентироваться.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCqEnmrx3ZWTtqrnQYCaiaSH3iZkktd_Hqxl7ZNCb11FGF8S7zEciXRfa5yF3YHK0qzt71wBQzSlmGZzVuVt-2CobwGy3ZVKAco8KbOpDHyHl9sc5JG-eDRMexB7H1I0k-h2UfMdWa/s1600/opendeisgner+folder.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCqEnmrx3ZWTtqrnQYCaiaSH3iZkktd_Hqxl7ZNCb11FGF8S7zEciXRfa5yF3YHK0qzt71wBQzSlmGZzVuVt-2CobwGy3ZVKAco8KbOpDHyHl9sc5JG-eDRMexB7H1I0k-h2UfMdWa/s320/opendeisgner+folder.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXrrIwJjdWSYNp73pFJIDiEUiMd_wVhp-AyktXLv17ri_KOvW-NnVFIk4OX_R5_o1lPRUo6dIAgea751dWPO9Xy8Cz2TeQXsvoRUdmTGW0wQ6DvrRzbWOo70LWXS_L1wiPD4JwiihD/s1600/openHAB+designer.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXrrIwJjdWSYNp73pFJIDiEUiMd_wVhp-AyktXLv17ri_KOvW-NnVFIk4OX_R5_o1lPRUo6dIAgea751dWPO9Xy8Cz2TeQXsvoRUdmTGW0wQ6DvrRzbWOo70LWXS_L1wiPD4JwiihD/s320/openHAB+designer.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Поковырявшись немного в дизайнере, кроме всплывающих подсказок (Ctrl+Space), ничего не нашел. Поэтому для начала им воспользуемся, а потом в принципе нужно будет прикрутить &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Syntax-Highlighting-for-external-editors&quot;&gt;подсветку синтаксиса для mc&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Начнем. Создаем файл sitemap, например home.sitemap . Честно говоря, в дизайнере даже этого нет. :) Но создать можно нажав ctrl+N (там проблема с директориями - они не отображаются - но разобраться можно). Пишем в файле &quot;sitem&quot;  и нажимаем Ctrl+Space. Выбираем шаблон sitemap. И у нас появляется нечто вроде этого:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;sitemap name label=&quot;label&quot; {
 
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Читаем &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Explanation-of-Sitemaps&quot;&gt;документацию по sitemap&lt;/a&gt;, чтобы понять, что же нам делать дальше. Удобно сравнивать, что у нас в demo.sitemap и в &lt;a href=&quot;http://demo.openhab.org:8080/openhab.app?sitemap=demo&quot;&gt;онлайн демо&lt;/a&gt;. Быстро понимаешь, что к чему. 
&lt;br /&gt;
Разобьем по комнатам (у меня, к сожалению, этажей нет). 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;sitemap name label=&quot;Дом&quot; {
 Frame {
  Group item=Hall label=&quot;Зал&quot; icon=&quot;office&quot;
  }
 Frame label=&quot;Дата&quot; {
  Text item=Date
 }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Иконки хранятся тут openHAB/webapps/images. Скачать дополнительные можно &lt;a href=&quot;http://graphicdesignjunction.com/2012/05/750-ui-design-vector-icons-pack/&quot;&gt;тут&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл: Items/home.items, прочитав &lt;a href=&quot;https://github.com/openhab/openhab/wiki/Explanation-of-Items&quot;&gt;документацию по Items&lt;/a&gt;. Так как у нас 1-wire, читаем документацию по связи с openHAB &lt;a href=&quot;https://github.com/openhab/openhab/wiki/One-Wire-Binding&quot;&gt;тут&lt;/a&gt;, и правим файл конфигурации в секции OneWire Binding (собственно говоря я только прописал ip - onewire:ip=127.0.0.1). Формат записи item:
&lt;br /&gt;
itemtype itemname [&quot;labeltext&quot;] [&amp;lt;iconname&amp;gt;] [(group1, group2, ...)] [{bindingconfig}]
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;Group All
Group Hall   (All)

/* Indoor Temperatures */
Number Temperature_Hall  &quot;Температура [%.1f °C]&quot; &amp;lt;temperature&amp;gt; (Hall) { onewire=&quot;28.1A821E040000#temperature&quot; }

/* NTP binding demo item */
DateTime  Date   &quot;Дата [%1$tA, %1$td.%1$tm.%1$tY]&quot; &amp;lt;calendar&amp;gt; { ntp=&quot;Europe/Moscow:ru_RU&quot; }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Копируем созданные файлы, исправленный openhab.cfg на сервер. 
&lt;br /&gt;
Меняем владельца папки с сервером на обычного пользователя и запускаем:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;$/srv/openHAB$ ./start.sh
UnknownHostException: 
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
И получаем ошибку. Ну я получил. :) Прописать надо имя хоста в /etc/hosts на 127.0.0.1.
Запускаем еще раз.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;$ ./start.sh
Launching the openHAB runtime...
osgi&amp;gt; 23:20:46.100 INFO  o.o.c.internal.CoreActivator[:92] - openHAB runtime has been started (v1.3.1).
.........
23:21:17.223 INFO  o.o.u.w.i.s.WebAppServlet[:99] - Started Classic UI at /openhab.app
23:21:29.349 INFO  o.o.c.s.AbstractActiveService[:189] - NTP Refresh Service has been started
23:21:29.655 INFO  o.o.c.s.AbstractActiveService[:189] - HTTP Refresh Service has been started
&lt;/pre&gt;
&lt;br /&gt;
Довольно долгий запуск таки. Заходим http://openhab-srv:8080/openhab.app?sitemap=home .
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSgFoOX0beZSE5y4do8C8AFfBQxhyphenhyphenCnZQjXOZYfrtnZu32HIdbb81YeCzAIRLA3CggXyUF9ua_D9lWrFyO9ls4ZOVyGB2L5uJVazOfE2FjECTF6aQbx3GN1tH6sEkR9GS2CslzBMu/s1600/openHAB.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSgFoOX0beZSE5y4do8C8AFfBQxhyphenhyphenCnZQjXOZYfrtnZu32HIdbb81YeCzAIRLA3CggXyUF9ua_D9lWrFyO9ls4ZOVyGB2L5uJVazOfE2FjECTF6aQbx3GN1tH6sEkR9GS2CslzBMu/s320/openHAB.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Дата на английском. Смотрим локали:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;# locale -a
C
C.UTF-8
en_US.utf8
POSIX
&lt;/pre&gt;
Запускаем, выбираем там ru_RU.UTF-8 UTF-8 и перезапускаем сервер.:
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;$ sudo dpkg-reconfigure locales 
$ export LANG=ru_RU.UTF-8
или
$ sudo echo &quot;LANG=en_US.UTF-8&quot; &amp;gt; /etc/default/locale
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну вот немного обрусевший вид.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu3pni3SEij4b0CKVHEW67FF9Kc9C7pi1av1PHc7UQU5VzhNdNjsRnH6LKGSghtidA6NvjVFyTstWv8OB5gKZa7oVjKcPzXKJISgjyHFEQacJjBr2pq2XvCf0jvf1M4DzAfQK3mrk6/s1600/openHABrus.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu3pni3SEij4b0CKVHEW67FF9Kc9C7pi1av1PHc7UQU5VzhNdNjsRnH6LKGSghtidA6NvjVFyTstWv8OB5gKZa7oVjKcPzXKJISgjyHFEQacJjBr2pq2XvCf0jvf1M4DzAfQK3mrk6/s320/openHABrus.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Если что-то не работает, можно посмотреть более детальные логи, прописав в logback.xml &amp;lt;logger level=&quot;INFO&quot; name=&quot;org.openhab&quot;&amp;gt; на &amp;lt;logger level=&quot;DEBUG&quot; name=&quot;org.openhab&quot;&amp;gt; и &amp;lt;logger level=&quot;DEBUG&quot; name=&quot;org.openhab.binding.onewire&quot;&amp;gt; (для примера смотрите logback_debug.xml). Или просто запустив start_debug.sh - в этом случае сообщения смотрим прямо в консоли.
&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер и смотрим.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_4aO2zQ_2pTSxVwgPSa5mixwSqOLkZiNpVak8VpERGBWApNjVLJOBgb3yE2LnzilxieHzaPzqmI45yIK5e_o8ZkDVXD1tXg4tOcrdP9K1juFqem6TDko8iyO9UpnzdeNMkokpsGQ/s1600/temp.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_4aO2zQ_2pTSxVwgPSa5mixwSqOLkZiNpVak8VpERGBWApNjVLJOBgb3yE2LnzilxieHzaPzqmI45yIK5e_o8ZkDVXD1tXg4tOcrdP9K1juFqem6TDko8iyO9UpnzdeNMkokpsGQ/s320/temp.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Скрипт управления и автозагрузки &lt;a href=&quot;http://code.google.com/p/openhab-samples/wiki/Tricks#How_to_configure_openHAB_to_start_automatically_on_Linux&quot;&gt;здесь&lt;/a&gt; (меняем пользователя и путь).
&lt;br /&gt;
&lt;br /&gt;
Продолжение следует!</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/7251195181844559326/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab.html#comment-form' title='Комментарии: 38'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/7251195181844559326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/7251195181844559326'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/openhab.html' title='Знакомство с OpenHAB'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdoIgJvgCWGm77QH4o4YKESPdceFMHgy-GU2m5j0JhV7ZwV030CICRZbtH1ORPfuWFZzMTIFmSYItbPBq35rCpZQ3U3jpCDBsPKXXGUiiWYL9t3t1hN9hf7gBT27N7MgzcRbYz-0EI/s72-c/architecture.png" height="72" width="72"/><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-4583217424494301732</id><published>2014-01-12T18:11:00.001+04:00</published><updated>2014-01-14T13:17:22.100+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Asterisk"/><category scheme="http://www.blogger.com/atom/ns#" term="Elastix"/><category scheme="http://www.blogger.com/atom/ns#" term="ip-телефония"/><category scheme="http://www.blogger.com/atom/ns#" term="безопасность"/><title type='text'>Безопасность в Elastix (дистрибутив Asterisk)</title><content type='html'>Пост для заметки. Во-первых, &lt;a href=&quot;http://icluzo.livejournal.com/8971.html&quot;&gt;прочитать это&lt;/a&gt;. В принципе, пост наполовину оттуда - спасибо нужно говорить там :). У меня все за фаерволом, открыты только нужные upd порты (5060 и 10000-20000).
&lt;br /&gt;
1. Закрываем доступ через web! Я сделал это внешним фаеролом. Если вы хотите попасть в web конифгуратора elastix создайте ssh туннель с другого хоста.&lt;br /&gt;
2. Запретим гостевые вызовы, для этого в файле sip_general_custom.conf пропишем
allowguest=no
&lt;br /&gt;
3. Баним всяких подборщиков паролей и сохраняем для восстановления правил после перезагрузки:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string &quot;friendly-scanner&quot; --algo bm
iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string &quot;sipcli&quot; --algo bm
iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string &quot;iWar&quot; --algo bm
iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string &quot;sipsak&quot; --algo bm
# /sbin/service iptables save
Правила брандмауэра сохраняются в /etc/sysconfig/iptables: [  OK  ]
&lt;/pre&gt;
4. Запускаем fail2ban. 
&lt;br /&gt;
&lt;br /&gt;
touch /etc/fail2ban/filter.d/asterisk.conf
&lt;br /&gt;
&lt;br /&gt;
Правила &lt;a href=&quot;http://icluzo.livejournal.com/8971.html&quot;&gt;скопипастены&lt;/a&gt; (нажмите view plain, чтобы скопировать по-нормальному):
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# Fail2Ban configuration file
#
#
# $Revision: 251 $
#
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Definition]
#_daemon = asterisk
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named &quot;host&quot;. The tag &quot;&amp;lt;host&amp;gt;&quot; can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P&amp;lt;host&amp;gt;\S+)
# Values:  TEXT
#
# Asterisk 1.8 uses Host:Port format which is reflected here
failregex = NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;:.*&#39; - Wrong password
      NOTICE.* .*: Registration from &#39;\&quot;.*\&quot;.*&#39; failed for &#39;&#39; - Wrong password
     NOTICE.* .*: Registration from &#39;\&quot;.*\&quot;.*&#39; failed for &#39;&#39; - No matching peer found
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - No matching peer found
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - No matching peer found
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - Username/auth name mismatch
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - Device does not match ACL
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - Peer is not supposed to register
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - ACL error (permit/deny)
    NOTICE.* .*: Registration from &#39;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - Device does not match ACL
    NOTICE.* .*: Registration from &#39;\&quot;.*\&quot;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - No matching peer found
    NOTICE.* .*: Registration from &#39;\&quot;.*\&quot;.*&#39; failed for &#39;&amp;lt;host&amp;gt;:.*&#39; - Wrong password
    NOTICE.* &amp;lt;host&amp;gt; failed to authenticate as &#39;.*&#39;$
    NOTICE.* .*: No registration for peer &#39;.*&#39; \(from &amp;lt;host&amp;gt;\)
    NOTICE.* .*: Host &amp;lt;host&amp;gt; failed MD5 authentication for &#39;.*&#39; (.*)
    NOTICE.* .*: Failed to authenticate user .*@&amp;lt;host&amp;gt;.*
    NOTICE.* .*: &amp;lt;host&amp;gt; failed to authenticate as &#39;.*&#39;
    NOTICE.* .*: &amp;lt;host&amp;gt; tried  to authenticate with nonexistent user &#39;.*&#39;
    VERBOSE.*SIP/&amp;lt;host&amp;gt;-.*Received incoming SIP connection from unknown peer
    NOTICE.* .*: Sending fake auth rejection for device.* \(&amp;lt;host&amp;gt;:.*\)
    NOTICE.* .*: Failed to authenticate device.* \(&amp;lt;host&amp;gt;:.*\)
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =
&lt;/pre&gt;
&lt;br /&gt;
Добавляем в конфиг  /etc/fail2ban/jail.conf (изменил немного, в почту слать ничего не надо, добавлены ip адреса игнорирования - внешняя статика и локальная сеть, бан изменен на пожизненный).
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;[asterisk-iptables]
enabled = true
filter = asterisk
action = iptables-allports[name=ASTERISK, protocol=all]
#sendmail-whois[name=ASTERISK,dest=ваш_емаил_куда_слать_сообщения_о_бане, sender=fail2ban@local]
logpath = /var/log/asterisk/full
maxretry = 10
bantime = -1
ignoreip = 127.0.0.1 XXX.XXX.XXX.XXX 192.168.0.1/24
&lt;/pre&gt;
&lt;br /&gt;
/etc/init.d/fail2ban start
&lt;br /&gt;
&lt;br /&gt;
Статус смотрим командой fail2ban-client status asterisk-iptables или # iptables -L -n (уже забанил :) )
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# fail2ban-client status asterisk-iptables
Status for the jail: asterisk-iptables
|- filter
|  |- File list:        /var/log/asterisk/full
|  |- Currently failed: 1
|  `- Total failed:     16
`- action
   |- Currently banned: 1
   |  `- IP list:       50.30.35.55
   `- Total banned:     1
&lt;/pre&gt;
&lt;br /&gt;
Для автостарта fail2ban  в файл /etc/rc.d/rc.local добавим строчку
 /etc/rc.d/init.d/fail2ban start
&lt;br /&gt;
&lt;br /&gt;
После рестарта fail2ban или после перезагрузки все адреса сбрасываются. Поэтому можно добавить  /sbin/service iptables save в крон. Я думаю раз в час будет достаточно ( /etc/crontab ):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;0 * * * * root /sbin/service iptables save
&lt;/pre&gt;
Правда командой fail2ban-client status asterisk-iptables после перезагрузки забаненных мы уже не увидим. Если вы все-таки захотите видеть и чтобы fail2ban рулил сам iptables после перезагрузки, то прочитайте &lt;a href=&quot;http://zach.seifts.us/posts/2013/07/14/how-make-fail2ban-bans-persistent&quot;&gt;вот этот&lt;/a&gt; пост. Защита от SIP флуда &lt;a href=&quot;http://habrahabr.ru/company/myasterisk/blog/130325/&quot;&gt;описана тут&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/4583217424494301732/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/elastix-asterisk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4583217424494301732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4583217424494301732'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/elastix-asterisk.html' title='Безопасность в Elastix (дистрибутив Asterisk)'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-8790294881305179311</id><published>2014-01-08T23:46:00.000+04:00</published><updated>2014-01-09T08:46:04.436+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="openremote"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Безопасный доступ к OpenRemote</title><content type='html'>&lt;a href=&quot;http://vermus.blogspot.ru/2014/01/openremote-1-wire-owfs.html&quot;&gt;Мы создали первое приложение в OpenRemote&lt;/a&gt; в локальной сети. Но ясное дело , что управлять то мы хотим не только из локальной сети, а еще и через интернет. Это означает, что нам надо обеспокоиться нашей безопасностью. Ну и самые элементарные вещи это - внедрение парольной защиты и шифрование трафика между клиентом и контроллером.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Зашифрованное соединение.&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что для шифрования трафика надо использовать &lt;a href=&quot;http://ru.wikipedia.org/wiki/SSL#.D0.92.D0.B5.D0.B1.D1.81.D0.B0.D0.B9.D1.82.D1.8B&quot;&gt;https&lt;/a&gt;. Подготовим самоподписанные сертификаты в директории /home/openremote/.keystore:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;$ keytool -genkey -alias tomcat -keyalg RSA -validity 3600 -keystore ~/.keystore
&lt;/pre&gt;
&lt;br /&gt;
Когда спросят про второй пароль его вводить не надо - вы обязаны оставить прежний (по умолчанию). Далее переходим в файл /srv/openremote/conf/server.xml и правим следующий кусок:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;    
&amp;lt;connector clientauth=&quot;false&quot; keystorepass=&quot;changeit&quot; 
maxthreads=&quot;150&quot; port=&quot;8443&quot; protocol=&quot;HTTP/1.1&quot; scheme=&quot;https&quot; 
secure=&quot;true&quot; sslenabled=&quot;true&quot; sslprotocol=&quot;TLS&quot;&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
Внимание, мы не только его раскомментировали, но и добавили keystorePass=&quot;changeit&quot; - пароль, который вводили при генерации сертификатов. Пробуем запускать скрипт с параметром run - так видно логи сервера. Заходим https://192.168.xx.xx:8443/webconsole/ - должно работать. Теперь закомментируем небезопасный порт 8080, чтобы протестировать клиентов. 
&lt;br /&gt;
&lt;br /&gt;
Пробуем андроид клиент - в нем адрес контроллера оставляем, только нажимаем на кнопочку SSL в самом низу настроек. Порт указан там же. Теперь пробуем онлайн webconsole, тут по-другому. Удаляем старый адрес контроллера, вводим новый https://192.168.xx.xx:8443/controller/
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Авторизация.&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Хорошо, с шифрованным соединением решили. Авторизация тоже заложена в системе, но немного не явным образом. Для начала правим файл: /security/users.xml:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?&amp;gt;
&amp;lt;tomcat-users&amp;gt;
  &amp;lt;role rolename=&quot;openremote&quot;/&amp;gt;
  &amp;lt;user username=&quot;vermus&quot; password=&quot;test&quot; roles=&quot;openremote&quot;/&amp;gt;
&amp;lt;/tomcat-users&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Потом открываем файл webapp/controller/WEB-INF и расскоментируем следующие строки:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;!-- Constraint resource: /rest/control/* --&amp;gt;
  
    &amp;lt;security-constraint&amp;gt;
      &amp;lt;web-resource-collection&amp;gt;
        &amp;lt;web-resource-name&amp;gt;Control command RESTful service of Openremote Controller&amp;lt;/web-resource-name&amp;gt;
        &amp;lt;description&amp;gt;Control command RESTful service of Openremote Controller&amp;lt;/description&amp;gt;
        &amp;lt;url-pattern&amp;gt;/rest/control/*&amp;lt;/url-pattern&amp;gt;
        &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;
        &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;
      &amp;lt;/web-resource-collection&amp;gt;
      &amp;lt;auth-constraint&amp;gt;
        &amp;lt;role-name&amp;gt;openremote&amp;lt;/role-name&amp;gt;
      &amp;lt;/auth-constraint&amp;gt;
    &amp;lt;/security-constraint&amp;gt;
  

  &amp;lt;!-- Constraint resource: /rest/panel/* --&amp;gt;
  
    &amp;lt;security-constraint&amp;gt;
      &amp;lt;web-resource-collection&amp;gt;
        &amp;lt;web-resource-name&amp;gt;Panel identity RESTful service of Openremote Controller&amp;lt;/web-resource-name&amp;gt;
        &amp;lt;description&amp;gt;Panel identity RESTful service of Openremote Controller&amp;lt;/description&amp;gt;
        &amp;lt;url-pattern&amp;gt;/rest/panel/*&amp;lt;/url-pattern&amp;gt;
        &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;
        &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;
      &amp;lt;/web-resource-collection&amp;gt;
      &amp;lt;auth-constraint&amp;gt;
        &amp;lt;role-name&amp;gt;openremote&amp;lt;/role-name&amp;gt;
      &amp;lt;/auth-constraint&amp;gt;
    &amp;lt;/security-constraint&amp;gt;
  

  
   &amp;lt;security-constraint&amp;gt;
     &amp;lt;web-resource-collection&amp;gt;
       &amp;lt;web-resource-name&amp;gt;Status command RESTful service of Openremote Controller&amp;lt;/web-resource-name&amp;gt;
       &amp;lt;description&amp;gt;Status command RESTful service of Openremote Controller&amp;lt;/description&amp;gt;
       &amp;lt;url-pattern&amp;gt;/rest/status/*&amp;lt;/url-pattern&amp;gt;
       &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;
       &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;
     &amp;lt;/web-resource-collection&amp;gt;
     &amp;lt;auth-constraint&amp;gt;
       &amp;lt;role-name&amp;gt;openremote&amp;lt;/role-name&amp;gt;
     &amp;lt;/auth-constraint&amp;gt;
   &amp;lt;/security-constraint&amp;gt;
   &amp;lt;security-constraint&amp;gt;
     &amp;lt;web-resource-collection&amp;gt;
       &amp;lt;web-resource-name&amp;gt;Polling command RESTful service of Openremote Controller&amp;lt;/web-resource-name&amp;gt;
       &amp;lt;description&amp;gt;Polling command RESTful service of Openremote Controller&amp;lt;/description&amp;gt;
       &amp;lt;url-pattern&amp;gt;/rest/polling/*&amp;lt;/url-pattern&amp;gt;
       &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;
       &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;
     &amp;lt;/web-resource-collection&amp;gt;
     &amp;lt;auth-constraint&amp;gt;
       &amp;lt;role-name&amp;gt;openremote&amp;lt;/role-name&amp;gt;
     &amp;lt;/auth-constraint&amp;gt;
   &amp;lt;/security-constraint&amp;gt;
  
 
    &amp;lt;login-config&amp;gt;
      &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;
      &amp;lt;realm-name&amp;gt;OPENREMOTE_Controller&amp;lt;/realm-name&amp;gt;
    &amp;lt;/login-config&amp;gt;
    &amp;lt;security-role&amp;gt;
      &amp;lt;role-name&amp;gt;openremote&amp;lt;/role-name&amp;gt;
    &amp;lt;/security-role&amp;gt;
&amp;lt;/pre&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Заходим в webconsole и при клике на выбранной панели система спросит нас логин с паролем. Приложение для андроид (кстати, качайте последнее с сайта, в google play на данный момент 2.0.0 , который даже не поддерживает https).
&lt;br /&gt;
&lt;br /&gt;
Итак, мы неплохо обезопасили нашу систему, жаль что для новичков эти шаги были бы не очевидными. Плюс меня еще смущает: древняя версия openremote под  андроид в гугл плей, отсутствие внятной документации, онлайновый дизайнер, отсутствие сбора данных, ориентированность на платный продукт и т.п.... &lt;br /&gt;
В общем, я решил испробовать другую систему openhab, которая лишена всех этих недостатков, хоть в ней &lt;a href=&quot;https://github.com/openhab/openhab/issues/438&quot;&gt;вроде бы&lt;/a&gt; и есть &lt;a href=&quot;https://github.com/openhab/openhab/issues/109&quot;&gt;проблема&lt;/a&gt; с 1-wire. Я думаю ее можно как-то решить, кроме owserver же есть еще и owhttpd (может http binding сработает) и owfs (может можно писать в файлы локально). Хоть ее и начали писать позже openremote кстати! Но по моим наблюдениям она гораздо динамичнее развивается. В общем, будем смотреть!</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/8790294881305179311/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/openremote.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8790294881305179311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8790294881305179311'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/openremote.html' title='Безопасный доступ к OpenRemote'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-4478347993079254541</id><published>2014-01-05T20:42:00.002+04:00</published><updated>2014-01-07T20:00:14.693+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="cubietruck"/><category scheme="http://www.blogger.com/atom/ns#" term="DS9490R"/><category scheme="http://www.blogger.com/atom/ns#" term="openremote"/><category scheme="http://www.blogger.com/atom/ns#" term="owfs"/><category scheme="http://www.blogger.com/atom/ns#" term="owserver"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Платформа умного дома OpenRemote. Знакомство. Подключаем 1-wire через owfs.</title><content type='html'>Пока я жду DS2406P+ и DS2408S+ занялся серверной и клиентской стороной &lt;a href=&quot;http://vermus.blogspot.ru/2014/01/1-wire.html&quot;&gt;умного дома&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://openremote.org/&quot;&gt;OpenRemote&lt;/a&gt; представляет из себя сервер, который получает команды от мобильного или веб приложения и дальше транслирует их другому контроллеру или серверу.
&lt;br /&gt;
&lt;br /&gt;
OpenRemote это:&lt;br /&gt;
&lt;br /&gt;
1) Сервер умного дома, работает на десятке платформ, даже на NAS Synology и Windows.&lt;br /&gt;
&lt;br /&gt;
2) Онлайн-cреда для разработки приложения.&lt;br /&gt;
&lt;br /&gt;
3) Мобильное приложение, которое загружает данные для своей работы из среды для разработки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfHe5rcM_rzJ5LHX2lgrJknrmGqbKcJPvVWRMHgowbyP1y6jiAc-8HOCP3KZkkaw6d-W7b6sUXCx6plBT4jK_ceksOwTfULvaN-cHDqMcVe0CJ_xpTyFSMQ4cE1NaVJ6Sq9fcIy4zH/s1600/SystemOverview2_1500px.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfHe5rcM_rzJ5LHX2lgrJknrmGqbKcJPvVWRMHgowbyP1y6jiAc-8HOCP3KZkkaw6d-W7b6sUXCx6plBT4jK_ceksOwTfULvaN-cHDqMcVe0CJ_xpTyFSMQ4cE1NaVJ6Sq9fcIy4zH/s320/SystemOverview2_1500px.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Поддерживаемые технологии.&lt;br /&gt;
AMX, KNX, Lutron, Z-Wave, 1-Wire, EnOcean, xPL, Insteon, X10, Infrared, Russound, GlobalCache, IRTrans, XBMC, VLC, panStamps, Denon AVR, FreeBox, MythTV и другие.
&lt;br /&gt;
&lt;br /&gt;
У нас есть owfs с показаниями термометра. Давайте посмотрим как нам связать все это дело воедино.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Установка.&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Сubietruck похож  на Raspberry Pi, поэтому мы воспользуемся следующим &lt;a href=&quot;http://www.openremote.org/display/docs/OpenRemote+2.0+How+To+-+Install+Controller+on+Raspberry+Pi&quot;&gt;мануалом&lt;/a&gt;. 
&lt;br /&gt;
&lt;br /&gt;
Процессор в Cubietruck версии ARMv7, который поддерживает операции с плавающей точкой на аппаратном уровне (Hard-float). Наш &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3-nand.html&quot;&gt;Debian&lt;/a&gt; ( &lt;a href=&quot;http://www.debian.org/releases/stable/armel/release-notes/ch-whats-new.ru.html#idp155392&quot;&gt;ARMv7 (EABI hard-float ABI, «armhf»)&lt;/a&gt; ) также поддерживает.
&lt;br /&gt;
&lt;br /&gt;
Вообще &lt;a href=&quot;http://www.openremote.org/display/docs/OpenRemote+2.0+How+To+-+Install+Controller+on+Raspberry+Pi#OpenRemote2.0HowTo-InstallControlleronRaspberryPi-2.InstallJavaVirtualMachine&quot;&gt;пишут&lt;/a&gt;, что использование java машины с плавающей точкой на аппаратном уровне может иметь проблемы со стабильностью и совместимостью. Посмотрим, что у нас в дебиане. Перед тем как ставить java я немного &lt;a href=&quot;http://www.openremote.org/pages/viewpage.action?pageId=22877075&quot;&gt;изучил&lt;/a&gt; возможные проблемы и какую все таки версию ставить. Читаем комментарий ANDREAS DROLLINGER по ссылке - в нем написано:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
OpenJDK (IcedTea6 Zero VM) is slower than Oracle Java, but it is available for hard float installation and the Drools rule engine 5.1.1 works.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
В общем-то рекомендует нам использовать OpenJDK 6 с IcedTea6 (с поддержкой таки hard float), оно немного помедленней, ну и ладно, у нас нагрузка не высокая, будет критично - переустановим. Смотрим, что есть у нас в наличии.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;root@debtruck:~# apt-cache search icedtea-6-jre
icedtea-6-jre-cacao - Alternative JVM for OpenJDK, using Cacao
icedtea-6-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Судя по довольно &lt;a href=&quot;https://blogs.oracle.com/jtc/entry/comparing_arm_linux_jvms_revisited&quot;&gt;интересным статье&lt;/a&gt; сравнения JamVM немного &lt;a href=&quot;https://blogs.oracle.com/jtc/entry/comparing_jvms_on_arm_linux&quot;&gt;получше&lt;/a&gt;, чем Cacao, поэтому буду пробовать его. Ставим:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# apt-get install icedtea-6-jre-jamvm
root@debtruck:~# which java
/usr/bin/java
# java -version
java version &quot;1.6.0_27&quot;
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
root@debtruck:~# which java
/usr/bin/java
# java -jamvm -version
java version &quot;1.6.0_27&quot;
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
JamVM (build 1.6.0-devel, inline-threaded interpreter with stack-caching)
# export JAVA_HOME=/usr
&lt;/pre&gt;
&lt;br /&gt;
Редактируем /etc/java-6-openjdk-armhf/jvm-armhf.cfg перенеся -jamvm KNOWN в начало списка. 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# java -version
java version &quot;1.6.0_27&quot;
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
JamVM (build 1.6.0-devel, inline-threaded interpreter with stack-caching)
&lt;/pre&gt;
&lt;br /&gt;
Видим, что у нас JamVM используется по умолчанию.
&lt;br /&gt;
&lt;br /&gt;
Качаем контроллер.
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# cd /usr/src/
# wget http://download.openremote.org/
&lt;/pre&gt;
&lt;br /&gt;
У меня скачался OpenRemote-Controller-2.1.0_SNAPSHOT-2013-06-17.zip.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Настройка и использование OpenRemote&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь давайте создадим пользователя под которым будет запускаться контроллер. ( #adduser openremote , #su openremote ). Создадим под root директорию /srv/or/ дадим chown openremote на нее. Распакуем архив в нее.
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;$ cd /srv/or/bin
$ chmod +x openremote.sh
$ ./openremote.sh run
....
INFO: Server startup in 19386 ms
&lt;/pre&gt;
Регистрируемся на &lt;a href=&quot;https://composer.openremote.org/demo/register.jsp&quot;&gt;сайте&lt;/a&gt;. Заходим в online редактор. Я обычно не доверяю таким онлайн штукам. Но да ладно, в принципе есть исходники - пишут, что можно и оффлайн устанавливать дизайнер, но пока я смысла в этом не вижу. Создаем новый &lt;a href=&quot;http://www.openremote.org/display/docs/OpenRemote+2.2+How+To+-+1-Wire+Sensors&quot;&gt;Device&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-08-YTdGs7rfaz6IUvqBfvlxvSE7kE2ZeYrQ_7mV-MQrO5RiJWAhz1d-3duSSQiTaxsAZnQzKh128JJ8PraC0LodkNsJTTR1p-Fxv9Ub03IVzUR-4proyLpQ3iyfY5TOmJkrtv5oN/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-08-YTdGs7rfaz6IUvqBfvlxvSE7kE2ZeYrQ_7mV-MQrO5RiJWAhz1d-3duSSQiTaxsAZnQzKh128JJ8PraC0LodkNsJTTR1p-Fxv9Ub03IVzUR-4proyLpQ3iyfY5TOmJkrtv5oN/s320/1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь создаем команду (тут можно не прописывать хост и порт каждый раз в версии 2.2, там есть config for controller onewire. В версии 2.1. пока его нет). 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghvPqE1LciMSTc2kLffbYy20Q3jdWaEOi84cZyL09HBPxaYnnIcuv9LCrjDb7vlf-V2YKefLam2IFuDf5uoOwFORKeQtp-coZl3WJsxd5OUvCm0PidRy06AhxSxj9czGuIfzxGyGGz/s1600/3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghvPqE1LciMSTc2kLffbYy20Q3jdWaEOi84cZyL09HBPxaYnnIcuv9LCrjDb7vlf-V2YKefLam2IFuDf5uoOwFORKeQtp-coZl3WJsxd5OUvCm0PidRy06AhxSxj9czGuIfzxGyGGz/s320/3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь создаем сенсор.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6l5oM8cIHJnR2o47V6_2ifhyphenhyphenR-4exQN1U3IdhB13WZfv126K3gOnQcbJRjm1M9BbU-LqghG4zqoIUniKjLXhL_pQRG-qxxRjzCwtnP19x7q3H0K44qm5sCLLyi4jgle30Y8ui6XU-/s1600/5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6l5oM8cIHJnR2o47V6_2ifhyphenhyphenR-4exQN1U3IdhB13WZfv126K3gOnQcbJRjm1M9BbU-LqghG4zqoIUniKjLXhL_pQRG-qxxRjzCwtnP19x7q3H0K44qm5sCLLyi4jgle30Y8ui6XU-/s320/5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь &lt;a href=&quot;http://www.openremote.org/display/docs/OpenRemote+2.0+How+To+-+Design+User+Interface#OpenRemote2.0HowTo-DesignUserInterface-UIDesigner&quot;&gt;перейдем во вкладку&lt;/a&gt; &quot;Дизайн&quot;. Создадим новую панель Android (у меня только андроид :) ). Добавим в нее пару Label - один просто текст, во втором выберем наш сенсор. Ну вот вроде и готово. Перейдем  по адресу http://openremoteserver:8080/controller/ и нажмем Sync with Online Designer, тем самым загрузим созданное приложение на контроллер OpenRemote (Что интересно, можно делать это и оффлайн, тем самым сохранив бекап с приложением - в онлайн редакторе есть возможность сохранить приложение как zip файл, а на контроллере импортировать). После синхронизации заходим на  веб-консоль ( http://192.168.xx.xx:8080/webconsole/ ) и нажимаем найти контроллер, после этого вебконсоль находит наш локальный контроллер, нажимаем на него и видим наше созданное приложение. И опять не работает. :)
&lt;br /&gt;
&lt;br /&gt;
Проблема вот в чем, по умолчанию owserver отвечает только по адресу localhost:4304 , то есть контроллер по имени благополучно подключается, а вот по ip (127.0.0.1) нет. Поэтому пропишем так server: port = 127.0.0.1:4304 (для доступа из сети просто пишем server: port = 4304) в owfs.conf. Перезапускаем сервер owserver: #service owserver restart . Работает:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrt_kvfGMqCXAhisTVK1HRsAt30cS3ZyK26OGDJ2wFpBlAMmdtFJRx9a-46yLpDgsMMwiaPaxEDWcTEvSxggijpTYVdOOEoQA7k0D8XoMS4L2JbiW6LPRVDnwAe4vDuj9GUwy9aSIp/s1600/4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrt_kvfGMqCXAhisTVK1HRsAt30cS3ZyK26OGDJ2wFpBlAMmdtFJRx9a-46yLpDgsMMwiaPaxEDWcTEvSxggijpTYVdOOEoQA7k0D8XoMS4L2JbiW6LPRVDnwAe4vDuj9GUwy9aSIp/s320/4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Для установки приложения на мобильный телефон, устанавливаем &lt;a href=&quot;http://sourceforge.net/projects/openremote/files/For%20Developers/OpenRemote-2.0-Android_SNAPSHOT_20111012.apk/download&quot;&gt;приложение для андроид&lt;/a&gt; и оно само находит контроллер в локальной сети - подключаемся, работает.
&lt;br /&gt;
Добавляем строчку cd /srv/openremote/bin в openremote.sh, иначе при запуске из другого места могут вылезти косяки. Скрипт init.d для контроллера
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;#!/bin/sh
### BEGIN INIT INFO
# Provides:          openremote
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

#!/bin/sh

User=openremote
orpass=/srv/openremote/bin

case &quot;$1&quot; in

stop)
        echo &quot;Stopping OpenRemote Controller...&quot;
        su -l $User -c &quot;$orpass/openremote.sh stop&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
        ;;

start)
        # start OpenRemote in background mode
        su -l $User -c &quot;$orpass/openremote.sh start&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
        echo &quot;OpenRemote Controller started...&quot;
        ;;

restart)
        $0 stop
        sleep 5
        $0 start
        ;;
*)
        echo &quot;usage: $0 { start | stop | restart}&quot; &amp;gt;&amp;amp;2
        exit 1
        ;;

esac
&lt;/pre&gt;
&lt;br /&gt;
Ну и автозапуск update-rc.d.&lt;br /&gt;
&lt;br /&gt;
ps. Вообще для доступа через интернет ip адрес контроллера должен быть внешним.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/4478347993079254541/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/openremote-1-wire-owfs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4478347993079254541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4478347993079254541'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/openremote-1-wire-owfs.html' title='Платформа умного дома OpenRemote. Знакомство. Подключаем 1-wire через owfs.'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfHe5rcM_rzJ5LHX2lgrJknrmGqbKcJPvVWRMHgowbyP1y6jiAc-8HOCP3KZkkaw6d-W7b6sUXCx6plBT4jK_ceksOwTfULvaN-cHDqMcVe0CJ_xpTyFSMQ4cE1NaVJ6Sq9fcIy4zH/s72-c/SystemOverview2_1500px.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-771377328864245908</id><published>2014-01-05T14:57:00.001+04:00</published><updated>2014-01-17T21:31:13.751+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="foobar2000"/><category scheme="http://www.blogger.com/atom/ns#" term="now playing"/><category scheme="http://www.blogger.com/atom/ns#" term="pidgin"/><category scheme="http://www.blogger.com/atom/ns#" term="pidgin-musictracker"/><title type='text'>Now Playing (сейчас играет) в связке foobar2000 и pidgin</title><content type='html'>Отображение в строке статуса pidgin трека, играющего в foobar2000. Пишу для памяти. :)
&lt;br /&gt;
&lt;br /&gt;
1. Ставим плагин &lt;a href=&quot;http://code.google.com/p/pidgin-musictracker/&quot;&gt;http://code.google.com/p/pidgin-musictracker/&lt;/a&gt; . К сожалению, поддержка foobar2000 у меня не заработала (хотя ее и удалить собираются вскоре). &lt;a href=&quot;http://code.google.com/p/pidgin-musictracker/wiki/FAQ#8&quot;&gt;Поэтому&lt;/a&gt;:&lt;br /&gt;
2. Ставим &lt;a href=&quot;http://chronial.de/foobar2000/#foo_winamp_spam&quot;&gt;foo_winamp_spam&lt;/a&gt; в foobar2000 (копируем в папку components, перезапускаем foobar). 
&lt;br /&gt;
3. Заходим в pidgin в &quot;средства-модули&quot;, включаем winamp. Чтобы увидеть свой статус либо качаем плагин &lt;a href=&quot;http://vayurik.ru/wordpress/toobars&quot;&gt;http://vayurik.ru/wordpress/toobars&lt;/a&gt; , либо добавляем себя в ростер (список контактов).
&lt;br /&gt;
4. Если что-то пошло не так, открываем &quot;помощь-окно отладки&quot;. У меня например Status format: пустой, поэтому в статус ничего не выводилось. Это происходило потому, что плагин думал, что проигрывание остановлено (поле &quot;остановлено&quot; в настройках по умолчанию пусто). Плюс %t - берет полное название (%t настраивается в foobar2000-tools-winamp api emulation). В pidgin-musictracker вообще какое-то мутное определение плеера, без foo_winamp_spam плагин таки определяет заголовок, но при парсинге возвращает -1. Похоже сначала сканируются заголовки окон, а потом решается какой API использовать) &lt;br /&gt;
&lt;br /&gt;
В общем, я настраиваю второй раз, на win 7 определение того, что трек &quot;играет&quot; работало, сейчас пока оставляю так.
&lt;br /&gt;
&lt;br /&gt;
Шаблон: np: %t&lt;br /&gt;
Результат:&lt;br /&gt;
&lt;b&gt;Состояние: Не беспокоить: np: Samurai - Four Seasons&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update&lt;/b&gt;. Если у вас на срастется с плагином winamp API под foobar2000, его можно заменить плагином &lt;a href=&quot;http://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Components_0.9/WLM_Notifier_%28foo_wlm%29&quot;&gt;WLM Notifier&lt;/a&gt;, его надо скопировать в components, включить в foobar2000, после чего поменять в настройках pidgin-musictracker плеер на Messenger compatible interface. У меня он работает гораздо лучше (понимает &quot;стоп&quot; и &quot;паузу&quot;):
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Состояние: Не беспокоить: ♫: Roxy Music - Avalon&lt;/b&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/771377328864245908/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/now-playing-foobar200-pidgin.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/771377328864245908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/771377328864245908'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/now-playing-foobar200-pidgin.html' title='Now Playing (сейчас играет) в связке foobar2000 и pidgin'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-1998524758470177364</id><published>2014-01-02T22:28:00.001+04:00</published><updated>2014-01-03T11:49:54.285+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="cubietruck"/><category scheme="http://www.blogger.com/atom/ns#" term="DS18B20"/><category scheme="http://www.blogger.com/atom/ns#" term="DS9490R"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenHAB"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Создание термометра в сети 1-wire</title><content type='html'>Итак, мы &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html&quot;&gt;научились подключать устройство&lt;/a&gt; 1-wire к контроллеру. 
&lt;br /&gt;
&lt;br /&gt;
Оффтопик. Давайте-ка я все-таки расскажу что и где покупал.&lt;br /&gt;
1. Cubietruck - &lt;a href=&quot;http://store.r0ck.me/collections/home-slide/products/cubietruck-2gb-ram-8gb-flash-with-wifi-bt&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
2. Контроллер DS9490R, термометр DS18B20 - &lt;a href=&quot;http://www.ab-log.ru/smart-house/1-wire-modules&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
3. Прототипные платы - &lt;a href=&quot;http://www.aliexpress.com/item/50pcs-5x7-cm-DIY-Prototype-Paper-PCB-Universal-Experiment-Matrix-Circuit-Board-wholesale-Dropshipping/1061339069.html&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
4. Проводочки :) - &lt;a href=&quot;http://www.ebay.com/itm/260515307911&quot;&gt;30 ft Kynar wire wrap wire 30 awg 4 modding 10 color&lt;/a&gt;.&lt;br /&gt;
5. 100 штук RJ11\12 - &lt;a href=&quot;http://www.ebay.com/itm/200612919210&quot;&gt;100× Modular Lan Network Connector Plug RJ11 6P6C CAT5&lt;/a&gt;&lt;br /&gt;
6. Остальное в местном радио магазине (включая внешние телефонные розетки и некоторые разъемы по питанию).
&lt;br /&gt;
&lt;br /&gt;
Для создания &lt;a href=&quot;http://www.e-voron.dp.ua/files/pdf/maxim/ds18b20-rus.pdf&quot;&gt;термометра&lt;/a&gt; используем схему с сайта &lt;a href=&quot;http://www.benuks.ru/oborud.html#5&quot;&gt;Бенукс&lt;/a&gt; (сайт вообще отличный, самое лучшее и доступное описание 1-wire сети и устройств). &lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvg_SV8UM-6yt8cmn6lEzI0CJFTwM-piasoiBKNojcvR5Op_stjT0LvQgrZsQ81HUir1rGWH-2CsBA_riiyskBd_L2alTc31SQAc81jqyBfCj3yse6Z9SABgO7L63NpMo1FVMGjZo9/s1600/sh_ture.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvg_SV8UM-6yt8cmn6lEzI0CJFTwM-piasoiBKNojcvR5Op_stjT0LvQgrZsQ81HUir1rGWH-2CsBA_riiyskBd_L2alTc31SQAc81jqyBfCj3yse6Z9SABgO7L63NpMo1FVMGjZo9/s320/sh_ture.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Травить плату я не умею (хотя в инете полно видео технологии ЛУТ - может быть в скором времени и попробую), поэтому решил делать на прототипных платах - схема в принципе не такая сложная:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UXLlRHQxUDggatauSJv1cUBi3aNM1cuF4lGe17HahPfJ21O2VHpXIpBmMuHiUTAsv3SU5-nmrQ8dFcv3Bo152JQzjtgiBuHx9vWGa86HlX8dxLEipQDHhKystxXpRpvCrwcJAEuj/s1600/50pcs-5x7-cm-DIY-Prototype-Paper-PCB-Universal-Experiment-Matrix-Circuit-Board-wholesale-Dropshipping.jpg_350x350.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UXLlRHQxUDggatauSJv1cUBi3aNM1cuF4lGe17HahPfJ21O2VHpXIpBmMuHiUTAsv3SU5-nmrQ8dFcv3Bo152JQzjtgiBuHx9vWGa86HlX8dxLEipQDHhKystxXpRpvCrwcJAEuj/s320/50pcs-5x7-cm-DIY-Prototype-Paper-PCB-Universal-Experiment-Matrix-Circuit-Board-wholesale-Dropshipping.jpg_350x350.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
По схеме: в принципе ничего сложного даже для такого новичка, как я. 78L05 - стабилизатор, преобразует 12 вольт на нашей шине в 5 вольт для датчика. Кстати! Мы приведем сеть 1-wire в порядок и пустим по ней 12 вольт, не будем использовать паразитное питание. Остальные элементы &lt;a href=&quot;http://benuks.flyboard.ru/viewtopic.php?p=371#p371&quot;&gt;описаны разработчиком схемы&lt;/a&gt; (обсуждение немного другой платы, поэтому 5 пункт можно не читать и обозначения не все совпадают - но я думаю догадаться можно о чем речь):
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;1. Диод D6 - для каких целей он служит и почему выбран именно КД521?&lt;/b&gt;&lt;br /&gt;
Этот диод уменьшает влияние &quot;просадок&quot; по общей шине питания на данный модуль. Здесь допускается применение любого маломощного выпрямительного диода. КД521 взят только потому, что был под рукой.&lt;br /&gt;
&lt;br /&gt;
2. &lt;b&gt;Конденсатор C2 - для каких целей он служит? Ведь в datasheet к 7805 указаны только 2 конденсатора, по 0,33 и 0,1 соответственно.&lt;/b&gt;&lt;br /&gt;
Во время &quot;просадок&quot; питания по общей шине этот конденсатор поддерживает питание данного модуля.&lt;br /&gt;
&lt;br /&gt;
3. &lt;b&gt;Сопротивление R2 - почему именно 100 Ом?&lt;/b&gt;&lt;br /&gt;
Оптимальный номинал, который с одной стороны является элементом защиты, а с другой стороны не оказывает большого влияния на полезные сигналы 1-wire.&lt;br /&gt;
&lt;br /&gt;
4.&lt;b&gt; Стабилитрон D3 - почему выбран именно КС156?&lt;/b&gt;&lt;br /&gt;
Этот элемент совместно с резистором R2 является цепочкой защиты модуля от импульсных помех по микросети. Выбран с несколько большим напряжением, чтобы не влиять на полезный сигнал 1-Wire и Pullup, а &quot;срезать&quot; случайные импульсные помехи превышающие 5,6 В.&lt;br /&gt;
&lt;br /&gt;
5.&lt;b&gt; Действительно ли так нужна опторазвязка на схеме между DS2413 и реле, или можно обойтись транзистором + реле?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Можете исключить опторазвязку, но тогда при работе через USB-адаптер может быть подвисание порта. &lt;/blockquote&gt;
&lt;br /&gt;
Приступили к пайке схемы, предварительно разрезав плату ножницами по металу под внешнюю телефонную розетку и пролудив ее. Получили нечто вроде этого (микросхему пока не паяем, сначала хочу проверить вольтаж).
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXn8KrrHyN77dTnchg_rGyBRP4xthO873jc4u8gkgXbhHrMysWUQJvoBBBTrLaGj3IAP-zxOYFesbO3rViS4GHnna-NRVz-tM8BzuqXvS_nvVZ1LyU0bpwAwxyKZHD76BTre9WKX88/s1600/20131229_220331.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXn8KrrHyN77dTnchg_rGyBRP4xthO873jc4u8gkgXbhHrMysWUQJvoBBBTrLaGj3IAP-zxOYFesbO3rViS4GHnna-NRVz-tM8BzuqXvS_nvVZ1LyU0bpwAwxyKZHD76BTre9WKX88/s320/20131229_220331.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoiGAx9LwV5FhcebtE3KcXRkEg70mySLUbKaP7kPWa4pQVThA8jDv3ljtPobDtjTT97Em3bKPq9kBju7as-sg0ZN2YoySD_tsMaImgMyHrF3mQ8nvruVlm2YuO900l7E3dPGGUxcVd/s1600/20131229_225132.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoiGAx9LwV5FhcebtE3KcXRkEg70mySLUbKaP7kPWa4pQVThA8jDv3ljtPobDtjTT97Em3bKPq9kBju7as-sg0ZN2YoySD_tsMaImgMyHrF3mQ8nvruVlm2YuO900l7E3dPGGUxcVd/s320/20131229_225132.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь надо сделать саму шину. Для этого я купил 6 контактные телефонные разъемы (RJ12 в простонародии - почитайте вики, чтобы не купить что-нибудь не то) по цене примерно 200 рублей за 100 штук (см. пункт 5 в закупках). Я решил обжимать по схеме B в RJ45 (без оранжевого и светло-оранжевого) ибо уже привык к ней :) , запишем распиновку. Теперь обжимаю все шесть проводов, а не как в прошлом посте, так обжимка получается качественнее.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOEkCVj_8xeg2ZIIPJi9Pxsra7bmC_4UIQNlFLlChS8j4nvAU5WgP9IA8V78YR8WmaOHOIabZYNAe8yiHZLmUfvTw3N5UdzpJySciHF_xCzBI2EX96SwH1p5mnSxY-BixEfxMH0-s-/s1600/rj45.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOEkCVj_8xeg2ZIIPJi9Pxsra7bmC_4UIQNlFLlChS8j4nvAU5WgP9IA8V78YR8WmaOHOIabZYNAe8yiHZLmUfvTw3N5UdzpJySciHF_xCzBI2EX96SwH1p5mnSxY-BixEfxMH0-s-/s320/rj45.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
У меня вид с обратной стороны по B (то есть контакты от 8 до 3 включительно)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8azT0FigziMmR7TRiUY8gWj17pSV8nZGNkUaZXvMtu2nEbFw205DbsxTSRf63FU0XHJ8vhZ9zn5fqlRCvQDijqIZgmWUOom3uae4apjVmU4f9jndSplF8W1vP8t5yZ55vYW38St-O/s1600/20131229_223612.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8azT0FigziMmR7TRiUY8gWj17pSV8nZGNkUaZXvMtu2nEbFw205DbsxTSRf63FU0XHJ8vhZ9zn5fqlRCvQDijqIZgmWUOom3uae4apjVmU4f9jndSplF8W1vP8t5yZ55vYW38St-O/s320/20131229_223612.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Светло-зелёный - не используется.&lt;br /&gt;
2. Синий - черный в розетку - +12 вольт.&lt;br /&gt;
3. Светло-синий - красный в розетке - Data.&lt;br /&gt;
4. Зелёный - зелёный в розетке - земля.&lt;br /&gt;
5. Светло-коричневый - жёлтый в розетке - +18 вольт.&lt;br /&gt;
6. Коричневый - свободный.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&quot;Организатор&quot; шины&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь я подумал как же мы будем подключать 18 и 12 вольт? Ну и решил взять еще одну розетку и сделать из нее некий переходник-организатор (дурацкое название, что-то сейчас лучше в голову не пришло :) ).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoA9WFvQkAgzhcOPk6nl88-3V4qIHIUZCG43b-f4ngLG1xV_IEQ5-9l7AVv8hY_tHTsm1aF3-aUmkNLLecSOifeznkT6Ve7fdS6Y6C3XSFbgqVj9Y3yvL4GsK7E_yzar6zY7sV94vH/s1600/9490.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoA9WFvQkAgzhcOPk6nl88-3V4qIHIUZCG43b-f4ngLG1xV_IEQ5-9l7AVv8hY_tHTsm1aF3-aUmkNLLecSOifeznkT6Ve7fdS6Y6C3XSFbgqVj9Y3yvL4GsK7E_yzar6zY7sV94vH/s320/9490.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Смотрим распиновку. Нам нужны только 3 и 4 контакты. Обжимаем как хотим один конец (советую выщипать лишние контакты), а второй оставляем - его будем впаивать в макетплату.
&lt;br /&gt;
&lt;br /&gt;
Разбираем розетку, паяем. У меня получилось вот так вот
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmJilmNr3ugunsLtkFLzxn4VuBMoHsmp1qPz4-azB-pSvMCg-PmzDvXKR1hRgSr17nVKvLMStYLSDe6ct-LYsXHMvnUVeH9uZ4IQD1odaE6TRxFd-v0IJUnjFwxbfRji9O1GENnRR/s1600/20140101_191741.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmJilmNr3ugunsLtkFLzxn4VuBMoHsmp1qPz4-azB-pSvMCg-PmzDvXKR1hRgSr17nVKvLMStYLSDe6ct-LYsXHMvnUVeH9uZ4IQD1odaE6TRxFd-v0IJUnjFwxbfRji9O1GENnRR/s320/20140101_191741.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF5O6461rhZ_Cc7o6YviNNzZh2Z-xHNV8idsIoFAsFp9xOB2vttRXOcSrMZYYdo9yzoserXzoaklgwU9M0EPqrbYAY-THuZp9KP_Skvmm02mF4XAGmy7dnS5ex8fNzDZwwtDZQH6q4/s1600/20140101_193559.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF5O6461rhZ_Cc7o6YviNNzZh2Z-xHNV8idsIoFAsFp9xOB2vttRXOcSrMZYYdo9yzoserXzoaklgwU9M0EPqrbYAY-THuZp9KP_Skvmm02mF4XAGmy7dnS5ex8fNzDZwwtDZQH6q4/s320/20140101_193559.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb4hu9Aal8B6y_0GX4RQiCXuJ9Gex-nndGDiHakaLW2sxd2ipPAn3a0rj9yR8mONA501jC8tqj_xvOimHiC7UWT_8cJKSqyhIxlMLvhyCtfdkfzcPNb6gVLaZAf6lEQ-d_s-aMSbzk/s1600/20140101_193610.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb4hu9Aal8B6y_0GX4RQiCXuJ9Gex-nndGDiHakaLW2sxd2ipPAn3a0rj9yR8mONA501jC8tqj_xvOimHiC7UWT_8cJKSqyhIxlMLvhyCtfdkfzcPNb6gVLaZAf6lEQ-d_s-aMSbzk/s320/20140101_193610.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Обжимаем еще один провод. Мультиметром проверяем работу схемы и правильность соединений. Проверяем 12 вольт на шине. 18 вольт у меня пока нет. Чтобы было удобнее пользоваться мультиметром - подключаем по розетке на оба конца:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY6ex9VpjlsdObNrTz8aliQ1CX-i6g-gw3W_HX3satNzLm4Rf3ZMKZoLLfconAniD7vjWxYCQYo8L9O5JMo6INA8wNKzNwdYqZ4tExWpX8uFyK5_w1tpkEsqrtuosj1RdtvFG8BQ0h/s1600/20140101_200157.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY6ex9VpjlsdObNrTz8aliQ1CX-i6g-gw3W_HX3satNzLm4Rf3ZMKZoLLfconAniD7vjWxYCQYo8L9O5JMo6INA8wNKzNwdYqZ4tExWpX8uFyK5_w1tpkEsqrtuosj1RdtvFG8BQ0h/s320/20140101_200157.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Пробуем вставлять наш термометр, пока без DS18B20. Проверим напряжение 5 вольт.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7LC0hDwnPddwB_3KI_qfnHzpd327gDVu9fJ0Z6Q1Pn-Zz-Wuwo3vIxA2N8fyT2n2uRBTTVdVplp7OLV-X-X9f63gCx2amFwFb4bP4H3_WYGxgtG2HEw4khfmv98tclIqDpRfJrOXH/s1600/20140101_210530.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7LC0hDwnPddwB_3KI_qfnHzpd327gDVu9fJ0Z6Q1Pn-Zz-Wuwo3vIxA2N8fyT2n2uRBTTVdVplp7OLV-X-X9f63gCx2amFwFb4bP4H3_WYGxgtG2HEw4khfmv98tclIqDpRfJrOXH/s320/20140101_210530.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Последний шаг - впаиваем DS18B20 в плату под термометр. Распиновка:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCccAcs0xOUnUD1IoOsmXYErDs31qa1ix0HFLZakQULOQYJssxz_zIo9VrI8GJ2jNRWYB0PwO37ER1U1HM8Gov4Clajt9Ax8GQZshc-3icdviJ3qX0paOdRWjrhplqdZrc6_0ydaM/s1600/18b20_p.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCccAcs0xOUnUD1IoOsmXYErDs31qa1ix0HFLZakQULOQYJssxz_zIo9VrI8GJ2jNRWYB0PwO37ER1U1HM8Gov4Clajt9Ax8GQZshc-3icdviJ3qX0paOdRWjrhplqdZrc6_0ydaM/s320/18b20_p.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Ihncx1vgooQ84pjg7Jmt7vqKpmHpk0EC_lYOnN_j2XifrQPLZajGqcxv497j7rQf7DQhnH8NUgiQbRFlLhEc6yFa_jZ_dDWnKHp44yzSUL9XPvBicdkRBSf56fgn1AZmAyODpDUX/s1600/20140101_215520.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Ihncx1vgooQ84pjg7Jmt7vqKpmHpk0EC_lYOnN_j2XifrQPLZajGqcxv497j7rQf7DQhnH8NUgiQbRFlLhEc6yFa_jZ_dDWnKHp44yzSUL9XPvBicdkRBSf56fgn1AZmAyODpDUX/s320/20140101_215520.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
У меня заработало не сразу. :) Вышла небольшая заминка по проводам. Поэтому прежде чем обжимать коннектор в DS9490R выщипайте лишние контакты в коннекторе, оставьте два посередине и только после этого обжимайте. 
&lt;br /&gt;В итоге, у нас есть первое устройство в &quot;нормальной&quot; сети 1 wire, которую можно расширять не боясь. Еще я понял, что лучше все-таки травить плату, это наверное быстрее (если конечно есть работающий макет), чем использовать такие вот прототипные платы (хотя может их надо как-то по другому использовать, я честно говоря не знаю. :) ) и качественее.
&lt;br /&gt;
&lt;br /&gt;
Кусочек информации с моего термометра:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
power YES (1)
r_address 710000041E821A28
r_id 0000041E821A
r_locator FFFFFFFFFFFFFFFF
temperature  26.3125
temperature10  26.25
temperature11  26.375
temperature12  26.3125
temperature9  26.5&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Система в сборе
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8A41wQlbIyxnFCoLN4d6HMZqFSwG2HvtW6K17M5xPK47erIOFDbEICbM_2LrglmqfwAuQDJLWveck6fOKQd31GIjwJzZ_t1ven3T-0KxcZVyBfi64mI_SSGvVgUYVkyY178YFHNWb/s1600/20140102_220920.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8A41wQlbIyxnFCoLN4d6HMZqFSwG2HvtW6K17M5xPK47erIOFDbEICbM_2LrglmqfwAuQDJLWveck6fOKQd31GIjwJzZ_t1ven3T-0KxcZVyBfi64mI_SSGvVgUYVkyY178YFHNWb/s320/20140102_220920.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ps. Кстати, неплохо бы &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3-nand.html&quot;&gt;в наш дебиан&lt;/a&gt; еще поставить системные логи:&lt;br /&gt;
#apt-get install rsyslog</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/1998524758470177364/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2014/01/1-wire.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/1998524758470177364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/1998524758470177364'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2014/01/1-wire.html' title='Создание термометра в сети 1-wire'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvg_SV8UM-6yt8cmn6lEzI0CJFTwM-piasoiBKNojcvR5Op_stjT0LvQgrZsQ81HUir1rGWH-2CsBA_riiyskBd_L2alTc31SQAc81jqyBfCj3yse6Z9SABgO7L63NpMo1FVMGjZo9/s72-c/sh_ture.jpg" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-4191038685203259627</id><published>2013-12-24T18:44:00.001+04:00</published><updated>2014-02-05T09:00:32.020+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1-wire"/><category scheme="http://www.blogger.com/atom/ns#" term="cubietruck"/><category scheme="http://www.blogger.com/atom/ns#" term="owfs"/><category scheme="http://www.blogger.com/atom/ns#" term="умный дом"/><title type='text'>Подключение контроллера сети 1-wire (DS9490R) к Cubietruck. Первое устройство в сети 1-wire (ds2401).</title><content type='html'>Ну что, теперь можно раскрыть секрет - не просто так же покупался cubietruck. А покупался он для создания сети умного дома 1-wire. Что это такое рассказывать не буду, в интернете полно информации. Просто буду записывать некоторые не очевидные для меня, как чайника вещи. Итак, для начала подключим контроллер DS9490R к нашему cubietruck.
&lt;br /&gt;
Вставляем контроллер в cubietruck.
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI2uaMj2QHVoMtdPXZbcfsitXCuH6qAzDLRGsrlHh5b7E-bOSG9EAkDffTV_lHBYchTUSqi9LfXcd1aZdWNpGU52C2YXt1kpUUOHtI8PjwvkyvU5-2vRDU3VqqkblU_FZxBG2Iqzkp/s1600/20131224_094116.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI2uaMj2QHVoMtdPXZbcfsitXCuH6qAzDLRGsrlHh5b7E-bOSG9EAkDffTV_lHBYchTUSqi9LfXcd1aZdWNpGU52C2YXt1kpUUOHtI8PjwvkyvU5-2vRDU3VqqkblU_FZxBG2Iqzkp/s320/20131224_094116.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# dmesg
[  512.230242] The port change to OHCI now!
[  512.532997] usb 5-1: new full-speed USB device number 2 using sw-ohci
# apt-get install owfs
# lsusb
Bus 005 Device 003: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
# mkdir /mnt/1wire
# owfs -C -uall -m /mnt/1wire --allow_other
# ls -lah /mnt/1wire
total 4.0K
drwxr-xr-x 1 root root    8 Dec 24 06:15 .
drwxr-xr-x 4 root root 4.0K Dec 24 06:14 ..
drwxrwxrwx 1 root root    8 Dec 24 06:16 05.4AEC29CDBAAB
drwxrwxrwx 1 root root    8 Dec 24 06:16 10.67C6697351FF
drwxrwxrwx 1 root root    8 Dec 24 06:16 81.EE6F32000000
drwxr-xr-x 1 root root    8 Dec 24 06:15 alarm
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.0
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.1
drwxr-xr-x 1 root root    8 Dec 24 06:15 settings
drwxrwxrwx 1 root root    8 Dec 24 06:16 simultaneous
drwxr-xr-x 1 root root    8 Dec 24 06:15 statistics
drwxr-xr-x 1 root root   32 Dec 24 06:15 structure
drwxr-xr-x 1 root root    8 Dec 24 06:15 system
drwxr-xr-x 1 root root    8 Dec 24 06:15 uncached
&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;http://ab-log.ru/forum/viewtopic.php?p=6254#p6254&quot;&gt;Информация&lt;/a&gt;:
&lt;blockquote&gt;owfs - это программа, которая отображает сеть в виде файловой системы. То, что owfs совпадает с названием всего пакета - чистая случайность.&lt;br /&gt;
owhttpd - это программа, которая делает доступной сеть по HTTP протоколу (по-народному, через браузер)&lt;br /&gt;
И та и другая программы могу работать с мастером сети самостоятельно, но не вместе!&lt;br /&gt;
Чтобы owfs и owhttpd работали одновременно, нужно запустить owserver.&lt;br /&gt;
owserver -u -p 3000&lt;br /&gt;
Запускает сервер работы с сетью, -u значит физическое устройство USB типа DS9490R, и отвечает на запросы по 3000 порту.&lt;br /&gt;
owhttpd -s 3000 -p 3001&lt;br /&gt;
-s 3000 - порт, на котором запущено owserver&lt;br /&gt;
-p 3001 - порт, на котором owhttpd сам отвечает по протоколу HTTP&lt;br /&gt;
owfs -s 3000 /mnt/1wire/&lt;br /&gt;
-s 3000 понятно, дальше идет mount point, который является обязательным параметром&lt;/blockquote&gt;
&lt;br /&gt;
Пробуем зайти http://192.168.xx.xx:2121/
&lt;br /&gt;
&lt;br /&gt;
Добавим в /etc/modprobe.d/fbdev-blacklist.conf (чтобы не использовать модули ядра линукс, а брать из пакета owfs)
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;blacklist ds9490r
blacklist ds2490
blacklist wire
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Редактируем файл /etc/owfs.conf
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# Sample configuration file for the OWFS suite for Debian GNU/Linux.
# This is the main OWFS configuration file. You should read the
# owfs.conf(5) manual page in order to understand the options listed
# here.
######################## SOURCES ########################
# With this setup, any client (but owserver) uses owserver on the
# local machine...
! server: server = localhost:4304
# ...and owserver uses the real hardware, by default fake devices
# This part must be changed on real installation
#server: FAKE = DS18S20,DS2405
# USB device: DS9490
server: usb = all
# Serial port: DS9097
#server: device = /dev/ttyS1
# owserver tcp address
#server: server = 192.168.10.1:3131
# random simulated device
#server: FAKE = DS18S20,DS2405
######################### OWFS ##########################
mountpoint = /mnt/1wire
allow_other
####################### OWHTTPD #########################
http: port = 2121
####################### OWFTPD ##########################
ftp: port = 2120
####################### OWSERVER ########################
server: port = localhost:4304
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Редактируем /etc/fuse.conf:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000  

# Allow non-root users to specify the &#39;allow_other&#39; or &#39;allow_root&#39;
# mount options.
#

user_allow_other
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
После этого монтировать можно командой # owfs.
Хотя в прицнипе монтирование нам особо и не нужно ибо есть tcp owserver, монтировать датчики в файловую систему удобно для тестов. Поэтому процесс автомонтирования при загрузке рассматривать не будем (примеры скрипта можно найти в сети) &lt;b&gt;update&lt;/b&gt;. &lt;a href=&quot;http://vermus.blogspot.ru/2014/02/owfs.html&quot;&gt;или здесь&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Создание сети 1-wire.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Небольшой ликбез по поводу сети 1-wire для новичков как я (после моего месячного изучения урывками). Если профи увидят ошибки, прошу комментировать. Итак, сеть 1-wire - сеть на одной шине, компоненты которой подключаются последовательно. Компонентами могут выступать как уже готовые микросхемы с датчиками и так и микросхемы управления вводом\выводом (то есть для подключения дополнительных цифровых или аналоговых датчиков). В сети 1-wire по умолчанию всего два контакта - data и земля. В data передаются данные (как видно по названию), а также т.н. паразитное питание. То есть можно использовать всего два провода. Вначале я не очень понимал это принцип, поэтому накупил штук 10 ds2401 которые как раз от него и работают - сегодня будем тестировать сеть на них. Так вот, строить сеть на паразитном питании (питание идет с контроллера DS9490R) можно, но не нужно. :) Для пары датчиков и короткой шине можно использовать паразитное питание, а вот если шина длиной более 30 метров и датчиков много - ожидается просадка по напряжению, поэтому &lt;a href=&quot;http://www.benuks.ru/oborud.html&quot;&gt;умные люди придумали&lt;/a&gt; (по ссылке много интересного про 1wire) и используют отдельное питание 5V, но не простое, а канал с повышенным напряжением. По ссылке прекрасно &lt;a href=&quot;http://www.benuks.ru/power.html&quot;&gt;все описано&lt;/a&gt;. Я лишь дополню зачем это надо - 12 V в каждом модуле преобразуется стабилизатором в 5V, а 18V в 12V. Это сделано для того, чтобы даже при просадке напряжения в шине на компоненты гарантировано поступало 5V и на некоторые датчики 12V. Далее, сразу используем витую пару 5ой категории, чтобы не переделывать потом. Для коммутации также используем телефонные (rj11\12) коннекторы и внешние телефонные розетки.
&lt;br /&gt;
Ну вот в принципе и все. 
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;Делаем первое устройство сети 1-wire.&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас мы будем делать устройство с паразитным питанием, потому что пока у меня нет нужной микросхемы 1-wire с внешним питанием. Тырим одну картинку по ссылке выше:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoA9WFvQkAgzhcOPk6nl88-3V4qIHIUZCG43b-f4ngLG1xV_IEQ5-9l7AVv8hY_tHTsm1aF3-aUmkNLLecSOifeznkT6Ve7fdS6Y6C3XSFbgqVj9Y3yvL4GsK7E_yzar6zY7sV94vH/s1600/9490.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoA9WFvQkAgzhcOPk6nl88-3V4qIHIUZCG43b-f4ngLG1xV_IEQ5-9l7AVv8hY_tHTsm1aF3-aUmkNLLecSOifeznkT6Ve7fdS6Y6C3XSFbgqVj9Y3yvL4GsK7E_yzar6zY7sV94vH/s320/9490.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак, используем так: &lt;br /&gt;
светло-зеленый:data (3ий пин в контроллере)&lt;br /&gt;
зеленый:земля(GRND) (4ый пин в контроллере)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обжимаем два провода, остальные пока не нужны. Обжато не очень, в следующий раз наверное по другому обожму. Но для теста пойдет.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLHcDQ34d1xOEoHHdGrQuDCuIA11ekkoZkvS6UzbP4yv6gICQcVKyxAnE9ArS6aaFd7xdTNChL4_6PjxsKfgitvvk2kEPnuorg05VvyqZP6tcTV4FxuaSghBibNudrxes9zqUbb0U7/s1600/20131224_170758.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLHcDQ34d1xOEoHHdGrQuDCuIA11ekkoZkvS6UzbP4yv6gICQcVKyxAnE9ArS6aaFd7xdTNChL4_6PjxsKfgitvvk2kEPnuorg05VvyqZP6tcTV4FxuaSghBibNudrxes9zqUbb0U7/s320/20131224_170758.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Подключать мы будем устройство, которое выдает уникальный id (например, если устройство с определенным id доступно - дверь закрыта, а если не доступно - значит дверь открыта) - &lt;a href=&quot;http://www.elin.ru/files/pdf/1-Wire/1W-chips4.pdf&quot;&gt;ds2401&lt;/a&gt;.
Нагло тырим еще одну картинку с &lt;a href=&quot;http://www.ab-log.ru/forum/viewtopic.php?f=1&amp;amp;t=586&amp;amp;sid=870b7d0142d963bbb38b7b07132c466f#p9780&quot;&gt;форума&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6xrQ_b8-o1Eux8I4TX9SipM5MxyKVNvLWoYx6NbOi6hS_mtTEI0zzgJlMz9t2Ms8bRbFNwG570121eWN9UJykg6G7SCq5ibszeMbK-moD4i7ocICSuUmpOrCkJX1F5Plt-appNmHx/s1600/ds2401.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6xrQ_b8-o1Eux8I4TX9SipM5MxyKVNvLWoYx6NbOi6hS_mtTEI0zzgJlMz9t2Ms8bRbFNwG570121eWN9UJykg6G7SCq5ibszeMbK-moD4i7ocICSuUmpOrCkJX1F5Plt-appNmHx/s320/ds2401.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Второй конец я впаял в макет плату. Распиновку ds2401 смотрим &lt;a href=&quot;http://pdfserv.maximintegrated.com/en/ds/DS2401.pdf&quot;&gt;здесь&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdc1grxdDsLuzjMlOOLZumCngsFxsq6zu8fEQ0zgObXdfSjL_IUfpvzFnfhmxdKUaRIukDuganMz-7NyLl9PTdKMPlxPWScIDqiR2FzE8ivQ-Vwd9MFpSwhkOe1F97Mp9B4fmdwDJ/s1600/20131224_183026.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdc1grxdDsLuzjMlOOLZumCngsFxsq6zu8fEQ0zgObXdfSjL_IUfpvzFnfhmxdKUaRIukDuganMz-7NyLl9PTdKMPlxPWScIDqiR2FzE8ivQ-Vwd9MFpSwhkOe1F97Mp9B4fmdwDJ/s320/20131224_183026.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Подключаем (геркон замкнут - вот эти две коричневые цилиндрические штуки и есть магнит с герконом):
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;/mnt/1wire# ls -l
total 0
drwxrwxrwx 1 root root  8 Dec 24 14:47 01.E890ED150000
drwxrwxrwx 1 root root  8 Dec 24 14:47 81.EE6F32000000
drwxr-xr-x 1 root root  8 Dec 24 10:12 bus.0
drwxr-xr-x 1 root root  8 Dec 24 10:12 settings
drwxr-xr-x 1 root root  8 Dec 24 10:12 statistics
drwxr-xr-x 1 root root 32 Dec 24 10:12 structure
drwxr-xr-x 1 root root  8 Dec 24 10:12 system
drwxr-xr-x 1 root root  8 Dec 24 10:12 uncached

/mnt/1wire/01.E890ED150000# cat type
DS2401

/mnt/1wire/01.E890ED150000# cat r_address
A9000015ED90E801

/mnt/1wire/01.E890ED150000# cat id
E890ED150000

&lt;/pre&gt;
Вот у нас и новый элемент сети 1-wire. r_address это и есть уникальный id ds2401, который по идее гарантирует уникальность микросхемы. Я брал в китайском интернет магазине, где-то слышал что они штампуют все под одну гребенку (надо будет поставить вторую ds2401  и проверить). Пробуем убрать магнит от геркона. Смотрим - элемент отсутствует. Вот вам и элементарная проверка на открытую дверь. Я пока не выбрал (может кто посоветует) систему, которая все эти данные собирает в базу, имеет веб-интерфейс и разные плюшки (например работа с tcp сервером 1-wire, jabber), пока в поиске. Но смысл понятен.&lt;br /&gt;
Обратите внимание, что появление датчика в сети 1wire может занять некоторое время (около 15 секунд, а может и больше). 
&lt;br /&gt;
ps. Почти все элементы покупались онлайн, могу поделиться ссылками.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/4191038685203259627/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4191038685203259627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/4191038685203259627'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2013/12/1-wire-ds9490r-cubietruck-1-wire-ds2401.html' title='Подключение контроллера сети 1-wire (DS9490R) к Cubietruck. Первое устройство в сети 1-wire (ds2401).'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI2uaMj2QHVoMtdPXZbcfsitXCuH6qAzDLRGsrlHh5b7E-bOSG9EAkDffTV_lHBYchTUSqi9LfXcd1aZdWNpGU52C2YXt1kpUUOHtI8PjwvkyvU5-2vRDU3VqqkblU_FZxBG2Iqzkp/s72-c/20131224_094116.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-8412488292905855332</id><published>2013-12-22T22:50:00.000+04:00</published><updated>2014-02-08T01:34:06.785+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ARM"/><category scheme="http://www.blogger.com/atom/ns#" term="cubieboard"/><category scheme="http://www.blogger.com/atom/ns#" term="cubietruck"/><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>Настройка Debian на Cubietruck (cubieboard 3)</title><content type='html'>В &lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3-nand.html&quot;&gt;прошлом посте&lt;/a&gt; мы установили debian на nand память cubietruck. Итак, сеть не работает. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Проводная сеть.&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;modprobe sunxi_gmac
&lt;/pre&gt;
&lt;br /&gt;
Это команда подгрузки модуля сетевого интерфейса в cubietruck. Она вызовет у нас ошибку вроде &quot;could not open moddep file modules.dep.bin&quot;. А все потому что такого файла у нас нет и вообще каталога /lib/modules у нас нет. Решается просто - копируйте с SD карты с debian каталог /lib/modules, только проследите за тем, что у ядра у вас совпадают.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;root@debtruck:~# mount /dev/mmcblk0p2  /mnt/mmc
root@debtruck:~# modprobe sunxi_gmac
root@debtruck:~# uname -a
Linux debtruck 3.4.61+ #1 SMP PREEMPT Sat Oct 26 13:08:57 CST 2013 armv7l GNU/Linux
&lt;/pre&gt;
&lt;br /&gt;
После этого сетевой модуль подгрузится и будет работать.
&lt;br /&gt;
&lt;br /&gt;
Теперь есть интернет можно поставить еще один пакетик:
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;apt-get install bash-completion
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Включение wifi&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;modprobe bcmdhd
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
А проще скопировать файл /mnt/mmc/etc/modules.conf c SD карты в NAND и перезаписать его.  Тогда все необходимые модули будут грузиться автоматически. Еще можно скопировать каталог /lib/firmware.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Расширение дискового пространства&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Так как изначально образ lubuntu сервера был где-то около 2 Гигабайт, а в NAND вроде нам обещали 8 Гигабайт, то имеет смысл расширить основной раздел.

Перезагружаемся на SD карту (В принципе можно и работать прямо с nand, но мне не хотелось захламлять систему пока всякими git и make). Я испытываю проблемы с загрузкой с SD карты, похоже какой-то баг нерешенный. Но вроде приноровился вставлять карту при перезагрузке (см. предыдущий пост). Далее:

&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
# apt-get install git
# git clone git://github.com/linux-sunxi/sunxi-tools
# cd sunxi-tools
# apt-get install libusb-1.0-0-dev make pkg-config
# make
&lt;/pre&gt;
&lt;strike&gt;# make install&lt;/strike&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее, запускаем скомпилированную программу nand-part и читаем, что &lt;a href=&quot;http://www.cubieforums.com/index.php/topic,1134.msg6783.html#msg6783&quot;&gt;пишут&lt;/a&gt;:&lt;br /&gt;
&quot;Как видим мы хотим объединить 2 и 3 раздел в один, поэтому новая часть 2 радела is 4194304 + 10584064 = 14778368. &quot;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
# ./nand-part -f a20 /dev/nand 32768 &#39;boot 131072&#39; &#39;rootfs 14778368&#39;
&lt;/pre&gt;
&lt;br /&gt;
Перезагружаемся без SD карты.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
# resize2fs /dev/nandb
# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.0G  866M  5.9G  13% /
&lt;/pre&gt;
Отлично, у нас 7 гигабайт!
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Память&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
С памятью вроде проблем нет (dmesg):
&lt;br /&gt;
&lt;br /&gt;
Memory: 448MB 1536MB = 1984MB total
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Светодиодная индикация&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
1 голубой включено&lt;br /&gt;
2 оранжевый cpu0 (загрузка)&lt;br /&gt;
3 белый cpu1 (загрузка)&lt;br /&gt;
4 зеленый mmc0 (обращение)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
init.d &lt;a href=&quot;http://noobish.in/2014/02/switch-status-leds-cubietruck-startup/&quot;&gt;Скрипт отключения/включения&lt;/a&gt; светодиодов в cubietruck:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
#!/bin/bash
case &quot;$1&quot; in
    start)
        echo 0 &gt; /sys/class/leds/orange:ph20:led2/brightness
        echo &quot;Switching off Orange LED&quot;
        echo 0 &gt; /sys/class/leds/blue:ph21:led1/brightness
        echo &quot;Switching off Blue LED&quot; 
        echo 0 &gt; /sys/class/leds/white:ph11:led3/brightness
        echo &quot;Switching off White LED&quot; 
        echo 0 &gt; /sys/class/leds/green:ph07:led4/brightness
        echo &quot;Switching off Green LED&quot; 
    ;;
    stop)
        echo 1 &gt; /sys/class/leds/orange:ph20:led2/brightness
        echo &quot;Switching on Orange LED&quot;
        echo 1 &gt; /sys/class/leds/blue:ph21:led1/brightness
        echo &quot;Switching on Blue LED&quot; 
        echo 1 &gt; /sys/class/leds/white:ph11:led3/brightness
        echo &quot;Switching on White LED&quot; 
        echo 1 &gt; /sys/class/leds/green:ph07:led4/brightness
        echo &quot;Switching on Green LED&quot; 
     ;;
    *)
        echo &quot;Usage: /etc/init.d/leds {start|stop}&quot;
        exit 1
    ;;
esac
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Правда после включения они не мигаю и горят просто. После перезагрузки будут мигать снова, и не буду мигать, если прописать автозагрузку скрипта.
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/8412488292905855332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2013/12/debian-cubietruck-cubieboard-3.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8412488292905855332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/8412488292905855332'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2013/12/debian-cubietruck-cubieboard-3.html' title='Настройка Debian на Cubietruck (cubieboard 3)'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-153626972449017670</id><published>2013-12-19T17:20:00.000+04:00</published><updated>2013-12-25T20:44:13.207+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ARM"/><category scheme="http://www.blogger.com/atom/ns#" term="cubieboard"/><category scheme="http://www.blogger.com/atom/ns#" term="cubietruck"/><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>Установка Debian на Cubietruck (cubieboard 3) на внутреннюю память (NAND)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9rWTCFg6KHre3f8tJXM52ZRSalIfGBB8cTmTXMOvYnMr4QFCUfxcq2EGDeTmYXypM54jqMvuLsDEm4YlWQawJz38klsmA-A92g4LVqZC-VPXKmlKOvv00-yKjYTl6RT2cVlMAWTzI/s1600/20131212_090442.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9rWTCFg6KHre3f8tJXM52ZRSalIfGBB8cTmTXMOvYnMr4QFCUfxcq2EGDeTmYXypM54jqMvuLsDEm4YlWQawJz38klsmA-A92g4LVqZC-VPXKmlKOvv00-yKjYTl6RT2cVlMAWTzI/s320/20131212_090442.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Пришел мне&amp;nbsp;&lt;a href=&quot;http://store.r0ck.me/collections/home-slide/products/cubietruck-2gb-ram-8gb-flash-with-wifi-bt&quot;&gt;cubietruck&lt;/a&gt;. На нем для тестов предустановлен android 4. Мне графика ни к чему, да и сервер на андроиде бестолковая затея. Выяснив, что на данный момент &amp;nbsp;Cubian толком &lt;a href=&quot;https://github.com/cubieplayer/Cubian/issues/179&quot;&gt;не поддерживает&lt;/a&gt;&amp;nbsp;Cubietruck пришлось &lt;strike&gt;выбирать из рекомендованного программного обеспечения. В итоге выбор пал на&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://docs.cubieboard.org/tutorials/a20-cubietruck_lubuntu_server_releases&quot;&gt;Lubuntu Server&lt;/a&gt;&amp;nbsp;(&lt;a href=&quot;http://www.lubuntu.net/&quot;&gt;официальный сайт&lt;/a&gt;).&lt;/strike&gt;&lt;br /&gt;
&lt;br /&gt;
В процессе поиска, я &lt;a href=&quot;http://www.cubieforums.com/index.php/topic,1087.0.html&quot;&gt;наткнулся на порт&lt;/a&gt; debian для cubietruck для SD Card. Но он нам пригодится не для установки, а для работы с NAND. Можно взять&amp;nbsp;&lt;a href=&quot;http://www.cubieforums.com/index.php/topic,1200.msg7459.html&quot;&gt;Cubiuntu&lt;/a&gt;&amp;nbsp;(пароль по умолчанию linaro\linaro).&lt;br /&gt;
&lt;br /&gt;
1. Скачиваем образ по ссылкам.&lt;br /&gt;
2. Скачиваем&amp;nbsp;&lt;a href=&quot;http://sourceforge.net/projects/win32diskimager/&quot;&gt;Win32 Disk Imager&lt;/a&gt;&amp;nbsp; (делал под виной)&lt;br /&gt;
3. Вставляем sd карту или флешку, и пишем на нее образ. После старта, ищет загрузчик сначала на MicroSD карте, если не находит его, тогда на внутреннем накопителе, и в конце на USB флешке.&lt;br /&gt;
&lt;br /&gt;
Пару команд на заметку:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot; style=&quot;background-color: #d6ded4; color: #333333; line-height: 18px; padding: 0px;&quot;&gt;&lt;span style=&quot;color: black; line-height: normal; white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;locale-gen ru_RU.UTF8&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;/span&gt;dpkg-reconfigure locales&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Устанавливаем &lt;a href=&quot;http://docs.cubieboard.org/tutorials/ct1/installation/cb3_lubuntu-12.10-desktop_nand_installation_v1.00&quot;&gt;lubuntu&lt;/a&gt; в nand&amp;nbsp;&amp;nbsp;с помощью&amp;nbsp;&lt;a href=&quot;http://docs.cubieboard.org/tutorials/common/livesuit_installation_guide&quot;&gt;LiveSuitPack &lt;/a&gt;(или PhoenixSuit1.0.6.rar for Windows). Нажимаем кнопку FEL вставляем miniUSB в компьютер. Отпускаем FEL после включения. Для чего это надо? С этим образом загрузочные разделы, в которых я честно говоря пока не особо шарю, поэтому проще будет сделать так.&lt;br /&gt;
&lt;br /&gt;
Далее, узнаем ip адрес устройства, заходим по ssh или подключаем клавиатуру.&lt;br /&gt;
&lt;br /&gt;
Дальше у меня возникла&amp;nbsp;&lt;a href=&quot;http://www.cubieforums.com/index.php/topic,1087.msg7343.html#msg7343&quot;&gt;проблема&lt;/a&gt;&amp;nbsp;с этим портом для sd-карты. &amp;nbsp;Многие кубитраки идут с багой - невозможно загрузить &amp;nbsp;систему с SD карты. Испробовав разные комбинации обнаружил что если нажать ресет, а потом сразу вставить карту - система грузится! Потом нашел и другое &lt;a href=&quot;http://www.cubieforums.com/index.php/topic,1139.0.html&quot;&gt;решение &lt;/a&gt;- загрузить андроид с nand, и перезагрузится из него.&lt;br /&gt;
&lt;br /&gt;
Попробуем скопировать другой&amp;nbsp;&lt;a href=&quot;http://dl.cubieboard.org/software/a20-cubietruck/lubuntu/ct-lubuntu-card0-v1.00/u-boot-sunxi-with-spl-ct-20131102.bin&quot;&gt;загрузчик&lt;/a&gt;&amp;nbsp;(собранный для lubuntu) в карту (не в раздел,а &amp;nbsp;прямо в устройство).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot; style=&quot;background-color: #d6ded4; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 12px; line-height: 18px;&quot;&gt;dd if=u-boot-sunxi-with-spl-ct-20131102.bin of=$card bs=1024 seek=8&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;strike&gt;В итоге в данном виде загрузка с SD карты у меня происходит без проблем.&lt;/strike&gt;&lt;br /&gt;
Черт, вчера работало, сегодня нет, необъяснимо. :)
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Форматируем после перезагрузки основной раздел, где лежит ОС (опять же загружаемся с sd карты пока).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot; style=&quot;background-color: #d6ded4; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 12px; line-height: 18px;&quot;&gt;mkfs.ext4 /dev/nandb&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;brush:plain&quot; style=&quot;background-color: #d6ded4; padding: 0px;&quot;&gt;&lt;/pre&gt;
&lt;br /&gt;
Раздел /dev/nanda трогать, как &lt;a href=&quot;http://sigpipe.me/?p=10&quot;&gt;тут&lt;/a&gt; смысла я думаю нет. Плюс в /dev/nand уже тоже есть загрузочный сектор, который уже подготовлен.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Установка&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
rootfs, устанавливаем стабильный debian.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;apt-get update
apt-get install debootstrap
mount /dev/nandb /mnt/rootfs
debootstrap --verbose --arch armhf --variant=minbase --foreign stable /mnt/rootfs http://ftp.debian.org/debian
chroot /mnt/rootfs
/debootstrap/debootstrap --second-stage


cat &amp;lt;&amp;lt;END &amp;gt; /etc/apt/sources.list
deb http://ftp.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.debian.org/debian/ stable main contrib non-free
deb http://ftp.debian.org/debian/ stable-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ stable-updates main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free
END

apt-get update
export LANG=C
apt-get install apt-utils dialog locales
dpkg-reconfigure locales
# Выбираем en_US.UTF-8 или что сами хотите.
export LANG=en_US.UTF-8
apt-get install dhcp3-client udev netbase ifupdown iproute openssh-server iputils-ping wget net-tools ntpdate ntp vim nano less tzdata console-tools module-init-tools mc

cat &amp;lt;&amp;lt;END &amp;gt; /etc/network/interfaces
auto lo eth0
allow-hotplug eth0
iface lo inet loopback
iface eth0 inet dhcp
END

echo cubietruck &amp;gt; /etc/hostname
 
cat &amp;lt;&amp;lt;END &amp;gt; /etc/fstab
# /etc/fstab: static file system information.
#
#                
proc /proc proc defaults 0 0
/dev/nandb / ext4 noatime,errors=remount-ro 0 1
END

passwd
/etc/init.d/ntp stop

exit
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Выключаем. Вытаскиваем SD карту. Включаем. &amp;nbsp;&lt;strike&gt;Должно работать, но сети у меня пока нет. &amp;nbsp;:) Исправлю - напишу.&lt;/strike&gt;&lt;/div&gt; Продолжение &quot;&lt;a href=&quot;http://vermus.blogspot.ru/2013/12/debian-cubietruck-cubieboard-3.html&quot;&gt;настройка debian на cubietruck&lt;/a&gt;&quot;.
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Еще пару экспериментов для памяти (которые мне не помогли):&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot; style=&quot;background-color: #d6ded4; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #333333; line-height: 18px;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;под дескопной Виндой или Линуксом (од нашу АРМ систему не пойдет):&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;wget http://dl.cubieboard.org/software/a20-cubieboard/lubuntu/cb-a20-lubuntu-server-13.06-v1.00.img.gz
wget &quot;http://forum.xda-developers.com/attachment.php?attachmentid=1740401&amp;amp;d=1361198061&quot; -O &quot;imgRePacker_204.zip&quot;
gunzip cb-a20-lubuntu-server-13.06-v1.00.img.gz
unzip imgRePacker_204.zip
chmod 777 imgrepacker
./imgrepacker cb-a20-lubuntu-server-13.06-v1.00.img.gz

Заливаем через scp bootloader.fex

dd if=/usr/src/bootloader.fex of=/dev/nanda
&lt;/pre&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;это извлечение из nand образа загрузчика (какого-то уровня). imgrepacker &lt;a href=&quot;http://forum.xda-developers.com/showthread.php?t=1753473&quot;&gt;отсюда&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/153626972449017670/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2013/12/debian-cubietruck-cubieboard-3-nand.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/153626972449017670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/153626972449017670'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2013/12/debian-cubietruck-cubieboard-3-nand.html' title='Установка Debian на Cubietruck (cubieboard 3) на внутреннюю память (NAND)'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9rWTCFg6KHre3f8tJXM52ZRSalIfGBB8cTmTXMOvYnMr4QFCUfxcq2EGDeTmYXypM54jqMvuLsDEm4YlWQawJz38klsmA-A92g4LVqZC-VPXKmlKOvv00-yKjYTl6RT2cVlMAWTzI/s72-c/20131212_090442.jpg" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-6707928342314413793</id><published>2011-12-18T19:27:00.000+04:00</published><updated>2011-12-18T19:56:45.234+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LockHunter"/><category scheme="http://www.blogger.com/atom/ns#" term="Process Explorer"/><category scheme="http://www.blogger.com/atom/ns#" term="unlock"/><category scheme="http://www.blogger.com/atom/ns#" term="who lock me"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><category scheme="http://www.blogger.com/atom/ns#" term="файловая система"/><title type='text'>Аналог who lock me в windows 7</title><content type='html'>Была такая утилита, &lt;a href=&quot;http://www.dr-hoiby.com/WhoLockMe/&quot;&gt;who lock me&lt;/a&gt;, которая замечательно работала в windows xp. Утилита позволяет узнать какой процесс блокирует файл или папку в windows.
К сожалению, в windows seven она уже не работает.&lt;br /&gt;
&lt;br /&gt;
Поэтому есть альтернатива:&amp;nbsp;&lt;a href=&quot;http://www.emptyloop.com/unlocker/&quot;&gt;Unlocker&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Также на сайте указана табличка с альтернативами, может вам хватит &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx&quot;&gt;Process Explorer&lt;/a&gt; от Sysinternals или &lt;a href=&quot;http://lockhunter.com/&quot;&gt;LockHunter&lt;/a&gt; от Crystal Rich.</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/6707928342314413793/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2011/12/who-lock-me-windows-7.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6707928342314413793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/6707928342314413793'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2011/12/who-lock-me-windows-7.html' title='Аналог who lock me в windows 7'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-3813547086633209457</id><published>2010-11-06T11:00:00.003+03:00</published><updated>2010-11-06T11:04:53.456+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="django-piston"/><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="gwt"/><category scheme="http://www.blogger.com/atom/ns#" term="GWT Designer"/><category scheme="http://www.blogger.com/atom/ns#" term="Restlet Framework"/><title type='text'>musicmans.ru | Как сделать сайт на Django | GWT</title><content type='html'>Посмотрел я на дерево &lt;a rel=&quot;nofollow&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH9FQV0UFslwL1KuenfLCZ6EaxEr-UibEX0A3SrsoBnhnM8RiJcD-zzvoQ113uXd8Tnl_EcrWMYH7tpiOqU0zbISBAJOr7OHvwn9rFrW8W9CrQ7h9DeIMUC27p2DdNx7iujMN6sSq3/s400/musicmans.ru+gernres+directions+styles.png&quot;&gt;жанров&lt;/a&gt; и оно мне не понравилось. Страшное, неудобное. И решил сразу заняться клиентской стороной. Тем более у нас есть отличнейший &lt;a rel=&quot;nofollow&quot; href=&quot;http://googlewebtoolkit.blogspot.com/2010/09/google-relaunches-instantiations.html&quot;&gt;повод&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Итак, настроим gwt. Скачиваем &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/heliosr&quot;&gt;eclipse 3.6&lt;/a&gt; для java. &lt;br /&gt;Далле переходим на страницы с &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/intl/ru-RU/webtoolkit/download.html&quot;&gt;загрузками GWT&lt;/a&gt;. Ставим &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/intl/ru-RU/eclipse/docs/download.html&quot;&gt;gwt плагин&lt;/a&gt; для eclipse.&lt;br /&gt;&lt;br /&gt;Создаем проект File &gt; New &gt; Web Application Project.&lt;br /&gt;&lt;br /&gt;Название: genre&lt;br /&gt;package: ru.musicmans&lt;br /&gt;&lt;br /&gt;Запуск - Debug As &gt; Web Application.&lt;br /&gt;&lt;br /&gt;Переходим по адресу, устанавливаем плагин. Все работает.&lt;br /&gt;&lt;br /&gt;Устанавливаем &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/intl/ru-RU/webtoolkit/tools/download-gwtdesigner.html&quot;&gt;GWT Designer&lt;/a&gt;. Читаем &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/intl/ru-RU/webtoolkit/tools/gwtdesigner/quick_start.html&quot;&gt;quick start&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Далее можно конвертировать, созданный проект из gwt plugin (gwt plugin мы поставили потому, что в нем все равно находиться сам gwt) в gwt java project, который идет с дизайнером (правой кнопкой на проекте - convert to) или создать новый:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWiGX6qVUZsoW42cHy5jfZ0R1L9ok_0VbEluIbewtz-onNZ4kZZvCH_Ta9r68l8vC41mOntgOhUf9j-jiCwpaH0DVmIBuKZXp27cF-_Ci4xF5OuoOOIUBBqvGc4elyBIWbx9o68EkW/s1600/gwt+java+project.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 380px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWiGX6qVUZsoW42cHy5jfZ0R1L9ok_0VbEluIbewtz-onNZ4kZZvCH_Ta9r68l8vC41mOntgOhUf9j-jiCwpaH0DVmIBuKZXp27cF-_Ci4xF5OuoOOIUBBqvGc4elyBIWbx9o68EkW/s400/gwt+java+project.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5519289297191650290&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сразу создадим модуль ru.musicmans.genre.GenreTree:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1suZ_yUbK9lZWHWNcDvL_-uFP_lOP_y8Spk94VNlvYi0vgJt7O4Bwg6ujJtZ3BRVy92mMucX_94qMCxF1QlqjLD6GdPqwOoNy6NZ6EUhhwzhKecawYp5h4BgxNiCHETUk8AzQUA1J/s1600/new+module.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 266px; height: 47px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1suZ_yUbK9lZWHWNcDvL_-uFP_lOP_y8Spk94VNlvYi0vgJt7O4Bwg6ujJtZ3BRVy92mMucX_94qMCxF1QlqjLD6GdPqwOoNy6NZ6EUhhwzhKecawYp5h4BgxNiCHETUk8AzQUA1J/s400/new+module.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5526778127273659074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Итак, проект создан. Открываем genre.java и кликаем на вкладку Design.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaO5HC-FlmYMPmigSXiATR0OHWoNfxbvvQoT0nPxjhyphenhyphen1zpbwmuLh3yqcLc7ko9VQT7Vv-Y2k-isL0I1pdyXGnuPP-k3yAjk2aPXYuf6CcBTnVbYjhwiy_a4JI9y9Fw3Vlk924hxYNZ/s1600/genre+design.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 287px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaO5HC-FlmYMPmigSXiATR0OHWoNfxbvvQoT0nPxjhyphenhyphen1zpbwmuLh3yqcLc7ko9VQT7Vv-Y2k-isL0I1pdyXGnuPP-k3yAjk2aPXYuf6CcBTnVbYjhwiy_a4JI9y9Fw3Vlk924hxYNZ/s400/genre+design.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5526778829451831234&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Что нам надо для организации передачи данных? Мы не можем использовать rpc call gwt, так как у нас на стороне сервера django. Что делать в данном случае? Я рассматривал &lt;a href=&quot;http://vermus.blogspot.com/2009/12/gwt-django.html&quot;&gt;данный вопрос&lt;/a&gt; около года назад. Итог такой: возможен вывод данных в темплейте и преобразование их в javascript object, но это не очень оптимальный путь, тем более, что приложению обычно нужны данные в процессе работы (в том числе, обновленные). Поэтому лучшим решением мне предоставляется &lt;a href=&quot;http://vermus.blogspot.com/2010/02/smartgwt-django-rest.html&quot;&gt;REST&lt;/a&gt; (с помощью этого подхода не надо проходить новый путь создания интерфейсов сервисов). Я решил не использовать SmartGWT, слишком он навороченный. В чистом GWT нет поддержки REST, поэтому воспользуемся &lt;a href=&quot;http://www.restlet.org/downloads/testing&quot;&gt;Restlet Framework&lt;/a&gt;, ну а со стороны django - &lt;a rel=&quot;nofollow&quot; href=&quot;http://bitbucket.org/jespern/django-piston/wiki/Home&quot;&gt;django-piston&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Скачаем &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.scribd.com/doc/23792711/Presentation-Restlet&quot;&gt;Restlet Framework&lt;/a&gt;, Edition for Google Web Toolkit. Установим (укажем java build path в свойствах проекта).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Django-Piston&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь перейдем к серверной стороне. django-piston я уже как-то &lt;a href=&quot;http://vermus.blogspot.com/2010/02/smartgwt-django-rest.html&quot;&gt;упоминал&lt;/a&gt;. Так вот, устанавливаем:&lt;br /&gt;&lt;br /&gt;&gt;c:\Python26\Scripts\pip.exe install hg+http://bitbucket.org/jespern/django-piston@c4b2d21db51a#egg=piston&lt;br /&gt;&lt;br /&gt;Читаем &lt;a href=&quot;http://bitbucket.org/jespern/django-piston/wiki/Documentation&quot;&gt;документацию&lt;/a&gt;. Создадим приложение api, пропишем (r&#39;^api/&#39;, include(&#39;api.urls&#39;)), в главном urls.py. Создадим в приложении файлы urls.py и handlers.py. Остальные файлы, кроме __init__.py можно удалить. &lt;br /&gt;handlers.py:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;from django.core.urlresolvers import reverse&lt;br /&gt;&lt;br /&gt;from piston.handler import BaseHandler#@UnresolvedImport&lt;br /&gt;&lt;br /&gt;from genre.models import GenreDirStyle#@UnresolvedImport&lt;br /&gt;&lt;br /&gt;class GenreHandler(BaseHandler):&lt;br /&gt;    allowed_methods = (&#39;GET&#39;, )&lt;br /&gt;    fields = (&#39;name&#39;, &#39;type&#39;, &#39;url&#39; )&lt;br /&gt;    model = GenreDirStyle&lt;br /&gt;&lt;br /&gt;    @classmethod&lt;br /&gt;    def url(self, genre):&lt;br /&gt;        return reverse(&#39;genre_genre&#39;, args=[genre.id])&lt;br /&gt;&lt;br /&gt;    def read(self, request, genre_id):&lt;br /&gt;        genre = GenreDirStyle.objects.get(id=int(genre_id))&lt;br /&gt;        return genre&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;urls.py:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;from django.conf.urls.defaults import *&lt;br /&gt;&lt;br /&gt;from piston.resource import Resource#@UnresolvedImport&lt;br /&gt;&lt;br /&gt;from api.handlers import GenreHandler#@UnresolvedImport&lt;br /&gt;&lt;br /&gt;genre_resource = Resource(handler=GenreHandler)&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns(&#39;&#39;,&lt;br /&gt;                        url(r&#39;^genre/(?P&lt;genre_id&gt;[^/]+)/$&#39;, genre_resource, name=&#39;api_genre_id&#39;), &lt;br /&gt;                        )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Переходим по адресу, например http://localhost:8000/api/genre/3/ :&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;json&quot;&gt;&lt;br /&gt;{&lt;br /&gt;    &quot;url&quot;: &quot;/genre/id/4/&quot;, &lt;br /&gt;    &quot;type&quot;: 3, &lt;br /&gt;    &quot;name&quot;: &quot;Prog-Rock&quot;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чтобы открывать application/json в firefox, установите &lt;a rel=&quot;nofollow&quot; href=&quot;https://addons.mozilla.org/en-US/firefox/addon/8207/&quot;&gt;дополнение&lt;/a&gt;, а еще лучше используйте  &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/9780&quot;&gt;RESTClient для Firefox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Вернемся к клиентской части.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Добавим widget дерево в gwt приложение tree:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH4IoD1X6bAwEm5FuzXQBmmo6UEP2Pi4IxbXmBTPeiJNk9iTQPh19x0j5LFxhCKp-DVJWl2Qtp0RtKQdY3fSpBJTsoU6erk3ee_ZdL1_nwZeXayn6e1ugNcPww9eEn2SeKltsAnYD9/s1600/gwt+designer+add+tree.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 251px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH4IoD1X6bAwEm5FuzXQBmmo6UEP2Pi4IxbXmBTPeiJNk9iTQPh19x0j5LFxhCKp-DVJWl2Qtp0RtKQdY3fSpBJTsoU6erk3ee_ZdL1_nwZeXayn6e1ugNcPww9eEn2SeKltsAnYD9/s400/gwt+designer+add+tree.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5519998645858079090&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPVqNAVNJQ5CsTket2qgy59U4aTX0JVUEnhIZy794-mRYZtNI_CFPyi4JCOZJM7GBQUoXm2Sz_uEGmcsf7ZczQujbqam_jxD01q8Lz1cSdtWtO-7ihCVkE7y1bU9n5mJE4jL8yuxa/s1600/gwt+designer+add+tree+item.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 349px; height: 400px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPVqNAVNJQ5CsTket2qgy59U4aTX0JVUEnhIZy794-mRYZtNI_CFPyi4JCOZJM7GBQUoXm2Sz_uEGmcsf7ZczQujbqam_jxD01q8Lz1cSdtWtO-7ihCVkE7y1bU9n5mJE4jL8yuxa/s400/gwt+designer+add+tree+item.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5520045758776653058&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Запускаем отладку, кстати, сразу рекомендую изменить параметр logLevel в конфигурации отладки.&lt;br /&gt;&lt;br /&gt;С помощью firebug видим, что ответа на запрос по адресу http://localhost:8000/api/genre/3 не увенчались успехом, поэтому вспоминаем про &lt;a href=&quot;http://vermus.blogspot.com/2009/12/gwt-django.html&quot;&gt;проблему SOP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В процессе поиска решений наткнулся на &lt;a rel=&quot;nofollow&quot; href=&quot;http://gist.github.com/426829&quot;&gt;django-crossdomainxhr-middleware.py&lt;/a&gt;, позволяющее использовать &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.mozilla.org/En/HTTP_access_control&quot;&gt;кроссдоменные запросы&lt;/a&gt; (требуется firefox &gt; 3.5).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0K22H4K3pkLqBCSZbl3OQXCcp_nK0W9waxuYsDGla5S4FmNjpQZW2itk9MCwhF3boswd135Ia5tchkZTIzCGNDtYbw2KrO2LAunGdIr9Xhfqgk5qaFZFNVOKgxJSqPBRVRxU0d_7u/s1600/SOP+headers.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 182px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0K22H4K3pkLqBCSZbl3OQXCcp_nK0W9waxuYsDGla5S4FmNjpQZW2itk9MCwhF3boswd135Ia5tchkZTIzCGNDtYbw2KrO2LAunGdIr9Xhfqgk5qaFZFNVOKgxJSqPBRVRxU0d_7u/s400/SOP+headers.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5521851616368631810&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Но мы пока его использовать не будем.&lt;br /&gt;&lt;br /&gt;Итак, проблему SOP при разработке решим следующим образом. Отключим Jetty сервер, запускаемый в отладке, а также укажем порт 8000.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEircbpwoL_gY7nzlRFOMTZOMM1Ou3OpzCnV43E7Jhhjdmx2VhCvxx2oHRIx1MSPVhVpdMJRw_Sl7LZ4PE8JUZTWbi8_wymki6TbMDuJMZU30qyT_n7NJckmW8r5B9DFtTLwJRQFc4OY/s1600/gwt+noserver.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 363px; height: 117px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEircbpwoL_gY7nzlRFOMTZOMM1Ou3OpzCnV43E7Jhhjdmx2VhCvxx2oHRIx1MSPVhVpdMJRw_Sl7LZ4PE8JUZTWbi8_wymki6TbMDuJMZU30qyT_n7NJckmW8r5B9DFtTLwJRQFc4OY/s400/gwt+noserver.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5522578356080532562&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сделаем символическую ссылку с директории war проекта на www\media\static\gwt\genre, под windows, например, так:&lt;br /&gt;&lt;br /&gt;www\media\static\gwt&gt;mklink /d genre d:\path\to\gwt\war\&lt;br /&gt;&lt;br /&gt;Далее, можно отлаживать приложение по адресу примерно такому (предварительно запустив веб-сервер отладки django) http://localhost:8000/media/static/gwt/genre/GenreTree.html?gwt.codesvr=127.0.0.1:9997 адресу. Параметр gwt.codesvr обязателен при отладке gwt приложения.&lt;br /&gt;&lt;br /&gt;А еще лучше создать темплейт django, подключив к нему приложение gwt примерно следующим образом. Создаем div с id=&#39;genreTreeEntryPointId&#39; в темплейте, а в gwt root panel определяем следующим образом: &lt;br /&gt;RootPanel rootPanel = RootPanel.get(&quot;genreTreeEntryPointId&quot;);&lt;br /&gt;&lt;br /&gt;Теперь мы можем отлаживать gwt приложение прямо в &quot;окружении&quot; django-проекта, например, по адресу такому http://localhost:8000/genre/tree/?gwt.codesvr=127.0.0.1:9997&amp;genre_id=2 .&lt;br /&gt;&lt;br /&gt;Серверный и клиентский код выкладывать слишком много, остановимся на нюансах:&lt;br /&gt;&lt;br /&gt;- Выбор конкретного жанра в дереве (например при нажатии на меню жанров сверху). В этом случае загрузка списка для создания дерева вложенного множества осуществляется следующим образом (нам надо загрузить ветку, каждый элемент которой должен загрузить соседей):&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;        treeqs = GenreDirStyle.objects.raw(&quot;&quot;&quot;SELECT t2.*&lt;br /&gt;                    FROM genre_genredirstyle AS t1&lt;br /&gt;                    LEFT JOIN genre_genredirstyle AS t2&lt;br /&gt;                    ON t2.lft BETWEEN t1.lft AND t1.rgt&lt;br /&gt;                    WHERE t1.lft &lt; %s AND t1.rgt &gt; %s AND t1.tree_id = 1 AND t2.depth-1 = t1.depth AND t2.tree_id = %s&lt;br /&gt;                    ORDER BY t2.lft;&quot;&quot;&quot;, (genre.lft, genre.rgt, genre.tree_id))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Построение дерева решил возложить на плечи клиентов.&lt;br /&gt;- При загрузке приложения выводим div с изображением, который заменяется самим приложением, после его загрузки, а также выполнения всех ajax запросов.&lt;br /&gt;- Настройки приложения выводим как JSON объект в javascript, получая значения которого в gwt приложении:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;private final Dictionary paramsDict = Dictionary.getDictionary(&quot;gwtGenreParameters&quot;);&lt;br /&gt;String paramsDict.get(&quot;API_GENRES_MAIN_URL&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Автоматический разбор JSON ответа. Используем данное &lt;a href=&quot;http://code.google.com/p/piriti/wiki/RestletExtension&quot;&gt;приложение&lt;/a&gt;.&lt;br /&gt;Оно зависит от: google-gin и totoe (погуглите и подключайте в проект).&lt;br /&gt;- Для обозначения состояния элемента дерева используем своей объект класса (сокращенный вид):&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt; private class GenreTreeItemData&lt;br /&gt; {&lt;br /&gt;  private int id;&lt;br /&gt;  private Boolean alreadyLoaded  = false;&lt;br /&gt;  private String description;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;используя функцию setUserObject(Object).&lt;br /&gt;- При создании проекта, в настройках gwt приложения наследуется стиль по умолчанию gwt standart. Так вот, проблема в том, что в нем есть правила css, переопределяющие наши (в том числе body). Решить это можно двумя способами, вот &lt;a rel=&quot;nofollow&quot; href=&quot;http://groups.google.fr/group/Google-Web-Toolkit/msg/3e630a3059303b19&quot;&gt;первый&lt;/a&gt;, а можно просто удалить нежелательные строки из standard.css файла в директории gwt\standard\ (их там немного и они вначале).&lt;br /&gt;- Для генерации документации по API используем вид from piston.doc import documentation_view.&lt;br /&gt;&lt;br /&gt;После работы все как обычно и результат:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlTSGCzw95pPO8KIpEJiRUDAYu8S3FGs6yJ6_r7YE1B6bo0RznL9Jj8WX24s4-_p0C8KoVX8LQkzNLugk4ZPe8x3NJoyPa08w328_W1aIFDsmUC4NWd6vMkjV8k_OVQTj-G9PwpK1G/s1600/genres.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 366px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlTSGCzw95pPO8KIpEJiRUDAYu8S3FGs6yJ6_r7YE1B6bo0RznL9Jj8WX24s4-_p0C8KoVX8LQkzNLugk4ZPe8x3NJoyPa08w328_W1aIFDsmUC4NWd6vMkjV8k_OVQTj-G9PwpK1G/s400/genres.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5536332419443991042&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ps. На стороне сервера попробовал &lt;a href=&quot;http://oradir.blogspot.com/2010/08/aptana-3-beta.html&quot;&gt;использовать Aptana 3.0&lt;/a&gt;, там действительно отменная поддержка Django темплейтов в PyDev (но наткнулся на баг, ctrl+space вешает IDE, может только у меня так?).</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/3813547086633209457/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2010/11/musicmansru-django-gwt.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3813547086633209457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/3813547086633209457'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2010/11/musicmansru-django-gwt.html' title='musicmans.ru | Как сделать сайт на Django | GWT'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWiGX6qVUZsoW42cHy5jfZ0R1L9ok_0VbEluIbewtz-onNZ4kZZvCH_Ta9r68l8vC41mOntgOhUf9j-jiCwpaH0DVmIBuKZXp27cF-_Ci4xF5OuoOOIUBBqvGc4elyBIWbx9o68EkW/s72-c/gwt+java+project.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-362813386912085866</id><published>2010-09-15T17:00:00.005+04:00</published><updated>2010-09-16T10:20:13.277+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="django"/><category scheme="http://www.blogger.com/atom/ns#" term="musicmans.ru"/><category scheme="http://www.blogger.com/atom/ns#" term="музыкальные жанры и стили"/><title type='text'>musicmans.ru | Как сделать сайт на Django | Жанры, направления, стили</title><content type='html'>Прошу прощения за долгое отсутствие. &lt;br /&gt;Пишем следующее приложение. Я решил, что жанры, направления и стили; инструменты; композиции; исполнители будут у нас отдельными приложениями, потому что планирую, что они обрастут серьезной функциональностью.&lt;br /&gt;&lt;br /&gt;Начнем с жанров, направлений и стилей. Создадим приложение genre, сразу создаем модель жанра.&lt;br /&gt;Чтобы создать модель, нам надо определиться, что такое жанр собственно? К сожалению, в русском интернете, большая путница и мешанина из жанров, стилей и направлений. Нет ни &lt;a rel=&quot;nofollow&quot; href=&quot;http://books.google.ru/books?id=Y1OoJE0cu-EC&amp;printsec=frontcover&quot;&gt;исследований&lt;/a&gt;, ни достаточно устоявшихся критериев. &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.csl.sony.fr/downloads/papers/2000/pachet-riao2000.pdf&quot;&gt;Прочитав эту заметку&lt;/a&gt; начал задумываться структуре систематизации жанров и стилей. И главное, неплохо было бы найти уже существующую отлаженную структуру (&lt;a rel=&quot;nofollow&quot; href=&quot;http://moustaki.org/resources/styles.owl&quot;&gt;Amazon&lt;/a&gt;). После долгих поисков (amg, amazon, mp3.com, discogs) остановился на варианте от &lt;a rel=&quot;nofollow&quot; href=&quot;http://allmusic.com/cg/amg.dll?p=amg&amp;sql=73:&quot;&gt;amg&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Итак, напишем модель жанра, направления и стиля и заполним их структурой. &lt;br /&gt;&lt;br /&gt;Так как я один, и у меня нет редакторов, то пришлось воспользоваться результатом чужих трудов и спарсить структуру жанров, направлений и стилей с amg. Надеюсь они на меня за это не в обиде.&lt;br /&gt;&lt;br /&gt;Код приводить не буду, расскажу что использовал &lt;a rel=&quot;nofollow&quot; href=&quot;http://codespeak.net/lxml&quot;&gt;lxml&lt;/a&gt;, а также окружение проекта для записи жанров/стилей.&lt;br /&gt;&lt;br /&gt;После того как данные в базе, сделаем &lt;a rel=&quot;nofollow&quot; href=&quot;http://docs.djangoproject.com/en/dev/howto/initial-data/&quot;&gt;initial data&lt;/a&gt; для приложения:&lt;br /&gt;&lt;br /&gt;&gt;python manage.py dumpdata genre &gt; apps\genre\fixtures\initial_data.json&lt;br /&gt;&lt;br /&gt;Теперь попробуем вывести дерево жанров/стилей.&lt;br /&gt;&lt;br /&gt;На данном этапе понимаем, что вывод &quot;детей&quot; стилей сулит нам лавинообразные запросы к базе данных (&lt;a rel=&quot;nofollow&quot; href=&quot;http://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related&quot;&gt;select_related&lt;/a&gt; нам тоже не поможет, он не срабатывает для моделей с полями отношения ForeignKey с null=True ( father = models.ForeignKey(&#39;self&#39;, verbose_name=_(u&#39;Родитель&#39;), related_name=&#39;child_dirs_styles&#39;, null=True) ) ), поэтому воспользуемся приложением для &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation&quot;&gt;хранения деревьев&lt;/a&gt; в базе данных &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/tabo/django-treebeard/&quot;&gt;django-treebeard&lt;/a&gt; (&lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/&quot;&gt;документация&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;C:\&gt;c:\Python26\Scripts\pip.exe install git+git://github.com/tabo/django-treebeard@8eb52a4f4274615e86a7572a8bab39b79d718b88&lt;br /&gt;&lt;br /&gt;Добавляем &#39;treebeard&#39; в INSTALLED_APPS. Если вы используете админку, то настройка немного &lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/intro.html#configuration&quot;&gt;посложней&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/intro.html#basic-usage&quot;&gt;Воспользуемся&lt;/a&gt; моделью хранения деревьев &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.getinfo.ru/article610.html&quot;&gt;Nested Sets&lt;/a&gt;. Не стоит пугаться последней ссылки, тем то и хорошо приложение treebeard, что за нас уже &lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/ns_tree.html#treebeard.ns_tree.NS_Node&quot;&gt;решен вопрос хранения деревьев&lt;/a&gt; в SQL базе. Нам лишь стоит воспользоваться набором функций.&lt;br /&gt;&lt;br /&gt;Смотрим нашу модель:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;# -*- coding:utf-8 -*-&lt;br /&gt;from django.db import models&lt;br /&gt;from django.utils.translation import ugettext_lazy as _&lt;br /&gt;from treebeard.ns_tree import NS_Node #@UnresolvedImport &lt;br /&gt;&lt;br /&gt;GENRE_DIR_STYLE = (&lt;br /&gt;    (0, _(&#39;Музыка&#39;)),&lt;br /&gt;    (1, _(&#39;Жанр&#39;)),&lt;br /&gt;    (2, _(&#39;Направление&#39;)),&lt;br /&gt;    (3, _(&#39;Стиль&#39;)),&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;class GenreDirStyle(NS_Node):&lt;br /&gt;    name = models.CharField(max_length=1000, verbose_name=_(u&#39;Title&#39;))&lt;br /&gt;    name_ru = models.CharField(max_length=1000, verbose_name=_(u&#39;Название&#39;), blank=True, null=True)&lt;br /&gt;    type = models.IntegerField(choices=GENRE_DIR_STYLE)&lt;br /&gt;    description = models.CharField(max_length=10000, verbose_name=_(u&#39;Описание&#39;), blank=True)&lt;br /&gt;&lt;br /&gt;    class Meta:&lt;br /&gt;        ordering = [&quot;name&quot;]&lt;br /&gt;        verbose_name = _(u&#39;Жанр, направление, стиль&#39;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Пробуем, работает ли миграции South с treebeard:&lt;br /&gt;&lt;br /&gt;./manage.py schemamigration genre --auto&lt;br /&gt;&lt;br /&gt;получаем сообщение следующего &lt;a rel=&quot;nofollow&quot; href=&quot;http://south.aeracode.org/docs/tutorial/part2.html&quot;&gt;вида&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;? The field &#39;GenreDirStyle.lft&#39; does not have a default specified, yet is NOT NULL.&lt;br /&gt; ? Since you are adding or removing this field, you MUST specify a default&lt;br /&gt; ? value to use for existing rows. Would you like to:&lt;br /&gt; ?  1. Quit now, and add a default to the field in models.py&lt;br /&gt; ?  2. Specify a one-off value to use for existing columns now&lt;br /&gt; ? Please select a choice:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://bitbucket.org/tabo/django-treebeard/issue/8/support-for-migrating-to-django-treebeard-null-true-in-the-model&quot;&gt;South нас просит указать обязательное значение&lt;/a&gt; по умолчанию. Нажимаем 2, и значение 0.&lt;br /&gt;&lt;br /&gt;Как создать &lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/api.html#treebeard.models.Node&quot;&gt;дерево&lt;/a&gt;? Просто:&lt;br /&gt;1. Создаем корень дерева.&lt;br /&gt;pop_music = GenreDirStyle.add_root(name = &quot;Популярная музыка&quot;, type = 0)#оно сразу сохраняется save()&lt;br /&gt;2. Создаем жанр:&lt;br /&gt;pop_music.add_child(name = &quot;Rock&quot;, type = 1)&lt;br /&gt;&lt;br /&gt;И здесь сталкиваемся с &lt;a href=&quot;http://bitbucket.org/tabo/django-treebeard/issue/29/ns_node-do-not-cache-lft-rgt-on-insert&quot;&gt;проблемой&lt;/a&gt;, в случае парсинга (см. выше) html и создания базы &quot;на лету&quot;. Поэтому читаем &lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/1.61/intro.html#basic-usage&quot;&gt;basic-usage&lt;/a&gt; внимательней и переписываем примерно так:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;&gt;&gt;&gt; get = lambda node_id: Category.objects.get(pk=node_id)&lt;br /&gt;&gt;&gt;&gt; root = Category.add_root(name=&#39;Computer Hardware&#39;)&lt;br /&gt;&gt;&gt;&gt; node = get(root.id).add_child(name=&#39;Memory&#39;)&lt;br /&gt;&gt;&gt;&gt; get(node.id).add_sibling(name=&#39;Hard Drives&#39;)&lt;br /&gt;&lt;Category: Category: Hard Drives&gt;&lt;br /&gt;&gt;&gt;&gt; get(node.id).add_sibling(name=&#39;SSD&#39;)&lt;br /&gt;&lt;Category: Category: SSD&gt;&lt;br /&gt;&gt;&gt;&gt; get(node.id).add_child(name=&#39;Desktop Memory&#39;)&lt;br /&gt;&lt;Category: Category: Desktop Memory&gt;&lt;br /&gt;&gt;&gt;&gt; get(node.id).add_child(name=&#39;Laptop Memory&#39;)&lt;br /&gt;&lt;Category: Category: Laptop Memory&gt;&lt;br /&gt;&gt;&gt;&gt; get(node.id).add_child(name=&#39;Server Memory&#39;)&lt;br /&gt;&lt;Category: Category: Server Memory&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Не забудем обновить json данные, после изменения и миграций моделей.&lt;br /&gt;Для вывода дерева жанров используем функцию &lt;a rel=&quot;nofollow&quot; href=&quot;https://tabo.pe/projects/django-treebeard/docs/tip/api.html#treebeard.models.Node.get_tree&quot;&gt;get_tree&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;from annoying.decorators import render_to#@UnresolvedImport&lt;br /&gt;from django.shortcuts import get_object_or_404&lt;br /&gt;&lt;br /&gt;from models import GenreDirStyle&lt;br /&gt;&lt;br /&gt;@render_to(&#39;genres/genre_tree.html&#39;)&lt;br /&gt;def genre_tree(request):&lt;br /&gt;&lt;br /&gt;    pop_genre = GenreDirStyle.objects.get(name=&quot;Популярная музыка&quot;, type=0)&lt;br /&gt;    classic_genre = GenreDirStyle.objects.get(name=&quot;Классическая музыка&quot;, type=0)&lt;br /&gt;&lt;br /&gt;    pop_tree = GenreDirStyle.get_tree(pop_genre)&lt;br /&gt;    classic_tree = GenreDirStyle.get_tree(classic_genre)&lt;br /&gt;   &lt;br /&gt;    return {&lt;br /&gt;          &#39;pop_tree&#39;: pop_tree,&lt;br /&gt;          &#39;classic_tree&#39;: classic_tree&lt;br /&gt;          } &lt;br /&gt;&lt;br /&gt;@render_to(&#39;genres/genre_genre.html&#39;)&lt;br /&gt;def genre_genre(request, genre_id):&lt;br /&gt;    &lt;br /&gt;    genre = get_object_or_404(GenreDirStyle, id = int(genre_id))&lt;br /&gt;&lt;br /&gt;    return {&lt;br /&gt;            &#39;genre&#39;: genre&lt;br /&gt;          } &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;На данном этапе django-toolbar показывал замечательные 5 запросов за 13 мс. А вот общая генерация страницы занимала 6573.00 ms. Это очень долго, хотя при выключенном debug режиме ощутимо быстрее. Все упирается в рендеринг. Проэтому применим кеш в темплейте (на шесть часов, например):&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;{% load cache %}&lt;br /&gt;{% cache 21600 pop_tree_chache %}&lt;br /&gt;{% for node in pop_tree %}&lt;br /&gt;  {% include &quot;genres/genre_node.html&quot; %}&lt;br /&gt;{% endfor %}&lt;br /&gt;{% endcache %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;А также включим на время (позже настроим memcached на сервере) &lt;a href=&quot;http://djbook.ru/ch13.html#djangobook.chap13.setup.simple-caching&quot;&gt;кеширование в память&lt;/a&gt;, в settings/common.py:&lt;br /&gt;&lt;br /&gt;CACHE_BACKEND = &#39;locmem:///&#39;&lt;br /&gt;&lt;br /&gt;Темплейты интуитивно понятны, покажу лишь темплейт жанра, включаемый в цикл вывода дерева. &lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;{% load dj_tags %}&lt;br /&gt;&lt;div style=&quot;padding-left:{{ node.get_depth|multiply:20|subtract:20 }}px;&quot;&gt;&lt;br /&gt;&lt;h{{ node.type|add:&quot;1&quot; }}&gt;&lt;br /&gt;&lt;a href=&quot;{% url genre_genre node.pk %}&quot;&gt;{% if node.get_depth &gt; 1 %}{{ node.get_type_display }} {% endif %}{{ node.name }}&lt;/a&gt;&lt;br /&gt;&lt;/h{{ node.type|add:&quot;1&quot; }}&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Ужасно, blogger все сломал, смотрите &lt;a rel=&quot;nofollow&quot; href=&quot;http://pastebin.com/SWEHzsMX&quot;&gt;здесь&lt;/a&gt;)&lt;br /&gt;Обратите внимание на фильтр multiply и substract. Это не стандартные фильтры django, а &lt;a rel=&quot;nofollow&quot; href=&quot;http://docs.djangoproject.com/en/dev/howto/custom-template-tags/&quot;&gt;написаные в нашем приложении&lt;/a&gt; dj_tags.&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;from django import template&lt;br /&gt;register=template.Library()&lt;br /&gt;&lt;br /&gt;@register.filter(name=&#39;multiply&#39;)&lt;br /&gt;def multiply(value, arg):&lt;br /&gt;    return int(value) * int(arg)&lt;br /&gt;&lt;br /&gt;@register.filter(name=&#39;subtract&#39;)&lt;br /&gt;def subtract(value, arg):&lt;br /&gt;    return int(value) - int(arg)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Итак, мы познакомились с хранением деревьев в базе данных с django, их выводом, затронули кеширование, написали пару темплейт тегов.&lt;br /&gt;&lt;br /&gt;Ну, окончание, как обычно, тесты, мерж, развертывание.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2uZxj5zYYdKcY1_j5xIugZMql0TqIkI6Qrgb0bH59uG6EV0byBCosrPeVVUSwXKJS44z7WeC7KjCFK17Pw4Ofuo9IJGo8abG0NfjI8ZguhxSnv_hTeRsy-7GGDXX3DOTAiCbDwZN/s1600/musicmans.ru+prog-rock+style.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2uZxj5zYYdKcY1_j5xIugZMql0TqIkI6Qrgb0bH59uG6EV0byBCosrPeVVUSwXKJS44z7WeC7KjCFK17Pw4Ofuo9IJGo8abG0NfjI8ZguhxSnv_hTeRsy-7GGDXX3DOTAiCbDwZN/s400/musicmans.ru+prog-rock+style.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5517121932504456834&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH9FQV0UFslwL1KuenfLCZ6EaxEr-UibEX0A3SrsoBnhnM8RiJcD-zzvoQ113uXd8Tnl_EcrWMYH7tpiOqU0zbISBAJOr7OHvwn9rFrW8W9CrQ7h9DeIMUC27p2DdNx7iujMN6sSq3/s1600/musicmans.ru+gernres+directions+styles.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 286px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH9FQV0UFslwL1KuenfLCZ6EaxEr-UibEX0A3SrsoBnhnM8RiJcD-zzvoQ113uXd8Tnl_EcrWMYH7tpiOqU0zbISBAJOr7OHvwn9rFrW8W9CrQ7h9DeIMUC27p2DdNx7iujMN6sSq3/s400/musicmans.ru+gernres+directions+styles.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5517121922437947026&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ps. Не забудем &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.djangoproject.com/weblog/2010/sep/08/security-release/&quot;&gt;обновить&lt;/a&gt; django (&gt;c:\Python26\Scripts\pip.exe install --upgrade Django и прописать в requirements.txt)!</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/362813386912085866/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2010/09/musicmansru-django.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/362813386912085866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/362813386912085866'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2010/09/musicmansru-django.html' title='musicmans.ru | Как сделать сайт на Django | Жанры, направления, стили'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2uZxj5zYYdKcY1_j5xIugZMql0TqIkI6Qrgb0bH59uG6EV0byBCosrPeVVUSwXKJS44z7WeC7KjCFK17Pw4Ofuo9IJGo8abG0NfjI8ZguhxSnv_hTeRsy-7GGDXX3DOTAiCbDwZN/s72-c/musicmans.ru+prog-rock+style.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4797167376881538347.post-2745221456190559682</id><published>2010-08-07T10:24:00.004+04:00</published><updated>2010-08-09T09:03:42.160+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="django"/><category scheme="http://www.blogger.com/atom/ns#" term="django-messages"/><category scheme="http://www.blogger.com/atom/ns#" term="django-notification"/><category scheme="http://www.blogger.com/atom/ns#" term="musicmans.ru"/><title type='text'>musicmans.ru | Как сделать сайт на Django | Пользователи. Личные сообщения. Уведомления</title><content type='html'>Пока Вы &lt;a href=&quot;http://vermus.blogspot.com/2010/08/musicmansru-django.html&quot;&gt;разбираетесь с тестированием&lt;/a&gt; в django, попутно приступим к личным сообщениям, без них трудно представить современный веб-сайт. &lt;br /&gt;Перед тем как приступить, установим &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/robhudson/django-debug-toolbar&quot;&gt;еще такую вещь&lt;/a&gt; на машину разработчика. &lt;br /&gt;&lt;br /&gt;#pip install git+git://github.com/robhudson/django-debug-toolbar&lt;br /&gt;Смело ставим последнюю версию, ибо если что-то сломается, то на машине разработчика это не критично.&lt;br /&gt;development.py:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;INSTALLED_APPS += (&lt;br /&gt;                   &#39;django.contrib.admin&#39;,#tests&lt;br /&gt;                   &#39;debug_toolbar&#39;,&lt;br /&gt;                   )&lt;br /&gt;&lt;br /&gt;MIDDLEWARE_CLASSES += (    &lt;br /&gt;                       &#39;debug_toolbar.middleware.DebugToolbarMiddleware&#39;,&lt;br /&gt;                       )&lt;br /&gt;&lt;br /&gt;INTERNAL_IPS = (&#39;127.0.0.1&#39;,)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Обновляем localhost:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDYe7LAjRrjrNoGra1fg9BS6woHbPDrgfSYB9ES-PCwxFx1TTTdFTL6kkbC8YKGUgsIBId8Dzd8U8aSkArgdAeakYTPXYixpu0VPVedz0SumjCLuL61FvoXLhADdp-zWsdRhBcsYHP/s1600/django+toolbar.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDYe7LAjRrjrNoGra1fg9BS6woHbPDrgfSYB9ES-PCwxFx1TTTdFTL6kkbC8YKGUgsIBId8Dzd8U8aSkArgdAeakYTPXYixpu0VPVedz0SumjCLuL61FvoXLhADdp-zWsdRhBcsYHP/s400/django+toolbar.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5501433039572862690&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Поинтересуйтесь содержимым пунктов меню, там много интересного.&lt;br /&gt;&lt;br /&gt;Итак, личные сообщения. Опять &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/p/django-messages/&quot;&gt;все написано&lt;/a&gt; за нас. Устанавливаем из транка (кстати, вот консольный &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.sliksvn.com/en/download/&quot;&gt;svn клиент&lt;/a&gt; для windows):&lt;br /&gt;&lt;br /&gt;&gt;pip.exe install svn+http://django-messages.googlecode.com/svn/trunk/@141#egg=django_messages&lt;br /&gt;&lt;br /&gt;141-я ревизия транка на данный момент, как написано на странице проекта это будущая версия 0.5, совместимая с Django 1.2 (как раз то, что нам нужно). Не забываем requirements.txt (кстати, я подумал, что неплохо было бы сначала добавлять строчку в requirements.txt, а ставить основываясь на файле. Надо только использовать одну директорию с кешом pip, чтобы он постоянно не скачивал дистрибутивы. Ставить установленные приложения по новой он не будет, но мы будем уверены, что не забудем прописать все приложения в requirements.txt и не испытаем проблем на сервере с сайтом).&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/p/django-messages/source/browse/trunk/docs/usage.txt&quot;&gt;Документация&lt;/a&gt; по настройке. Тут кстати возникает путаница, &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/p/django-messages/source/browse/trunk/setup.py&quot;&gt;здесь&lt;/a&gt; приложение указано как django_messages, а в документации используется messages, так что используем django_messages.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/p/django-messages/source/browse/trunk/docs/customizing.txt&quot;&gt;Изменим темплейты&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Скопируем из приложения и изменим под свои нужды.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioGsEujY9u6kiJAA3qAiUMv91Ch6IhJpggYJBuMRTnvzJKoxPy3CVnk-azWXD0JZHTC7KcYmGsZs-MBt-a1uLwQWD8D151Ths1Rk3OcucWpe4T66uuHqKaO7YrQT5wVpm5bqcxWmWt/s1600/django+messages+templates.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 275px; height: 224px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioGsEujY9u6kiJAA3qAiUMv91Ch6IhJpggYJBuMRTnvzJKoxPy3CVnk-azWXD0JZHTC7KcYmGsZs-MBt-a1uLwQWD8D151Ths1Rk3OcucWpe4T66uuHqKaO7YrQT5wVpm5bqcxWmWt/s400/django+messages+templates.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5501487155501690370&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В документации к приложению читаем, что оно использует &lt;a href=&quot;http://vermus.blogspot.com/2010/07/musicmansru-django_31.html&quot;&gt;django-mailer&lt;/a&gt; и &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/jtauber/django-notification/&quot;&gt;django-notification&lt;/a&gt;, если они установлены. Первое у нас есть, ставим второе (хорошее приложение, пригодится в будущем).&lt;br /&gt;&gt;pip.exe install git+git://github.com/jtauber/django-notification@3f023adf0ce2eafcee744904e2c358792f253721@egg=notification&lt;br /&gt;&lt;br /&gt;Пропишем &#39;django_messages&#39;, &#39;notification&#39; в приложения, настроим url.py. Синхронизируем базу.&lt;br /&gt;&lt;br /&gt;Просмотрим таблицу notification_noticetype, в ней должны находиться оповещения о работе с личными сообщениями. Приложение notification рассмотрим ниже.&lt;br /&gt;&lt;br /&gt;Как только мы видим список чего бы то ни было (список входящих сообщений), сразу рождаются мысли о пагинации. И как не удивительно :-) , django &lt;a rel=&quot;nofollow&quot; href=&quot;http://docs.djangoproject.com/en/dev/topics/pagination/&quot;&gt;поддерживает ее из&lt;/a&gt; коробки, а чтобы было совсем просто установим приложение &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/ericflo/django-pagination&quot;&gt;django-pagination&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&gt;pip.exe install git+git://github.com/ericflo/django-pagination@47e7ec874cd7dddda5ed13ffb6993a64dced2537&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/ericflo/django-pagination/blob/master/docs/usage.txt&quot;&gt;Настраиваем&lt;/a&gt;. Добавляем css разметку.&lt;br /&gt;&lt;br /&gt;А также переведем пару строк, так как в приложении нет русской локализации, djutils\locale\ru_RU\LC_MESSAGES\django.po:&lt;br /&gt;msgid &quot;previous&quot;&lt;br /&gt;msgstr &quot;назад&quot;&lt;br /&gt;&lt;br /&gt;msgid &quot;next&quot;&lt;br /&gt;msgstr &quot;вперед&quot;&lt;br /&gt;&lt;br /&gt;Не забудем скомпилировать.&lt;br /&gt;&lt;br /&gt;в темплейтах с сообщениями добавляем (с месторасположением самостоятельно, 2-ка для теста):&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;{% load pagination_tags %}&lt;br /&gt;{% autopaginate message_list 2 %}&lt;br /&gt;{% paginate %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В итоге получается:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGMnkiS8ZIDP7OQlPa1jgaEnvAWoBY5tNxMOZx1j6klejko4AJhCSnX_QlNUAh8G8EjlJUjF7d14KEBjPwFlCw6KmpqjMlH47eiivUgKQQZdY1zjYKlgS2w0jTPNlnKYqpU7r42xk3/s1600/django+pagination+messages.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 78px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGMnkiS8ZIDP7OQlPa1jgaEnvAWoBY5tNxMOZx1j6klejko4AJhCSnX_QlNUAh8G8EjlJUjF7d14KEBjPwFlCw6KmpqjMlH47eiivUgKQQZdY1zjYKlgS2w0jTPNlnKYqpU7r42xk3/s400/django+pagination+messages.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5501818569299710994&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Чтобы пользователи не были у нас безликими, давайте организуем им вывод профайлов.&lt;br /&gt;В user/url.conf&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;url(r&#39;^profile/(?P&lt;userprofile_id&gt;\d+)/$&#39;, users_views.userprofile, name=&#39;users_profile&#39;),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(блогспот пытается закрыть тег /userprofile_id самостоятельно, конечно это в коде не требуется)&lt;br /&gt;Вид:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;&lt;br /&gt;@login_required&lt;br /&gt;@render_to(&#39;users/user_profile.html&#39;)&lt;br /&gt;def userprofile(request, userprofile_id):&lt;br /&gt; &lt;br /&gt;    request_user = get_object_or_404(User, id=int(userprofile_id), is_active=True)&lt;br /&gt;    &lt;br /&gt;    return {&lt;br /&gt;          &#39;request_user&#39; : request_user,&lt;br /&gt;          }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Отмечу, что получать надо user, а не наш UserProfile, который еще может быть не создан.&lt;br /&gt;&lt;br /&gt;Соответственно, напишем темплейт.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-bWKQpUJYfBtWjHN9pWWIsh_9FV6t-FBKiDAOu1MzjtzglG1TQJ5gZ8v73LblnJ6_yMDWQb8QffKov0k_RtYLiMBtP_xgagTPHkBA1IPdXmtQIL5dS4xZKr6TCeiGlRnm7cttuTxW/s1600/django+inbox+messages.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 171px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-bWKQpUJYfBtWjHN9pWWIsh_9FV6t-FBKiDAOu1MzjtzglG1TQJ5gZ8v73LblnJ6_yMDWQb8QffKov0k_RtYLiMBtP_xgagTPHkBA1IPdXmtQIL5dS4xZKr6TCeiGlRnm7cttuTxW/s400/django+inbox+messages.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5501897407284148098&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;django_messages\templates\notification\ переведите вручную, перевод, который идет с приложением не работает (устарел наверное). Скопируем темплейты в users/templates, создадим папку locale в приложении и запустим создание файла перевода:&lt;br /&gt;&gt;python C:\Python26\Lib\site-packages\django\bin\django-admin.py makemessages  -e .html,.txt --locale=ru_RU&lt;br /&gt;в директории users.&lt;br /&gt;После редактирования скомпилируем.&lt;br /&gt;&lt;br /&gt;Темлейт для уведомлений notices.html для самостоятельного написания (можно подсмотреть в &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/pinax/pinax/blob/master/pinax/templates/default/notification/notices.html&quot;&gt;pinax&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Что такое notification? Это приложение для уведомлений. Когда происходит событие в системе, мы имеем возможность создать уведомление для пользователя, с возможностью настройки дополнительных рассылок уведомлений:&lt;br /&gt;&lt;br /&gt;* при логине на сайт.&lt;br /&gt;* по почте (настраивается пользователем).&lt;br /&gt;* по rss&lt;br /&gt;&lt;br /&gt;Подключим контекстный процессор &quot;notification.context_processors.notification&quot;.&lt;br /&gt;&lt;br /&gt;Мне не понравилась часть приложения по работе с url. Поэтому  скопировал приложение себе в проект и поправил под свои нужды, получилось примерно следующее:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKV70NCdqlhBu2mB3-sY4q1qV0lf64H1UelZJ6ZgmXRcAYeTQcw0KdHdd1CV6NZmW-IXfCeF1ostEbyE3vRPTda1jrl6oDxM22BS3N5FP7Jgci9yDkOjlBhE2yptQ3UxS31Xy293kn/s1600/musimans+user+notification.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 212px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKV70NCdqlhBu2mB3-sY4q1qV0lf64H1UelZJ6ZgmXRcAYeTQcw0KdHdd1CV6NZmW-IXfCeF1ostEbyE3vRPTda1jrl6oDxM22BS3N5FP7Jgci9yDkOjlBhE2yptQ3UxS31Xy293kn/s400/musimans+user+notification.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5502550271802344722&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Пишите &lt;a href=&quot;http://musicmans.ru/users/profile/1/&quot;&gt;сообщения&lt;/a&gt;. :)</content><link rel='replies' type='application/atom+xml' href='http://vermus.blogspot.com/feeds/2745221456190559682/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vermus.blogspot.com/2010/08/musicmansru-django_04.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/2745221456190559682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4797167376881538347/posts/default/2745221456190559682'/><link rel='alternate' type='text/html' href='http://vermus.blogspot.com/2010/08/musicmansru-django_04.html' title='musicmans.ru | Как сделать сайт на Django | Пользователи. Личные сообщения. Уведомления'/><author><name>Vermus</name><uri>http://www.blogger.com/profile/02301362335658588127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpXa_pmfqDJlVAvklczgdi4lZHUCKLJbgoGqBNLxxwt8gYGO-zrC-i7BO7ZDW4tbprOsKWaenYjDAjTKagcQJEtYLIY-XZ_NMPvVmM4fFDt5x7b-sKNTk2A5-RnaHtYQ/s220/1132344966d63af014.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDYe7LAjRrjrNoGra1fg9BS6woHbPDrgfSYB9ES-PCwxFx1TTTdFTL6kkbC8YKGUgsIBId8Dzd8U8aSkArgdAeakYTPXYixpu0VPVedz0SumjCLuL61FvoXLhADdp-zWsdRhBcsYHP/s72-c/django+toolbar.png" height="72" width="72"/><thr:total>7</thr:total></entry></feed>