Π£ΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ Π½Π° python: Π£ΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ своими Ρ€ΡƒΠΊΠ°ΠΌΠΈ + Python / Π₯Π°Π±Ρ€

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Bubot β€” ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΈΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π½Π° Python 3 для программирования Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠ² ΠΈ домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ своСго Ρ€ΠΎΠ±ΠΎΡ‚Π°, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ свСтом ΠΈ ΠΊΠ»ΠΈΠΌΠ°Ρ‚ΠΎΠΌ Π΄ΠΎΠΌΠ°. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ Π½Π°Ρ‡Π°Π» ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ возмоТности. Для сСбя я Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ» всС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹: систСмы Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ΄ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ выполняСтся Π² ΠΎΠ΄Π½ΠΎΠΌ Π³Π»Π°Π²Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ (arduino, lego ΠΈ Ρ‚.ΠΏ.) ΠΈ систСмы состоящиС ΠΈΠ· ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… процСссов ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой сообщСниями.

Π˜Π½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Π» Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ максимально простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с друТСствСнным ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ интСрфСйсом. Из Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных прСдставитСлСй этого «ΡΠ΅ΠΌΠ΅ΠΉΡΡ‚Π²Π°» ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΈΡΡŒΒ Microsoft Robotics StudioΒ ΠΈΒ ROS. Но ΠΊ соТалСнию, Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΈΡ… ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΆΠ΅Π»Π΅Π·Ρƒ вСсьма Π½Π΅ просто, Π΄Π° ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π½ΠΈΡ… с нуля Ρ‚Π°ΠΊ ΠΆΠ΅ вСсьма Π½Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°. Π’ ΠΈΡ‚ΠΎΠ³Π΅ принял Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ сам, Π½ΠΎ «ΠΊΠΎΠ΄ΠΈΡ‚ΡŒ» Π½Π° C ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ, Π”ΡƒΡˆΠ° просила Ρ‡Π΅Π³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΠΏΠΎΠ»Π΅Π³Ρ‡Π΅. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹Π±Ρ€Π°Π» Python. А учитывая, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΌΠΈΠΌΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Π° ΠΈ «ΡƒΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°» Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ Π½Π°Ρ‡Π°Π»ΠΎ Π»Π΅Π·Ρ‚ΡŒ ΠΊΡƒΡ‡Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ΄Π΅ΠΉ, Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ» сразу ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСбольшой Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ основной ΡƒΠΏΠΎΡ€ Π±Ρ‹Π» Π±Ρ‹ сдСлан Π½Π° простоту Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠΈ. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Bubot строит ΡΠ΅Ρ‚ΡŒ ΠΈΠ· процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ асинхронно ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ΅Ρ‚ΡŒ ΠΈΠ· Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой.

Π‘Π΅Ρ‚ΡŒ процСссов строится Π½Π° Π±Π°Π·Π΅ стандартного Python модуля multiprocessing. БистСма ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈΒ Redis.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Bubot ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный Π²Π΅Π±-сСрвСр Π²Π΅Π±-сСрвСр Tornado, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояниС, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠΌ, Π½Π° Ρ…ΠΎΠ΄Ρƒ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²Π°Ρ‚ΡŒ) Ρ€ΠΎΠ±ΠΎΡ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ закладываСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€ΠΎΠ±ΠΎΡ‚Π°ΠΌΠΈ.

Bubot Π½Π΅ являСтся систСмой Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, хотя Bubot Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π˜Π·ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π½ΠΎΠ²ΠΎΠ΅ всСгда ΠΏΡ€ΠΎΡ‰Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ, это ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π΄ΠΈΠΎΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ ΠΈΠ³Ρ€ΡƒΡˆΠΊΡƒ Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅Π±-интСрфСйса Ρ‡Π΅Ρ€Π΅Π· wi-fi ΠΈΠ»ΠΈ 3G.

Для этого Π½Π°ΠΌ понадобится любая китайская радиоуправляСмая машинка ΠΈ любой ΠΌΠΈΠ½ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Python 3. Π’ качСствС ΠΏΠΎΠ΄ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΡ€ΠΎΠ»ΠΈΠΊΠ° Π±Ρ‹Π» ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых доступных — raspberry pi b+.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ практичСски любая радиоуправляСмая машинка — это Π΄Π²Π° ΠΌΠΎΡ‚ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π°Π΄ΠΈΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Нам ΠΎΡ‚ Π½Π΅Ρ‘ Π½Π°Π΄ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΡ‚ΠΎΡ€Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ сама машинка Π±Ρ‹Π»Π° подходящСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° для размСщСния всСй элСктроники.

Для Π½Π°Ρ‡Π°Π»Π° упростим Π·Π°Π΄Π°Ρ‡Ρƒ — наша машинка Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ дСйствия: Π΅Ρ…Π°Ρ‚ΡŒ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄, ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΡ‚ΠΎΡ€Ρ‹ ΠΊ raspberry
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ физичСскиС устройства
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π± интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ основного ΠΈΠ»ΠΈ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½ΠΎΠ³ΠΎ двигатСля -100% / 0% / 100%.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ способом ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΡ‚ΠΎΡ€ΠΎΠ² ΠΊ Raspberry Pi Π±ΡƒΠ΄Π΅Ρ‚ использованиС Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, Π²Ρ‹Π±ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠΉ мощности ΠΌΠΎΡ‚ΠΎΡ€ΠΎΠ². Π― Π²Ρ‹Π±Ρ€Π°Π» с запасом Π½Π° Π±Π°Π·Π΅ L298N. Π‘Ρ‚Ρ€ΠΎΠΊΠ° для поиска Π½Π° aliexpress «L298N motor driver board», обойдСтся Π’Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² $3 с доставкой.

