{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "timsa.ru: заметки с тегом driver",
    "_rss_description": "Моя записная книжка. Комментарии отключены из-за спама. Для вопросов используйте эту страничку",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/timsa.ru\/tags\/driver\/",
    "feed_url": "https:\/\/timsa.ru\/tags\/driver\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "timsa",
            "url": "https:\/\/timsa.ru\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "116",
            "url": "https:\/\/timsa.ru\/all\/podklyuchaem-dadget-co2-k-servaku\/",
            "title": "Подключаем Dadget CO2 к серваку",
            "content_html": "<ol start=\"1\">\n<li>Сначала сделаем чтобы любой пользователь мог обращаться к устройству<br \/>\nсоздаем \/etc\/udev\/rules.d\/10-co2mon.rules<br \/>\nс содержимым<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">ACTION==&quot;add|change&quot;, SUBSYSTEMS==&quot;usb&quot;, ATTRS{idVendor}==&quot;04d9&quot;, ATTRS{idProduct}==&quot;a052&quot;, MODE:=&quot;0666&quot;<\/code><\/pre><p>щелкаем<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">udevadm control --reload\r\nudevadm trigger<\/code><\/pre><p>проверяем что \/dev\/usb\/hiddev0 теперь crw-rw-rw-<\/p>\n<ol start=\"2\">\n<li>Подключаем библиотечку <s>PyUSB<\/s> hid. PyUSB глючное говно вызывающее странные эффекты, например пропадение устройства hiddev0.<br \/>\npip3 install hid (или hidapi уже не помню, это гуглится)<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Читаем (алгоритм расшифровки передрал с сишного проекта co2mod)<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/env python3\r\n\r\nimport hid\r\nimport time\r\n\r\ndef decode_co(data):\r\n    # кручу-верчу\r\n    data[0], data[2] = data[2], data[0]\r\n    data[1], data[4] = data[4], data[1]\r\n    data[3], data[7] = data[7], data[3]\r\n    data[5], data[6] = data[6], data[5]\r\n    \r\n    result = bytearray(8)\r\n\r\n    # всех обмануть хочу\r\n    result[7] = ((data[6] &lt;&lt; 5) &amp; 0xFF) | ((data[7] &gt;&gt; 3) &amp; 0xFF)\r\n    result[6] = ((data[5] &lt;&lt; 5) &amp; 0xFF) | ((data[6] &gt;&gt; 3) &amp; 0xFF)\r\n    result[5] = ((data[4] &lt;&lt; 5) &amp; 0xFF) | ((data[5] &gt;&gt; 3) &amp; 0xFF)\r\n    result[4] = ((data[3] &lt;&lt; 5) &amp; 0xFF) | ((data[4] &gt;&gt; 3) &amp; 0xFF)\r\n    result[3] = ((data[2] &lt;&lt; 5) &amp; 0xFF) | ((data[3] &gt;&gt; 3) &amp; 0xFF)\r\n    result[2] = ((data[1] &lt;&lt; 5) &amp; 0xFF) | ((data[2] &gt;&gt; 3) &amp; 0xFF)\r\n    result[1] = ((data[0] &lt;&lt; 5) &amp; 0xFF) | ((data[1] &gt;&gt; 3) &amp; 0xFF)\r\n    result[0] = ((data[7] &lt;&lt; 5) &amp; 0xFF) | ((data[0] &gt;&gt; 3) &amp; 0xFF)\r\n    \r\n    magic_word = b'Htemp99e'\r\n    for i in range(8):\r\n        r = ((magic_word[i] &lt;&lt; 4) &amp; 0xFF) | ((magic_word[i] &gt;&gt; 4) &amp; 0xFF)\r\n        if result[i] &lt; r:\r\n            result[i] = 0xFF - r + result[i]\r\n        else:\r\n            result[i] = result[i] - r\r\n\r\n    # не знаю почему, но у меня проверка чек-суммы никогда не сходилась    \r\n    #if result[0]+result[1]+result[2] != result[3]:\r\n    #    return 0\r\n\r\n    res = (result[1] &lt;&lt; 8) + result[2]\r\n\r\n    if result[0] == 0x42:\r\n        print(&quot;T={0}&quot;.format(res * 0.0625 - 273.15))\r\n        return 1\r\n    elif result[0] == 0x50:\r\n        print(&quot;CO={0}&quot;.format(res))\r\n        return 2\r\n    return 0\r\n    \r\ntry:\r\n    h = hid.device()\r\n    h.open(0x04d9, 0xa052)\r\n\r\n    # хз, не вникал\r\n    h.set_nonblocking(1)\r\n\r\n    # по идее это отправка некой magic_table которой шифруется ответ, но и без любой из этих строк работает\r\n    #h.write(b'8\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00')\r\n    h.send_feature_report([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])\r\n    time.sleep(0.05)\r\n\r\n    co = 1\r\n    t = 1\r\n    while co | t:\r\n        d = h.read(8)\r\n        if d:\r\n            n = decode_co(d)\r\n            if n == 1:\r\n                t = 0\r\n            elif n == 2:\r\n                co = 0\r\n\r\n    h.close()\r\n\r\nexcept IOError as ex:\r\n    print(ex)<\/code><\/pre>",
            "date_published": "2020-07-20T22:38:42+05:00",
            "date_modified": "2020-07-20T22:41:17+05:00",
            "tags": [
                "co2",
                "dadget",
                "driver",
                "linux",
                "python",
                "программирование"
            ],
            "_date_published_rfc2822": "Mon, 20 Jul 2020 22:38:42 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "116",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079)"
}