Π£ΠΌΠ½ΡΠΉ Π΄ΠΎΠΌ Π½Π° 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
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²Π΅Π±-Π²ΠΈΠ΄ΠΆΠ΅ΡΡ
- ΠΠ°ΡΡΠΈΠΊΠΈ
- Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΊΠ°Π»Π° / «ΠΏΠΎΠ»ΠΎΡΠ°ΡΡΠ΅» Π³ΡΠ°ΡΠΈΠΊΠΈ
ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ
(Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ) Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅Π΄Ρ, ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Python ΠΎΡΡΠ°Π²Π°Π»ΠΈΡΡ ΡΠΈΡΡΡΠΌΠΈ:
python3 -m virtualenv -p python3 venv . venv/bin/Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ
Π£Π·Π½Π°ΠΉΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅Π΄Π°Ρ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Python.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²
smarthomeconnect
Python ΠΈΠ· PyPI:pip3 ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ smarthomeconnect
ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° smarthomeconnect ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΡΠ΅Π±ΡΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΒ» Π² pip/setuptool.
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΌ. Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΒ» ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΠΉ.
ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΠ΅ SHC ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π° (Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Β«Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎΒ» ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ Β«wheelΒ» ΠΈΠ· PyPI), Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π½Π° Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ NodeJS ΠΈ npm, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° Python.Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΊΡΠΈΠΏΡ Python (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ
my_home_automation.py
), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Smart Home Connect:#!/usr/bin/env python3 ΠΈΠΌΠΏΠΎΡΡ ΡΠΊ # TODO Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΊ.
ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ()
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ° (
python3 my_home_automation.py
) SHC Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡΡΡΠΈΡΡΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΠΊΠ° Π²Ρ Π΅Π³ΠΎ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ctrl+C).
Π‘ΠΌ. ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ KNX.ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΠΌΠΈ 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.