Π’Π°ΠΊΠΆΠ΅, для питания raspberry, Π’Π°ΠΌ понадобится ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ напряТСния. Π― взял Π½Π° Π±Π°Π·Π΅ LM2596. Π‘Ρ‚Ρ€ΠΎΠΊΠ° для поиска Π½Π° aliexpress «DC-DC LM2596», обойдСтся Π’Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² $1 с доставкой.

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, для Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, достаточно Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ GPIO.

Π’ цСлях упрощСния ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΡƒΡΡ‚ΡŒ Ρƒ нас ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ нСпосрСдствСнно Π½Π° ΠΌΠΎΡ‚ΠΎΡ€Ρ‹.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π΄Π²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… (с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния) ΠΌΠΎΡ‚ΠΎΡ€Π°, Ρ‚ΠΎ Π½Π°ΠΌ потрСбуСтся ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ВсС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Buject, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². ΠžΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ основной бСсконСчный Ρ†ΠΈΠΊΠ», ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ событий. ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π² Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ находятся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ buject. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²:

  • [Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля].py — Π»ΠΎΠ³ΠΈΠΊΠ° модуля
  • [Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля].json — описаниС модуля. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² модуля, ΠΈΡ… значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… статусов, описаниС сообщСний Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΈ список сообщСний Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ подписан.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ модуля для Π½Π°ΡˆΠΈΡ… ΠΌΠΎΡ‚ΠΎΡ€ΠΎΠ² \buject\MotorTest.py:

import json
from buject.Buject import Buject
import RPi.GPIO as GPIO
class MotorTest(Buject): # сСрвомотор Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи
def __init__(self, user_config=None):
super(MotorTest, self).__init__(user_config)
# ΠœΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΏΠ΅Ρ€Π΅Π΄ запуском основго Ρ†ΠΈΠΊΠ»Π°
# выставляСм Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ GPIO
def on_ready(self):
GPIO.setmode(self.param["mode"])
GPIO.setwarnings(False)
# Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΏΡ€ΠΈ получСния сообщСния, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
# пСрСдавая Π΅ΠΌΡƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° всС сообщСниС
# Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ запрос
# set_power Π½Π° установку мощности ΠΌΠΎΡ‚ΠΎΡ€Π° Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…
def incoming_request_set_power(self, message):
data = json. loads(message['data'])
if data['param']['value'] > 0: # Ρ…ΠΎΡ‚ΠΈΠΌ Π΅Ρ…Π°Ρ‚ΡŒ Π²ΠΏΠ΅Ρ€Π΅Π΄
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 1)
self.status['action'] = "forward"
elif data['param']['value'] == 0:
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0)
self.status['action'] = "stopped"
else:
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 1)
self.status['action'] = "backward {0}%".format(self.status["power"])
# Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС, Ρ‡Ρ‚ΠΎ всС ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ
if self.param['debug'] > 1:
self.log('Buject "{0}" {1}'.format(self.param['name'], self.status['action']))

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Π΄ΡƒΠΌΠ°ΡŽ излишни. ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ запрос, Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π° ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΡ‚ΠΎΡ€Π°, Ссли ΠΎΠ½Π° большС нуля Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΌΠΎΡ‚ΠΎΡ€Ρƒ Π΅Ρ…Π°Ρ‚ΡŒ Π²ΠΏΠ΅Ρ€Π΅Π΄, мСньшС — Π½Π°Π·Π°Π΄, Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ — стоим.

БСсконСчный Ρ†ΠΈΠΊΠ» Π² Π΄Π°Π½Π½ΠΎΠΌ случаС задСйствован Π½Π΅ Π±Ρ‹Π». Π’ случаС Π΅Π³ΠΎ наличия достаточно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ main_loop().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ описания модуля для Π½Π°ΡˆΠΈΡ… ΠΌΠΎΡ‚ΠΎΡ€ΠΎΠ² \buject\Motor.json

{
"param": {
"name": {
"value": "MotorTest",
"description": "Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСрвиса ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ"
},
"parent": {
"value": "Buject",
"description": "Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ модуля, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹"
},
"buject": {
"value": "MotorTest",
"description": "Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля = ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°"
},
"GPIO_forward": {
"value": 0,
"description": "ΠΊΠ°Π½Π°Π» GPIO для двиТСния Π²ΠΏΠ΅Ρ€Π΅Π΄"
},
"GPIO_backward": {
"value": 0,
"description": "канал GPIO для двиТСния назад"
},
"GPIO_mode": {
"value": 11,
"description": "value for GPIO.setmode GPIO.BOARD=10 GPIO.BCM=11"
}
},
"incoming_request": {
"set_power": {
"name": "set_power",
"description": "установка мощности ΠΌΠΎΡ‚ΠΎΡ€Π°",
"param": {
"value": {
"description": "ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΡ‚ΠΎΡ€Π° Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…",
"type": "int"
} } } } }

Π Π°Π·Π΄Π΅Π» param содСрТит список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для запуска ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ модуля. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля, ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Buject. ПослСдниС ΡΠ²Π»ΡΡŽΡ‚ΡΡ спСцифичными Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для этого модуля, ΠΈΡ… количСство ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π’Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Π΅Ρ‚Π΅ сами Π² зависимости ΠΎΡ‚ потрСбностСй. GPIO_mode Π·Π°Π΄Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ адрСсации GPIO ΠΈ Π² дальнСйшСм ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ для GPIO_forward ΠΈ GPIO_backward Π½Π΅Ρ‚ смысла Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚.ΠΊ. ΠΎΠ½ΠΈ зависят ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΡ‚ΠΎΡ€ ΠΈ ΠΌΡ‹ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ дальшС Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… запуска этого модуля.

