<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>timsa.ru: заметки с тегом dadget</title>
<link>https://timsa.ru/tags/dadget/</link>
<description>Моя записная книжка. Комментарии отключены из-за спама. Для вопросов используйте эту страничку</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079)</generator>

<itunes:subtitle>Моя записная книжка. Комментарии отключены из-за спама. Для вопросов используйте эту страничку</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Подключаем Dadget CO2 к серваку</title>
<guid isPermaLink="false">116</guid>
<link>https://timsa.ru/all/podklyuchaem-dadget-co2-k-servaku/</link>
<pubDate>Mon, 20 Jul 2020 22:38:42 +0500</pubDate>
<author></author>
<comments>https://timsa.ru/all/podklyuchaem-dadget-co2-k-servaku/</comments>
<description>
&lt;ol start="1"&gt;
&lt;li&gt;Сначала сделаем чтобы любой пользователь мог обращаться к устройству&lt;br /&gt;
создаем /etc/udev/rules.d/10-co2mon.rules&lt;br /&gt;
с содержимым&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ACTION==&amp;quot;add|change&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;04d9&amp;quot;, ATTRS{idProduct}==&amp;quot;a052&amp;quot;, MODE:=&amp;quot;0666&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;щелкаем&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;udevadm control --reload
udevadm trigger&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;проверяем что /dev/usb/hiddev0 теперь crw-rw-rw-&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Подключаем библиотечку &lt;s&gt;PyUSB&lt;/s&gt; hid. PyUSB глючное говно вызывающее странные эффекты, например пропадение устройства hiddev0.&lt;br /&gt;
pip3 install hid (или hidapi уже не помню, это гуглится)&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Читаем (алгоритм расшифровки передрал с сишного проекта co2mod)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#!/usr/bin/env python3

import hid
import time

def decode_co(data):
    # кручу-верчу
    data[0], data[2] = data[2], data[0]
    data[1], data[4] = data[4], data[1]
    data[3], data[7] = data[7], data[3]
    data[5], data[6] = data[6], data[5]
    
    result = bytearray(8)

    # всех обмануть хочу
    result[7] = ((data[6] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[7] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[6] = ((data[5] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[6] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[5] = ((data[4] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[5] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[4] = ((data[3] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[4] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[3] = ((data[2] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[3] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[2] = ((data[1] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[2] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[1] = ((data[0] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[1] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    result[0] = ((data[7] &amp;lt;&amp;lt; 5) &amp;amp; 0xFF) | ((data[0] &amp;gt;&amp;gt; 3) &amp;amp; 0xFF)
    
    magic_word = b'Htemp99e'
    for i in range(8):
        r = ((magic_word[i] &amp;lt;&amp;lt; 4) &amp;amp; 0xFF) | ((magic_word[i] &amp;gt;&amp;gt; 4) &amp;amp; 0xFF)
        if result[i] &amp;lt; r:
            result[i] = 0xFF - r + result[i]
        else:
            result[i] = result[i] - r

    # не знаю почему, но у меня проверка чек-суммы никогда не сходилась    
    #if result[0]+result[1]+result[2] != result[3]:
    #    return 0

    res = (result[1] &amp;lt;&amp;lt; 8) + result[2]

    if result[0] == 0x42:
        print(&amp;quot;T={0}&amp;quot;.format(res * 0.0625 - 273.15))
        return 1
    elif result[0] == 0x50:
        print(&amp;quot;CO={0}&amp;quot;.format(res))
        return 2
    return 0
    
try:
    h = hid.device()
    h.open(0x04d9, 0xa052)

    # хз, не вникал
    h.set_nonblocking(1)

    # по идее это отправка некой magic_table которой шифруется ответ, но и без любой из этих строк работает
    #h.write(b'8\x00\x00\x00\x00\x00\x00\x00\x00')
    h.send_feature_report([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
    time.sleep(0.05)

    co = 1
    t = 1
    while co | t:
        d = h.read(8)
        if d:
            n = decode_co(d)
            if n == 1:
                t = 0
            elif n == 2:
                co = 0

    h.close()

except IOError as ex:
    print(ex)&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>