Ускоряем телеграм при помощи mtproxy
Для этого понадобится выделенный сервер, желательно в зоне РФ. Самый простой способ — использование готового скрипта с https://github.com/nolaxe/install-MTProxy/blob/main/README.md
Жизнь замечательных грибов
Наработки и статьи по работе с Linux
Для этого понадобится выделенный сервер, желательно в зоне РФ. Самый простой способ — использование готового скрипта с https://github.com/nolaxe/install-MTProxy/blob/main/README.md
1) Установка на Ubuntu:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
docker --version
2) Установка приложения через docker
docker pull jetbrains/teamcity-server
3) Запуск:
docker run --name teamcity-server-instance \
-v <path to data directory>:/data/teamcity_server/datadir \
-v <path to logs directory>:/opt/teamcity/logs \
-p <port on host>:8111 \
jetbrains/teamcity-server
4) Автозапуск после перезагрузки сервера:
docker update --restart=always teamcity-server-instance
Может работать как по I2C так и по протоколу SPI. В моём случае, я подключил по I2C.
Схема подключения:
| BMP280 Pin | Raspberry Pi Pin |
|---|---|
| VCC | 3.3V (Pin 1) |
| GND | Ground (Pin 6) |
| SDA | SDA (Pin 3, GPIO2) |
| SCL | SCL (Pin 5, GPIO3) |
Далее необходимо зайти в raspi-config и включить интерфейс i2c. После чего понадобится малинку перазагрузить. После перезагрузки можно посмотреть, определяется ли она:
i2cdetect -y 1
Должно появиться что-то вроде:

Иногда садится на 77 порт, но чаще на 76. Далее необходимо установить библиотеки:
sudo apt install -y python3-smbus python3-spidev python3-pip
pip3 install adafruit-circuitpython-bmp280
Минимальный код для проверки работоспособности:
#!/usr/bin/env python3
import board
import busio
import adafruit_bmp280
import time
import datetime
import requests
import json
import threading
# Create sensor object using the I2C port
i2c = busio.I2C(board.SCL,board.SDA)
sensor = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address = 0x76)
while True:
print("\nTemperature: %0.1f C" % sensor.temperature)
print("Pressure: %0.1f hPa" % sensor.pressure)
mmHg = sensor.pressure * 0.75006
print("Pressure: %0.1f mmHg" % mmHg)
print("Altitude: %0.2f meters" % sensor.altitude)
print("Sea Level Pressure: %0.1f hPa " % sensor.sea_level_pressure)
print(datetime.datetime.now())
time.sleep(10)
У меня выводит что-то подобное:

Логическое продолжение Части 1, 2,3. Итак, научился принимать данные от zigbee устройств на стик Zigbee2Mqtt и на Алису. Да вот беда, одновременно и там и там данные от одного устройства штатными средствами не получить. А только на Алису завязывать все устройства бы не хотелось, так как:
Потому и возникла задача перебросить некоторые устройства которые есть на стике на Алису. Например датчик температуры. И в принципе штатное решение есть от самого Яндекса. Правда они выбрали весьма трудоёмкое для этого способа решение: необходимо создать виртуальное устройство, написать для него API и подключить в качестве стороннего навыка «Умный дом». Т.е. схема взаимодействия вырисовывается такая:

Т.е. что нужно сделать по шагам:
Для этого переходим по ссылке https://dialogs.yandex.ru/developer/smart-home и создаём новый навык.

Важно! Тип доступа сделать приватным, тогда модерация будет «мгновенной», ну и собственно навык не будет доступен никому кроме вас.

После заполнения основных данных, далее необходимо создать приложение https://oauth.yandex.ru/ с типом платформы WEB:

Так вы получите необходимые для дальнейшей настройки навыка ClientID и Client secret, которые необходимо будет прописать в навыке на странице «Связка аккаунтов»:

Кроме того необходимо прописать эндпоинты которые будут отвечать за авторизацию навыка на вашем сервере, обновление и получение токенов.
Ну собственно на стороне сервера необходимо создать эндпоинты, которые сначала авторизуют навык, а затем отдадут данные «виртуального устройства». Например датчика температуры. Далее накидаю рабочие куски кода-шаблоны, которые пойдут как основа для «допила».
auth.php:
$redirect_uri = $_GET["redirect_uri"];
$state = $_GET["state"];
$client_id = $_GET["client_id"];
header("Location: ".$redirect_uri."?code=1234&state=$state&client_id=$client_id");
token.php:
$code=$_POST["code"];
$client_secret=$_POST["client_secret"];
$grant_type=$_POST["grant_type"];
$client_id=$_POST["client_id"];
$redirect_uri=$_POST["redirect_uri"];
$json='{
"access_token": "ACCESS_TOKEN",
"token_type": "bearer",
"expires_in": 2592000,
"refresh_token": "REFRESH_TOKEN",
"scope": "read",
"uid": 100101,
"info": {
"name": "donpadlo",
"email": "info@mail.ru"
}
}';
header('Content-Type: application/json');
echo $json;
refresh.php:
$json='{
"access_token": "ACCESS_TOKEN",
"refresh_token": "'.$_GET['refresh_token'].'",
"token_type": "bearer",
"expires_in": 2592000
}';
header('Content-Type: application/json');
echo $json;
Всё что выше — это авторизация навыка. После чего он полезет на Redirect URI указанный в приложении, где будет ожидать ответа в формате json на два вида возможных запроса REQUEST_URI:
Данные для отдачи (температура, влажность) берем из очереди mqtt. В самом простом случае, шаблон устройства может выглядеть как-то так:
index.php
if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices"){
$json='{
"request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
"payload": {
"user_id": "gribov_pi",
"devices": [{
"id": "abc-123",
"name": "Розовая комната",
"description": "Измеряет температуру и влажность",
"room": "спальня",
"type": "devices.types.sensor.climate",
"custom_data": {
"foo": 1,
"bar": "two",
"baz": false,
"qux": [1, "two", false],
"quux": {
"quuz": {
"corge": []
}
}
},
"capabilities": [],
"properties": '.get_properties().',
"device_info": {
"manufacturer": "Грибовы.рф",
"model": "Датчик температуры",
"hw_version": "1.0",
"sw_version": "1.0"
}
}]
}}';
};
if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices/query"){
$json='{
"request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
"payload": {
"devices": [{
"id": "abc-123",
"capabilities": [],
"properties": '.get_properties().'
}]
}
}';
};
header('Content-Type: application/json');
echo $json;
die();
function get_properties(){
return '[
{
"type": "devices.properties.float",
"retrievable": true,
"reportable": true,
"parameters": {
"instance": "temperature",
"unit": "unit.temperature.celsius"
},
"state": {
"instance": "temperature",
"value": 30
},
"last_updated": "2025-12-29 12:12:12"
},
{
"type": "devices.properties.float",
"retrievable": true,
"reportable": true,
"parameters": {
"instance": "humidity",
"unit": "unit.percent"
},
"state": {
"instance": "humidity",
"value": 70
},
"last_updated": "2025-12-29 12:12:12"
}
]';
};
Переходим в раздел «Тестирование» и подключаем вышесозданый навык:

Как видим виртуальное устройство отображается, данные в нём обновляются, и его можно штатно использовать для создания различных сценариев в Алисе:

В первой и второй части, был прошит и настроен стик, а так-же установлен брокер сообщений и ZigBee2mqtt, Теперь попробуем подключить устройство и получить с него данные по температуре. Устройство — самый раздешевый датчик температуры, купленный на AliExpress за 267 рублей:

Заходим в админ панель ZigBee2mqtt, по адресу: http://ip:8080 и нажимаем кнопку «Разрешить подключения». После чего на устройстве жмем кнопку reset скрепкой. Если всё удачно, то в течении нескольких секунд устройство будет обнаружено:

Далее собственно при получении данных с устройства, ZigBee2mqtt будет отсылать данные по нему в json формате в очередь вида zigbee2mqtt/0xa4c13812c854f0f7. Хвост у данной очереди — МАС адрес устройства. Нашей дальнейшей задачей является эти данные собственно принять и обработать. Для этого воспользуемся python библиотекой paho-mqtt:
pip install paho-mqtt --break-system-packages
Оформить подписку можно например так:
import context
import paho.mqtt.subscribe as subscribe
def print_msg(client, userdata, message):
print(message.topic)
print(message.payload)
subscribe.callback(print_msg, "#", hostname="localhost",auth={'username':"уакукауы","password":"укепукепк"})
context.py:
# -*- coding: utf-8 -*-
# Ensure can import paho package
try:
import paho
except ImportError:
# This part is only required to run the examples from within the examples
# directory when the module itself is not installed.
import inspect
import os
import sys
cmd_subfolder = os.path.realpath(
os.path.abspath(
os.path.join(
os.path.split(
inspect.getfile(inspect.currentframe())
)[0],
"..",
"src"
)
)
)
if cmd_subfolder not in sys.path:
sys.path.insert(0, cmd_subfolder)
import paho
Ну и далее на свой вкус и цвет дальше можно эти данные уже как угодно обрабатывать