Π’Π°ΠΊΠΆΠ΅ описаниС модуля ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ΅ΠΊΡ†ΠΈΡŽ status — Π³Π΄Π΅ описаны всС рассчитываСмыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ — ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС модуля. Π’ нашСм ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… статусов, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ссли Π’Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π² ΠΊΠΎΠ΄Π΅ самого модуля ΠΌΡ‹ измСняСм статус ‘action’, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² описании Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ модуля Buject.

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² сообщСний

  • incoming_request — список запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.
  • outgoing_request — список запросов Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя сСрвиса ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ запросы ΠΈ имя запроса.
  • incoming_event — список подписки Π½Π° события Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя сСрвиса ΠΈ имя события.
  • outgoing_event — список событий, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.
  • incoming_response — слуТСбный Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСкларируСтся Π½Π° исходящСм запросС. Π“ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСрвис Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ асинхронного ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° запрос.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€ΠΎΠ±ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство Π²Π΅Π± интСрфСйсов. Π’ нашСм случаС, для управлСния Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠΌ, Π½Π°ΠΌ достаточно ΠΎΠ΄Π½ΠΎΠ³ΠΎ – Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ 4 ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΆΠ°Ρ‚ΠΈΠΈ Π΅Ρ‘ ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒ.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ интСрфСйсы хранятся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ui. КаТдая страница ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса описываСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΈ состоит ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΠ· 2 Ρ„Π°ΠΉΠ»ΠΎΠ²:

  • [Имя страницы].html — Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ° страницы.
  • [Имя страницы].json — описаниС интСрфСйса. КаТдая страница (сСссия) для Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° являСтся ΠΏΠΎ сути ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ сСрвисом, Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ содСрТится описаниС событий Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ данная страница подписана, Π° Ρ‚Π°ΠΊΠΆΠ΅ сообщСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚.
  • [Имя страницы].py — (Π½Π΅ обязатСлСн) ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Π² нашСм случаС Π½Π΅ пригодится.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡΡ‚ΡŒ, для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ восприятия, Π΅Ρ‰Ρ‘ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ упростим. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рассмотрим Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ.

Π˜Ρ‚Π°ΠΊ, создаСм Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ui ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ scout_easy ΠΈ Π² Π½Π΅ΠΌ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° scout_easy.html ΠΈ scout_easy.json ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ содСрТания (ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ тСксту).

\ui\scout_easy\scout_easy.html

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° div id=console, Ссли ΠΎΠ½ присутствуСт, Ρ‚ΠΎ Π² Π½Π΅Π³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ всС ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ сообщСния, Π² Ρ‚.Ρ‡. происходящиС Π½Π° сторонС сСрвСра ошибки ΠΊΠΎΠ΄Π°.

bubot_socket.js — Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницС ui, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° установку соСдинСния с сСрвСром ΠΈ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями.

Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ с сСрвСром происходит Ρ‡Π΅Ρ€Π΅Π· web socket, ΠΌΠ΅Ρ‚ΠΎΠ΄ bubot_send_message([Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сообщСния], [ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сообщСния]) ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сообщСний Π½Π° сСрвСр. На сСрвСрС ΠΏΡ€ΠΈ поступлСнии сообщСния вызываСтся ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сообщСния. Π’ нашСм случаС вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ запрос set_move_motor_power, имя сСрвиса получатСля сообщСния Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π±Π΅Ρ€Π΅Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° описания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, названия этих сСрвисов опрСдСляСтся Π² Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΈ описании Ρ€ΠΎΠ±ΠΎΡ‚Π°.

\ui\scout_easy\scout_easy.json

