{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "timsa.ru: заметки с тегом python",
    "_rss_description": "Моя записная книжка. Комментарии отключены из-за спама. Для вопросов используйте эту страничку",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/timsa.ru\/tags\/python\/",
    "feed_url": "https:\/\/timsa.ru\/tags\/python\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "timsa",
            "url": "https:\/\/timsa.ru\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "232",
            "url": "https:\/\/timsa.ru\/all\/beacon\/",
            "title": "Beacon",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">import uasyncio as asyncio\r\nfrom machine import Pin,ADC,PWM,UART\r\nimport utime\r\nimport math\r\n\r\nuart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))\r\n#uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))\r\nuart.init(bits=8, parity=None, stop=1)\r\n\r\nasync def readuart():\r\n    while True:\r\n        if uart.any():\r\n            data = uart.read()\r\n            print(data)\r\n        await asyncio.sleep_ms(1000)\r\n\r\nasync def heartbeat():\r\n    temp_sensor = ADC(4)\r\n    while True:\r\n        current_time = utime.localtime()\r\n        hours = current_time[3]\r\n        minutes = current_time[4]\r\n        seconds = current_time[5]\r\n        temp = 27 - (temp_sensor.read_u16() * 3.3 \/ (65535) - 0.706)\/0.001721\r\n        #print(&quot;{:02d}:{:02d}:{:02d} t={:3.1f}&quot;.format(hours, minutes, seconds, temp))\r\n        uart.write(&quot;{:02d}:{:02d}:{:02d} t={:3.1f}&quot;.format(hours, minutes, seconds, temp))\r\n        await asyncio.sleep_ms(60000)\r\n\r\nasync def ledlight():\r\n    #led = Pin(25, Pin.OUT)\r\n    led = PWM(Pin(25, Pin.OUT))\r\n    led.freq(2048)\r\n    \r\n    start_value = 1\r\n    end_value = 65535\r\n    num_values = 100\r\n    growth_factor = (end_value \/ start_value) ** (1 \/ (num_values - 1))\r\n    decay_factor = (start_value \/ end_value) ** (1 \/ (num_values - 1))\r\n    \r\n    while True:\r\n        for i in range(num_values):\r\n            value = start_value * (growth_factor ** i)\r\n            led.duty_u16(int(value))\r\n            await asyncio.sleep_ms(int(500\/num_values))\r\n            \r\n        for i in range(num_values):\r\n            value = end_value * (decay_factor ** i)\r\n            led.duty_u16(int(value))\r\n            await asyncio.sleep_ms(int(500\/num_values))\r\n            \r\nasync def main():\r\n    loop  =  asyncio.get_event_loop ()\r\n    loop.create_task(heartbeat())\r\n    loop.create_task(ledlight())\r\n    loop.create_task(readuart())\r\n    loop.run_forever ()\r\n\r\nif __name__ == '__main__':\r\n    asyncio.run(main())<\/code><\/pre>",
            "date_published": "2025-06-06T17:26:15+05:00",
            "date_modified": "2025-06-10T12:44:27+05:00",
            "tags": [
                "python",
                "raspberry"
            ],
            "_date_published_rfc2822": "Fri, 06 Jun 2025 17:26:15 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "232",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "228",
            "url": "https:\/\/timsa.ru\/all\/waveshare-sx1262-lora-raspberry-pi-pico\/",
            "title": "Waveshare SX1262 LoRa + Raspberry Pi Pico",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/timsa.ru\/pictures\/image-1.png\" width=\"960\" height=\"698\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/timsa.ru\/pictures\/image-2.png\" width=\"960\" height=\"530\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/timsa.ru\/pictures\/image-3.png\" width=\"960\" height=\"291\" alt=\"\" \/>\n<\/div>\n<ol start=\"1\">\n<li>Raspberry Pi Pico header<\/li>\n<li>Status indicators<br \/>\nPWR: power indicator<br \/>\nCHG: recharge indicator<\/li>\n<li>RF switch control<br \/>\nA: controlled by high level<br \/>\nB: controlled by GPIO22<\/li>\n<\/ol>\n<p>MCP73831 recharge IC<br \/>\nSX1262 module<br \/>\nIPEX 1 antenna connector<br \/>\nPH1.25 battery header<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/77668385\/waveshare-sx1262-lorawan-hat\">https:\/\/stackoverflow.com\/questions\/77668385\/waveshare-sx1262-lorawan-hat<\/a><br \/>\n<a href=\"https:\/\/github.com\/maximecongi\/LoRaRF-Python-custom\">https:\/\/github.com\/maximecongi\/LoRaRF-Python-custom<\/a><br \/>\n<a href=\"https:\/\/github.com\/chandrawi\/LoRaRF-Python\/tree\/main\/examples\/SX126x\">https:\/\/github.com\/chandrawi\/LoRaRF-Python\/tree\/main\/examples\/SX126x<\/a><br \/>\n<a href=\"https:\/\/github.com\/ehong-tl\/micropySX126X\/tree\/master\/example\">https:\/\/github.com\/ehong-tl\/micropySX126X\/tree\/master\/example<\/a><br \/>\n<a href=\"https:\/\/microkontroller.ru\/raspberry-pi-projects\/podklyuchenie-modulya-lora-k-raspberry-pi-i-odnorangovaya-set-s-arduino\/\">https:\/\/microkontroller.ru\/raspberry-pi-projects\/podklyuchenie-modulya-lora-k-raspberry-pi-i-odnorangovaya-set-s-arduino\/<\/a><br \/>\n<a href=\"https:\/\/wiki.openelab.io\/raspbeery-pi\/waveshare-sx1262-lora-hat-for-raspberry-uart\">https:\/\/wiki.openelab.io\/raspbeery-pi\/waveshare-sx1262-lora-hat-for-raspberry-uart<\/a><\/p>\n",
            "date_published": "2025-05-06T08:24:56+05:00",
            "date_modified": "2025-05-07T11:18:35+05:00",
            "tags": [
                "python",
                "электроника"
            ],
            "image": "https:\/\/timsa.ru\/pictures\/image-1.png",
            "_date_published_rfc2822": "Tue, 06 May 2025 08:24:56 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "228",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/timsa.ru\/pictures\/image-1.png",
                    "https:\/\/timsa.ru\/pictures\/image-2.png",
                    "https:\/\/timsa.ru\/pictures\/image-3.png"
                ]
            }
        },
        {
            "id": "107",
            "url": "https:\/\/timsa.ru\/all\/wow\/",
            "title": "Отгадыватель кроссвордов",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/env python3\r\n\r\nimport sys\r\nfrom itertools import permutations\r\nimport re\r\nimport requests\r\nfrom bs4 import BeautifulSoup\r\nfrom fake_useragent import UserAgent\r\nimport os.path\r\n\r\nif len(sys.argv) &lt; 4:\r\n  print(&quot;Usage: \\nwords.py yandex|google|filename|none алфавит маска\\n&quot;)\r\n  sys.exit()\r\n\r\nsearch  = sys.argv[1]\r\nalphabet = sys.argv[2]\r\npattern = sys.argv[3]\r\n\r\nyandex = 'https:\/\/yandex.ru\/search\/?noreask=1&amp;text='\r\ngoogle = 'https:\/\/www.google.ru\/search?ie=UTF-8&amp;hl=ru&amp;spell=0&amp;nfpr=1&amp;q='\r\n\r\nua = UserAgent()\r\nmyheaders = {'User-Agent': str(ua.random), 'referer': 'https:\/\/www.google.ru'}\r\n\r\n# все варианты перестановок\r\nallwords = permutations(alphabet, len(pattern))\r\n\r\n# выкидываем дубликаты\r\nwords = list(set(allwords))\r\n\r\n# склеиваем 2-мерный список в одномерный\r\nwords2 = []\r\nfor word in words:\r\n  str = ''.join(word)\r\n  words2.append(str)\r\n\r\n# проходим регекспом\r\nobj = re.compile(pattern)\r\nwords = list(filter(lambda str: obj.search(str), words2))\r\n\r\nprint('Всего вариантов %d' % len(words))\r\n\r\noutput = []\r\nwordlist = []\r\n\r\nif os.path.exists(search):\r\n  f = open(search, 'r', encoding = 'utf-8')\r\n  wordlist = [line.strip() for line in f]\r\n  f.close()\r\n  print('Размер словаря %d' % len(wordlist))\r\n\r\nfor word in words:\r\n  if search == 'google':\r\n    r = requests.get(google + word, headers=myheaders)\r\n    r.encoding = 'utf-8'\r\n    soup = BeautifulSoup(r.text, 'html5lib')\r\n    stat = soup.find('div', id='resultStats')\r\n    if stat is not None:\r\n      qty = re.search('Результатов:\\sпримерно\\s(.*)\\s\\(\\d+,\\d+\\sсек.\\)', stat.text)\r\n      x = qty.group(1)\r\n      x = x.split()\r\n      x = ''.join(x)\r\n      output.append([word, int(x)])\r\n      print(&quot;%s - %s&quot; % (word, x))\r\n    else:\r\n      output.append([word, 0])\r\n\r\n  elif search == 'yandex':\r\n    r = requests.get(yandex + word, headers=myheaders)\r\n    r.encoding = 'utf-8'\r\n    soup = BeautifulSoup(r.text, 'html5lib')\r\n    stat = soup.find('div', {'class': 'serp-adv__found'})\r\n    if stat is not None:\r\n      qty = re.search('Нашлось\\s(.*)\\sрезультатов', stat.text)\r\n      x = qty.group(1)\r\n      output.append([word, x])\r\n      print(&quot;%s - %s&quot; % (word, x))\r\n    else:\r\n      output.append([word, 0])\r\n      \r\n  elif os.path.exists(search):\r\n    if word in wordlist:\r\n      output.append([word, 0])\r\n    \r\n  else:\r\n    output.append([word, 0])\r\n\r\nprint('Отфильтрованно с помощью %s' % search)\r\n\r\noutput.sort(key=lambda x: x[1], reverse=True)\r\n\r\nfor str in output:\r\n  print(str[0])<\/code><\/pre>",
            "date_published": "2020-07-21T13:44:14+05:00",
            "date_modified": "2020-07-21T13:44:07+05:00",
            "tags": [
                "python",
                "программирование"
            ],
            "_date_published_rfc2822": "Tue, 21 Jul 2020 13:44:14 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "107",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "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)"
}