{
"incoming_request": {
"console": {
"time": {},
"message": {}
}
},
"outgoing_request": {
"set_move_motor_power": {
"name": "set_power",
"buject": "move_motor",
"description": "ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° установку мощности основного ΠΌΠΎΡ‚ΠΎΡ€Π°",
"param": {
"value": {
"description": "ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΡ‚ΠΎΡ€Π° Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…, Π²ΠΏΠ΅Ρ€Π΅Π΄ > 0, Π½Π°Π·Π°Π΄  0, Π²Π»Π΅Π²ΠΎ 

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ всС части Ρ€ΠΎΠ±ΠΎΡ‚Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ΅Π½ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» с описаниСм самого Ρ€ΠΎΠ±ΠΎΡ‚Π°.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ config хранятся описания всСх Π’Π°ΡˆΠΈΡ… Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΠ². Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ описаниС ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€Π° — Π½ΠΎ ΠΎΠ± этом ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΎ bubot: scout.

Π˜Ρ‚Π°ΠΊ, для нашСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Π° описаниС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

\config\scout_easy.json

{
"param": {
"name": {
"value": "scout_easy"
}
},
"depend_buject": { # Ρ€Π°Π·Π΄Π΅Π» содСрТит список сСрвисов ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит Ρ€ΠΎΠ±ΠΎΡ‚
"move_motor": { # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСрвиса, Π½ΠΈΠΆΠ΅ присваиваСм значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅
"param": {
"buject": { # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ сСрвис
"value": "MotorTest"
},
"name": { # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСрвиса
"value": "move_motor"
},
"GPIO_forward": { # Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ фактичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΌΠΎΡ‚ΠΎΡ€
"value": 20
},
"GPIO_reward": {
"value": 21
}
}
},
"rotate_motor": { # Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ для Ρ€ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ ΠΌΠΎΡ‚ΠΎΡ€Π°
"param": {
"buject": {
"value": "MotorTest"
},
"name": {
"value": "rotate_motor"
},
"GPIO_forward": {
"value": 13
},
"GPIO_reward": {
"value": 19
} } } } }

Богласно Π΄Π°Π½Π½ΠΎΠΌΡƒ описанию, Bubot ΠΏΡ€ΠΈ стартС создаст Π΄Π²Π° экзСмпляра модуля MotorTest с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ: ΠΎΠ΄ΠΈΠ½ для основного ΠΌΠΎΡ‚ΠΎΡ€Π° — move_motor, Π΄Ρ€ΡƒΠ³ΠΎΠΉ для Ρ€ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ ΠΌΠΎΡ‚ΠΎΡ€Π° -rotate_motor ΠΈ запустит ΠΈΠ· Π² качСствС процСссов. Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, способ адрСсации GPIO ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, Ρ‚.ΠΊ. нас устраиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π²ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ GPIO_forward ΠΈ GPIO_backward ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² соотвСтствии со схСмой ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΡ‚ΠΎΡ€ΠΎΠ².

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас совсСм всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ. МоТно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ.

python3 StartBubot scout_easy

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс http://localhost/ui/scout_easy ΠΈ ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС Вас попросят ввСсти Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ — Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π»ΡŽΠ±Ρ‹Π΅ значСния, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€Π°Π²Π° доступа ΠΊ систСмС Π½Π΅ установлСны.

Если ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ ΠΌΠ°ΡˆΠΈΠ½ΠΊΡƒ дальшС, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг это Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΎΠ±ΠΎΡ€ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄Π°, Π·Π°ΠΌΠ΅Π½Π° Ρ€ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ ΠΌΠΎΡ‚ΠΎΡ€Π° Π½Π° сСрву, установка ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΎΠ² Π½Π° ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ, синтСзатора Ρ€Π΅Ρ‡ΠΈ, распознаваниС голосовых ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Ρ‚.Π΄. Но это ΡƒΠΆΠ΅ совсСм другая история.

Home Assistant. ОбновлСниС Python — Π£ΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ

Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Home Assistant, Ρ‚ΠΎ послС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ обновлСния ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° появившССся ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΒ Β«Support for the running Python version 3. 7.3 is deprecated and will be removed in the first release after December 7, 2020. Please upgrade Python to 3.8.0 or higherΒ».

Π’ стандартных систСмных рСпозиториях ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ содСрТатся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ вСрсии ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π° Π½Π΅ самыС свСТиС ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅. И ΠΏΠΎ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π½Π° сСрСдину января 2021 Π³ΠΎΠ΄Π° Python Π² рСпозиториях Debian ΠΈ Ubuntu Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡΠΏΠ΅ΡˆΠ°Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΄ΠΎ вСрсии 3.8.x.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ СдинствСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π½Π°Π·ΠΎΠΉΠ»ΠΈΠ²ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ сСбя ΠΎΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ грядущих ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Home Assistant β€” это ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Python Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ собрав Π΅Π΅ ΠΈΠ· исходников.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π±ΡƒΠ΄Ρƒ ΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ:

  • Π£ вас уТС установлСн Home Assistant
  • Он установлСн Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Python
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опСрационнная систСма Π½Π° Π±Π°Π·Π΅ Debian ΠΈΠ»ΠΈ Ubuntu

Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΈΠ»ΠΈ дистрибутивом Hass.io, Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Π°ΠΌ Π½Π΅ придСтся.

ОбновлСниС Python

На Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ


ΠŸΡ€ΠΎΡ†Π΅ΡΡ обновлСния описан Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ вСрсии Python 3.9.1. На страницС Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Python всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ свСТСго Ρ€Π΅Π»ΠΈΠ·Π° ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ссылки Π½Π° скачиваниС ΠΈ распаковку Π°Ρ€Ρ…ΠΈΠ²Π° Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ….

Для Π½Π°Ρ‡Π°Π»Π° остановим Home Assistant:

sudo systemctl stop [email protected]

Установим Π½ΡƒΠΆΠ½Ρ‹Π΅ для сборки ΠΈΠ· исходников ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹:

sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libxslt-dev libxml2-dev libjpeg-dev zlib1g-dev

Π‘ΠΊΠ°Ρ‡Π°Π΅ΠΌ ΠΈ распакуСм Π°Ρ€Ρ…ΠΈΠ² с Python 3.9.1:

wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz
tar xzvf Python-3.9.1.tgz
cd Python-3.9.1

Π‘ΠΎΠ±Π΅Ρ€Π΅ΠΌ Π΅Π³ΠΎ ΠΈΠ· исходников ΠΈ запустим установку:

./configure --enable-optimizations
make -j 4
sudo make install

ΠŸΡ€ΠΎΡ†Π΅ΡΡ сборки Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 12 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π°Β Raspberry Pi 4, поэтому придСтся Π·Π°ΠΏΠ°ΡΡ‚ΠΈΡΡŒ Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ΠΌ.

Β 

Β 

Β 

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ установки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Python Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ обновился ΠΏΡƒΡ‚Π΅ΠΌ выполнСния Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

python3 --version
pip3 --version

И Ссли Π² консоли появится Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹, Ρ‚ΠΎ процСсс обновлСния ΠΏΡ€ΠΎΡˆΠ΅Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip:

sudo /srv/homeassistant/bin/python3.9 -m pip install --upgrade pip
sudo python3.9 -m pip install --upgrade pip

Π’ случаС Ссли послС обновлСния Python ΠΏΡ€ΠΈ запускС Home Assistant появится ошибка с Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libffi.so.7 ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ симлинк с libffi.so.7 Π½Π° Π½Π΅Π΅:

sudo ln -s /usr/lib/arm-linux-gnueabihf/libffi.so.6 /usr/lib/arm-linux-gnueabihf/libffi.so.7

Если симлинк Π½Π΅ создаСтся, Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Π² вашСй систСмС libffi.so.6 находится ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ. НайдитС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· поиск ΠΏΠΎ названиям Ρ„Π°ΠΉΠ»ΠΎΠ²:

find /usr/lib -name "libffi.so*"

ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Home Assistant

Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСустановим Home Assistant. Для этого сохраним Π² Ρ„Π°ΠΉΠ» список ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Python:

cd /home/homeassistant/
sudo  -u homeassistant -H -s
source /srv/homeassistant/bin/activate
pip3 freeze –local > requirements.txt
deactivate
exit

Π£Π΄Π°Π»ΠΈΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с установлСнным Home Assistant ΠΈ создадим Π΅Π΅ Π·Π°Π½ΠΎΠ²ΠΎ:

sudo rm -r /srv/homeassistant
sudo mkdir /srv/homeassistant
sudo chown homeassistant:homeassistant /srv/homeassistant

Запустим процСсс установки ΠΏΠΎ сохранСнному Ρ€Π°Π½Π΅Π΅ списку ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

sudo -u homeassistant -H -s
cd /srv/homeassistant
python3.9 -m venv .
source /srv/homeassistant/bin/activate
pip3 install wheel
pip3 install -r /home/homeassistant/requirements.txt

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, пСрСзапустим сСрвис Home Assistant:

sudo systemctl restart home-assistant@homeassistant

На этом процСсс обновлСния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ послС пСрСзапуска ΠΈΠ· ΠΏΠ°Π½Π΅Π»ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΡ‡Π΅Π·Π½ΡƒΡ‚ΡŒ сообщСниС ΠΎ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ вСрсии Python.

Β 

(c) Dmitry’s notes https://dmitrysnotes.ru/home-assistant-obnovlenie-python

smarthomeconnect Β· PyPI

Smart Home Connect (SHC) β€” это Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° срСда домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Python, наряду с Home Assistant, SmartHome.py, SmartHomeNG ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.
Π•Π³ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ устройств Β«ΡƒΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°Β» ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌ связи, прСдоставлСниС срСдств для создания ΠΏΡ€Π°Π²ΠΈΠ»/скриптов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π²Π΅Π±-интСрфСйса для управлСния устройствами Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… срСд домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, SHC ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ основан Π½Π° асинхронных сопрограммах Python (asyncio) ΠΈ настраиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ чистых сцСнариСв Python, Π° Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² YAML ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹Ρ… инструмСнтов Π²Π΅Π±-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΈ.
Π•Π³ΠΎ конфигурация основана Π½Π° создании экзСмпляра ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ состояния, ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Π΅ адрСса KNX ΠΈ Ρ‚. Π΄.) ΠΈ связываниС ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простых шаблонов чтСния/подписки.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это довольно простоС, Π½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΡ‰Π½ΠΎΠ΅ срСдство, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Π»Π΅Ρ‚Ρƒ, выраТСния для вычислСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий Π±Π΅Π· сохранСния состояния ΠΈ Ρ‚. Π΄.
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… концСпциях SHC Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π₯арактСристики

  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹
    • Π¨ΠΈΠ½Π° KNX Ρ‡Π΅Ρ€Π΅Π· KNXD
    • DMX (Ρ‡Π΅Ρ€Π΅Π· Enttec DMX USB Pro ΠΈ совмСстимыС интСрфСйсы)
    • HTTP/REST API + API Π²Π΅Π±-сокСта
    • ΠšΠ»ΠΈΠ΅Π½Ρ‚ SHC (ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ экзСмпляру SHC Ρ‡Π΅Ρ€Π΅Π· API Π²Π΅Π±-сокСта)
    • MIDI (особСнно для Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… MIDI-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ²)
    • МКВВ
    • Tasmota (Π² настоящСС врСмя: Ρ€Π΅Π»Π΅, подсвСтка RGB+CCW, ИК-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ мощности; Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠΎ запросу)
    • ΠŸΡƒΠ»ΡŒΡΠ°ΡƒΠ΄ΠΈΠΎ
    • Telegram-Π±ΠΎΡ‚
  • Π’Π΅Π±-интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° основС Π²Π΅Π±-сокСтов

  • (с использованиСм aiohttp , Jinja2 ΠΈ Semantic UI )
    • Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹: ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ тСкста, Π²Π²ΠΎΠ΄ тСкста/чисСл, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ списки, изобраТСния с Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ, Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ‚. Π΄., …
  • конфигурация Ρ‚ΠΎΡ‡Π΅ΠΊ Π΄Π°Π½Π½Ρ‹Ρ…/ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€Π°Π²ΠΈΠ» Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² простом Python
    • полная ΠΌΠΎΡ‰ΡŒ Python + ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятноС прСдставлСниС ΠΈ взаимосвязь Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… интСрфСйсов
    • систСма ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠ°Ρ систСма прСобразования Ρ‚ΠΈΠΏΠΎΠ²
    • ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· выраТСния Python
  • хронологичСских ΠΈ пСриодичСских Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² для запуска ΠΏΡ€Π°Π²ΠΈΠ»
  • Logging/Persistence (ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π² API)
    • Π² MySQL

ДороТная ΠΊΠ°Ρ€Ρ‚Π°

  • API стабилизации вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°
  • Π’Ρ…ΠΎΠ΄ Π² Influx-DB
  • Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Π±-Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹
    • Π”Π°Ρ‚Ρ‡ΠΈΠΊΠΈ
    • врСмСнная шкала / «ΠΏΠΎΠ»ΠΎΡΠ°Ρ‚Ρ‹Π΅» Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

  1. (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Python ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ чистыми:

     python3 -m virtualenv -p python3 venv
    . venv/bin/Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
     

    Π£Π·Π½Π°ΠΉΡ‚Π΅ большС ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… срСдах Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.

  2. УстановитС дистрибутив smarthomeconnect Python ΠΈΠ· PyPI:

     pip3 ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ smarthomeconnect
     

    Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ установка smarthomeconnect ΠΈ зависимостСй Π΅Π³ΠΎ основных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
    Для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… интСрфСйсных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ зависимости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΒ» Π² pip/setuptool.
    ΠŸΠΎΠ»Π½Ρ‹ΠΉ список см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Зависимости» этого Ρ„Π°ΠΉΠ»Π° ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свСдСний.
    Если Π²Ρ‹ устанавливаСтС SHC ΠΈΠ· исходного дистрибутива (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Β«Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎΒ» ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ Β«wheelΒ» ΠΈΠ· PyPI), Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ установлСнныС Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ NodeJS ΠΈ npm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ рСсурсов Π²Π΅Π±-интСрфСйса. Π² процСссС сборки ΠΏΠ°ΠΊΠ΅Ρ‚Π° Python.

  3. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ скрипт Python (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ my_home_automation.py ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ запускаСт Smart Home Connect:

     #!/usr/bin/env python3
    ΠΈΠΌΠΏΠΎΡ€Ρ‚ шк
    # TODO Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ интСрфСйсы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
    шк. основной()
     

    ΠŸΡ€ΠΈ запускС этого скрипта ( python3 my_home_automation.py ) SHC Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ оТидания, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π΅Π³ΠΎ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ctrl+C).
    Π‘ΠΌ. ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с Π²Π΅Π±-интСрфСйсом ΠΈ интСрфСйсом KNX.

  4. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с основными концСпциями SHC ΠΈ доступными интСрфСйсами Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ SHC.
    Π Π°ΡΡˆΠΈΡ€ΡŒΡ‚Π΅ свой сцСнарий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ интСрфСйсы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ логичСскиС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΠΈΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
ΠΈΠΌΠΏΠΎΡ€Ρ‚ шк
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ shc.web
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ shc.interfaces.knx
# ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ интСрфСйсы
knx_connection = shc.interfaces.knx.KNXConnector()
web_interface = shc.web.WebServer("localhost", 8080, "index")
web_index_page = web_interface.page('индСкс')
# ΠŸΡ€ΠΎΡΡ‚Π°Ρ пСрСмСнная Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, связанная с Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹ΠΌ адрСсом KNX (инициализируСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌΡ‹ чтСния Π³Ρ€ΡƒΠΏΠΏΡ‹),
# с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π²Π΅Π±-интСрфСйсС
ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅_свСта = shc. Variable(bool, "ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅ ΡΠ²Π΅Ρ‚ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(1, 2, 3), dpt="1", init=True))
web_index_page.add_item(shc.web.widgets.Switch("ΠŸΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅ ΡΠ²Π΅Ρ‚ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ")
                        .connect(ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅_свСта))
# БохраняСм Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ послСднСго измСнСния ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Ρ… ΡΠ²Π΅Ρ‚ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Ρ‡Π΅Ρ€Π΅Π· логичСский ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ) ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ
# это Π² Π²Π΅Π±-интСрфСйсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅_свСта_last_change = shc.ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ(
    datetime.datetime, "послСднСС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½ΠΎΠ³ΠΎ освСщСния",
    initial_value = datetime.datetime.fromtimestamp (0))
@ceiling_lights.trigger
@shc.handler()
асинхронноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ update_lastchange (_new_value, _source):
    ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠ»ΠΊΠ°_свСта_last_change.write(datetime.datetime.now())
web_index_page.add_item(
    shc.web.widgets.TextDisplay(datetime.datetime, "{:%c}", "ПослСдняя смСна ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Ρ… ΡΠ²Π΅Ρ‚ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²")
    .ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ (ΠΏΠΎΡ‚ΠΎΠ»ΠΎΡ‡Π½Ρ‹Π΅_свСта_послСднСС_ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅))
# Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Талюзи с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π²Π΅Π±-интСрфСйсС (событиС Π±Π΅Π· сохранСния состояния, поэтому пСрСмСнная Π½Π΅ трСбуСтся)
web_index_page. add_item(shc.web.widgets.ButtonGroup("Π–Π°Π»ΡŽΠ·ΠΈ", [
    shc.web.widgets.StatelessButton(shc.interfaces.knx.KNXUpDown.DOWN,
                                    shc.web.widgets.icon("стрСлка Π²Π½ΠΈΠ·"))
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(3, 2, 1), dpt="1.008"))
]))
# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис выраТСния для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ вСнтилятора ΠΏΡ€ΠΈ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ Π²Ρ‹ΡˆΠ΅ 25 градусов
Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° = shc.Variable(float, "Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π°")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0, 0, 1), dpt="9", инициализация=Π˜ΡΡ‚ΠΈΠ½Π°))
fan = shc.Variable(bool, "fan")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0, 0, 2), dpt="1"))\
    .connect(Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π°.EX > 25.0)
# Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π‘Π₯К
шк.основной()
 

ЛицСнзия

Smart Home Connect публикуСтся Π² соотвСтствии с условиями Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Apache 2.0.

Он связан с нСсколькими сторонними Ρ€Π°Π±ΠΎΡ‚Π°ΠΌΠΈ:

  • Β«ΠŸΡ€ΠΈΠ·ΠΌΠ°Β» β€” Ρ‚ΠΎΠ½ΠΊΠΈΠ΅ ΡƒΠ·ΠΎΡ€Ρ‹ ΠΎΡ‚ Toptal Designers (Creative Commons BY-SA 3.0)

Π‘ΠΌ. Π›Π˜Π¦Π•ΠΠ—Π˜Π― ΠΈ Ρ„Π°ΠΉΠ» NOTICE для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Зависимости

SHC зависит ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Python:

  • aiohttp ΠΈ Π΅Π³ΠΎ зависимостСй (лицСнзия Apache 2.0, лицСнзия MIT, лицСнзия Python Software Foundation, LGPL 2.1, лицСнзия 3-Clause BSD)
  • jinja2 ΠΈ MarkupSafe (лицСнзия BSD-3-Clause)

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… интСрфСйсов SHC Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ зависимости.
Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ автоматичСски Ρ‡Π΅Ρ€Π΅Π· pip, ΡƒΠΊΠ°Π·Π°Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π»Π°Π³ Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΒ», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. pip install smarthomeconnect[mysql] для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вСдСния ΠΆΡƒΡ€Π½Π°Π»Π° MySQL.

  • Π’Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ‡Π΅Ρ€Π΅Π· MySQL [mysql] :
    • aiomysql ΠΈ PyMySQL (лицСнзия MIT)
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ KNX [knx] :
    • knxdclient (лицСнзия Apache 2.0)
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ DMX [dmx] :
    • pyserial-asyncio ΠΈ pySerial (лицСнзия BSD-3)
  • MIDI-интСрфСйс [ΠΌΠΈΠ΄ΠΈ] :
    • ΠΌΠΈΠ΄ΠΎ (лицСнзия MIT)
    • python-rtmidi (лицСнзия MIT), Π²ΠΊΠ». RTMidi (модифицированная лицСнзия MIT)
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ MQTT [mqtt] :
    • paho-mqtt (публичная лицСнзия Eclipse v1.0 ΠΈΠ»ΠΈ ЛицСнзия Π½Π° распространСниС Eclipse v1.0)
    • asyncio-mqtt (лицСнзия BSD-3-ΠΏΡƒΠ½ΠΊΡ‚)
  • Pulseaudio интСрфСйс [ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½Ρ‹ΠΉ] :
    • pulsectl ΠΈ pulsectl-asyncio (лицСнзия MIT)
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Telegram Bot [Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌΠ°] :
    • aiogram (лицСнзия MIT) + Π΅Π΅ зависимости (лицСнзия BSD-3-Clause + MPL 2.0)
  • Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ постоянноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ [file_persistence] :
    • aiofile ΠΈ caio (лицСнзия Apache 2.0)

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для интСрфСйса Π²Π΅Π±-интСрфСйса Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Javascript ΠΎΡ‚ NPM.
Они Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π½ΠΈ Π² этот Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π½ΠΈ Π² исходныС дистрибутивы SHC.
ВмСсто этого ΠΎΠ½ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя сборки ΠΏΠ°ΠΊΠ΅Ρ‚Π° Python ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² Β«Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅Β» ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Python (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ «колСсо») SHC:

  • Fomantic UI CSS framework (лицСнзия MIT)
  • jQuery (лицСнзия MIT)
  • iro. js (публичная лицСнзия Mozilla 2.0)
  • Chart.js (лицСнзия MIT)

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

Если Π²Ρ‹ пропуститС ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π° GitHub.
ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π΅ΠΌΠ΅ ΠΈ сначала Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π½Π° GitHub.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Smart Home Connect , ваши запросы Π½Π° вытягиваниС всСгда ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ.

ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для SHC ΠΎΡ‡Π΅Π½ΡŒ просто:
ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ git ΠΈ установитС зависимости для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, пСрСчислСнныС Π² requirements.txt (+ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ python-rtmidi , Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ MIDI-тСсты).
К Π½ΠΈΠΌ относятся всС зависимости smarthomeconnect со всСми дополнСниями:

 git clone https://github.com/mhthies/smarthomeconnect
ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диск ΡƒΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ
pip3 ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ -r трСбования.txt
pip3 ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ python-rtmidi
 

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ свои ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Python.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ NodeJS ΠΈ NPM Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² рСсурсов интСрфСйса Π²Π΅Π±-интСрфСйса.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ всС внСшниС зависимости ΠΈΠ· NPM ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² /shc/web/static (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Parcel.js):

 npm install
npm Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сборку
 

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с самими исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π²Π΅Π±-интСрфСйса (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ располоТСны Π² web_ui_src ), Π²Ρ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Parcel.js Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, обСспСчивая Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ:

 npx посылка web_ui_src/main.js --dist-dir shc/web/static/ ΠΏΠ°ΠΊΠ΅Ρ‚ --public-url ./
 

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ запроса Π½Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

 python3 -m unittest
 

Для Π²Π΅Π±-тСстов Π² вашСй систСмС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ установлСны Firefox ΠΈ geckodriver , Π° Ρ‚Π°ΠΊΠΆΠ΅ внСшниС рСсурсы.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ покрытия тСстами.
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ это локально, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ инструмСнт:

 ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ run -m unittest
ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ html
 

Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для Python | Майк Π Π°ΠΉΠ»ΠΈ | The Pragmatic Programmers

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Pixel-Shot Π½Π° Shutterstock

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ

Domotics ΠŸΡ€ΠΎΠ΅ΠΊΡ‚

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ Π²

Β·

4 ΠΌΠΈΠ½ чтСния

Β·

2 ноября 5, 2021

🎁 ЧСрная пятница РаспродаТа. Наша СТСгодная распродаТа продлится Π΄ΠΎ 29 ноября., 2021 Π³., ΡΡΠΊΠΎΠ½ΠΎΠΌΡŒΡ‚Π΅ 40% Π½Π° элСктронных ΠΊΠ½ΠΈΠ³Π°Ρ… Π½Π° Π²Π΅Π±-сайтС The Pragmatic Bookshelf, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠ΄ turkeysale2021 . Ко Π”Π½ΡŽ Π’ΡƒΡ€Ρ†ΠΈΠΈ ΠΌΡ‹ прСдставляСм всС ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ Python, Π° Ρ‚Π°ΠΊΠΆΠ΅ всС ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΡŽ, Ρ…ΠΎΠ±Π±ΠΈ ΠΈ Π΄ΠΎΠΌΡƒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ Майка Π Π°ΠΉΠ»ΠΈ Portable Python Projects.

Π― всСгда Π½Π°Ρ…ΠΎΠΆΡƒΡΡŒ Π² поискС Π½ΠΎΠ²Ρ‹Ρ… ΠΈ интСрСсных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Python. Одна конкрСтная катСгория, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΈΡ‰Ρƒ, β€” это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. НиТС пСрСчислСны Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python для домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, пСрСчислСнныС Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я использовал Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Home Assistant

Home Assistant β€” это ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ слуТбами домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с устройствами Amazon Alexa, Google Assistant, Lutron, Philips Hue, Plex, Sonos, Z-wave ΠΈ Zigbee β€” ΠΈ это лишь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Π°Ρ… YAML, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ»ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ слуТбы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ свСта Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. УстановитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip:

$ pip install homeassistant

Pyecobee API Wrapper

API ecobee ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния рядом встроСнных тСрмостатов ecobee (). Π₯отя Home Assistant ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ экоби, ΠΈΠ½ΠΎΠ³Π΄Π° всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ. ΠžΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° API pyecobee прСдоставляСт интСрфСйс Pythonic для Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ecobee JSON для запроса ΠΈ управлСния устройством. УстановитС ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip:

$ pip install pyecobee

phue Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Philips Hue Python

Одной ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΌΠΎΠ΅ΠΌ Π½Π°Π±ΠΎΡ€Π΅ инструмСнтов Python являСтся phue. Phue β€” это интСрфСйс Pythonic, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для связи с Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ обСспСчСниСм Philips Hue Bridge, Ρ‚Π΅ΠΌ самым управляя всСми устройствами Hue, связанными с этим мостом. Благодаря простой настройкС ΠΈ структурС ΠΊΠΎΠΌΠ°Π½Π΄ для Π²Ρ‹Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Hue, phue позволяСт Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС сцСнарии Python для управлСния ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ аспСктом вашСй срСды с аксСссуарами Philips Hue. Π― обращался ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ phue Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, описанных Π² ΠΌΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΏΠΎ домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Python, ΠŸΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Python . УстановитС ΠΏΠ°ΠΊΠ΅Ρ‚ phue с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip:

$ pip install phue

PushNotif (ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒ IfTTT)

PushNotif β€” это ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ молодая ΠΈ базовая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Python, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слуТбу IFTTT ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π΅ Π΅Π΅ бСсплатноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Android ΠΈΠ»ΠΈ iOS. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ push-ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ этой слуТбы для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ отобраТСния Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ оповСщСния Π½Π° вашСм Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π΅. Π₯отя Ρ‚Π°ΠΊΠΈΠ΅ увСдомлСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ элСктронной ΠΏΠΎΡ‡Ρ‚Π΅, Π² тСкстовом сообщСнии ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· слуТбы Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π² Discord ΠΈΠ»ΠΈ Slack, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ этих слуТб трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ настройка. Если всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ простого Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π½Π° вашСм Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π΅, ΠΊΠΎΠ³Π΄Π°, скаТСм, Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° Π² вашСм ΠΏΠΎΠ΄Π²Π°Π»Π΅ ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈΠΆΠ΅ 60 градусов ΠΏΠΎ Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Ρƒ, Π΄Π°Ρ‚Ρ‡ΠΈΠΊ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊ Pi, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ сообщСниС PushNotif ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись IFTTT ΠΈ связанныС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для мобильного Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ вас. УстановитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PushNotif с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip:

$ pip install pushnotif

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ саундбаром PyVizio

Π’Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Ρ‹ ΠΈ саундбары Vizio SmartCast β€” это Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ для Π΄ΠΎΠΌΠ°ΡˆΠ½ΠΈΡ… Ρ€Π°Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΉ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ доступны Ρ‡Π΅Ρ€Π΅Π· WiFi. Vizio ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ бСсплатноС мобильноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для управлСния своими ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌΠΈ SmartCast, Π½ΠΎ Π΅Π³ΠΎ интСрфСйс, Π½Π° ΠΌΠΎΠΉ взгляд, Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΠΉ ΠΈ довольно ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этими устройствами Ρ‡Π΅Ρ€Π΅Π· Alexa ΠΈΠ»ΠΈ Google Voice, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ планируСтся, Π½ΠΎ ΠΏΠΎΠΊΠ° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ поддСрТиваСтся. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обсуТдался Π² голосовых ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π² ΠΌΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅, я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Google Voice для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π° Philips (Ρ‡Π΅Ρ€Π΅Π· ИК-ΠΏΠΎΡ€Ρ‚) ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ Π΅Π³ΠΎ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Vizio (Ρ‡Π΅Ρ€Π΅Π· WiFi), Π΄Π΅Ρ€ΠΆΠ° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ Π² ΠΊΠ°Ρ€ΠΌΠ°Π½Π΅ ΠΈ защищая Π³Π»Π°Π·Π°. ΠΈΠ· этого ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²ΠΎΠ³ΠΎ прилоТСния Vizio. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pyvizio, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ pip:

$ pip install pyvizio

Samsung Smart TV

Π’Π»Π°Π΄Π΅Π»ΡŒΡ†Ρ‹ популярного сСмСйства дисплССв Samsung TV с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Wi-Fi ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этими Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ samsungtvws Samsung Smart TV WS API. Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌ API, описанным Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Python прСдоставляСт интСрфСйс Pythonic для ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ API производитСля, упрощая Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ устройством ΠΈΠ· сцСнария Python.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *