Намедни, с помощью Дипсика (пришлось ему помочь, предоставив данные о том, как закодированы данные в ответе весов) за 15 минут накарябал следующее:
import asyncio
from bleak import BleakClient, BleakScanner
from bleak.exc import BleakError
SCALE_MAC = "00:00:00:00:00:00" # MAC адрес весов из приложения Zepp Life
SERVICE_UUID = "0000181b-0000-1000-8000-00805f9b34fb" # Оставить как есть
CHARACTERISTIC_UUID = "00002a9c-0000-1000-8000-00805f9b34fb" # Оставить как есть
def parse_scale_data(data):
if len(data) < 13:
return None
status_byte = data[1]
is_fixed = status_byte & 0x02
has_impedance = status_byte & 0x04
raw_weight = int.from_bytes(data[11:13], byteorder='little')
weight_kg = raw_weight * 0.005
return {
'weight': weight_kg,
'is_final': is_fixed,
'is_stabilized': is_fixed,
'raw_weight': raw_weight,
'has_impedance': has_impedance,
'impedance': int.from_bytes(data[9:11], byteorder='little') if has_impedance else None
}
def notification_handler(sender, data):
"""Обработчик уведомлений"""
if len(data) < 13 or data[0] != 0x02:
return
parsed = parse_scale_data(data)
if not parsed:
return
if parsed['is_final']:
print(f"\nФинальный вес: {parsed['weight']:.2f} кг")
if parsed['has_impedance']:
print(f"Импеданс: {parsed['impedance']} Ом")
else:
print(f"Измерение: {parsed['weight']:.2f} кг", end='\r')
async def monitor_scale():
"""Постоянный мониторинг весов"""
while True:
print("\n--- Начинаю сканирование ---")
try:
# Сканируем устройство
device = await BleakScanner.find_device_by_address(SCALE_MAC, timeout=10)
if not device:
print("Весы не найдены, повторяю через 5 секунд...")
await asyncio.sleep(5)
continue
print(f"Найдены весы {device.name}, подключаюсь...")
async with BleakClient(device) as client:
print("Подключено. Встаньте на весы...")
await client.start_notify(CHARACTERISTIC_UUID, notification_handler)
# Ждем отключения или 5 минут бездействия
try:
while True:
await asyncio.sleep(1)
if not client.is_connected:
print("\nСоединение потеряно")
break
except Exception as e:
print(f"\nОшибка соединения: {e}")
finally:
try:
await client.stop_notify(CHARACTERISTIC_UUID)
except:
0 pass
print("Отключено")
except Exception as e:
print(f"\nОшибка: {e}")
await asyncio.sleep(5)
# Для Jupyter Notebook
try:
await monitor_scale()
except KeyboardInterrupt:
print("\nМониторинг остановлен")
Код рабочий, с чем себя и поздравляю.
Очень хочется разобраться с добычей всех данных из Zepp Life, но с этим пока непросто.
]]>
Некоторое время назад, в третий раз за 2.5 гола обладания 3д принтером, а напечатал полезную вещь - разделитель для дверной полки в холодильнике.
Что удивило - норот на сингиверс внезапно оценил поделку и в течение месяца активно скачивал и лайкал, загнав модельку аж в топ в разделе Kitchen und Dining.
Я, было, вдохновился и подумал, что вот, щас как начну моделировать, но потом попустило, конечно же.
печатал PLA, на околостандартных настройках
]]>
Внезапно, автор удосужился и озадачить ГГ и проблемами вселенского масштаба и смертей и их аналогов стало больше. Так что провел вечер за чтением и ничуть об этом не жалею и претензии, высказанные в предыдущем посте, снимаю.
Из интересного - автор вовсю заигрывает с темой божественного, рисуя модель вмешательства стороннего разума в виде горящего куста и ангелоподобных аватаров в дело развития свеженародившейся или внезапнопомирающей цивилизации.
Сильно раздражает только суперковергентность эволюций в разных звездных системах. Как в Стартреке каком-нибудь, тьфу ))
З.Ы. Вторая часть нашлась только в машинном (или почти-машинном) переводе (прошлый раз такое было с "Проектом Ave Мария"). Так вот, хочу отметить, что такой, прямо скажем, говно-перевод практически не раздражал. Получилось настроится на восприятие криво или буквально переведенного выражения сразу в форму, "которую хотел сказать автор".
]]>
Небезынтересная фантастика автора Д.Э. Тейлора про человека, который волею судеб в 22 веке был оцифрован и направлен в качестве зонда фон Неймана в соседнюю звездную систему.
Достаточно твердая сайенс фикшн. Похожа на "Проект "Радуйся" Мария" Энди Вейра. Единственное, что смущает - такое ощущение, что современные авторы боятся, что ли, ставить героев в затруднительное положение. Моральные дилеммы, смертельные угрозы, потери друзей и близких и вот это вот все - как то отсутствует в современной фантастике. Непротиворечивые описания мира - окей, размах действия космического масштаба - окей, достаточно достоверное описание и применение технологий - окей. А вот морального роста героя нет. Герой в начале книжки = герой в конце книжки + знания. В результате произведение плоское, как неплохое столовое вино - вроде к месту прикольно, но попробуй вспомнить через месяц - не получится.
Так или иначе, вечером приступлю ко второй книжке серии
]]>
В течение месяца радовался установленному на домашнем серваке Nextcloud(у). Это такое опенсорсное ПО, которое позволяет развернуть свой личный персональный дропбокс/я.диск/etc, в которым ты сам себе хозяин и можешь делать шохош, и никто тебе ничо не сделает.
Из возможностей:
Из минусов - если ты забыл пароль и при этом при настройке забыл указать почту, то никто тебе уже не поможет. В целом, это справедливо, конечно, но все равно немного обидно.
Я, конечно, попытаюсь еще повспоминать пароли, поищу способы скинуть его через консоль, но, скорее всего, забью и с выходных начну жизнь заново, с нового инстанса ))
]]>
В связи с идущей технологической революцией решил изменить порядок целеполагания.
Если раньше я довольствовался написанием тезисного плана (сделать то-то, проверить то-то, не забыть про и тд), то теперь планирую писать ТЗ для "воображаемого" робота. Даже если задание заведомо "роботом" невыполнимо в силу его воображаемости ))
Зачем? чтобы перейти на рельсы делегирования. Пусть это пока еще убогий чат-жпт, но пока рост его способностей находится на экспоненциальной части графика и фундаментальных причин для ограничения его грядущего развития я не вижу - хош, расти вширь, хош - интенсивно.
Начну с искоренения порочной практики написания кода "акын-стайл", кода пишу, что думается.
]]>
Написано с применением chatGPT3.5. ))
ChatGPT – текущее состояние:
На мой взгляд, сейчас ChatGPT 3.5 соответствует ребенку 10-12 лет с эйдетической памятью, с энциклопедическими знаниями, но склонного к галлюцинациям и ни разу не выходившим за пределы комнаты.
Полноценно и продуктивно общаться с ним ПОКА может только специалист специально обученный человек (если цель - не развлечение, конечно же)
При этом по состоянию на начало этого года я бы оценил «возраст» в 5-7 лет, то есть имеет место значительный прогресс за короткое время
Возможности:
Ограничения
Варианты использования:
Прямо сейчас
В этом или следующем году (требует доработки/ усилий со стороны пользователя):
На горизонте два-пять лет:

Когда я строил каное (на котором в итоге вылез на воду один раз), мне очень помогла практика ежедневного отчета о том, что сделал и что планирую сделать. Мотивирует и бодрит, а самое главное - не дает сбиться с мысли в ворохе возникающих задач.
Попробую и с этим экземпляром робота сделать то же самое.
План на ближайшие дни:
Чуть более далекие перспективы:
Совсем далекие перспективы:

... озадачился давеча организацией интерфейса управления роботом.
Поскольку, если у человека в руках молоток, то все вокруг ему напоминает гвоздь, решил остановиться на реализации оного интерфейса посредством flask. Поднимаем на Raspberry flask-server, получаем от процесса управления роботом данные, посылаем из фласка роботу команды. Все просто. Казалось бы.
Однако ж, оказалось не все.
Первоначально хотел запускать flask и основной скрипт в одном скрипте в разных потоках и обмениваться данными через глобальные переменные. Понятно, что глобальные переменные - не очень хорошая практика, но почему бы и нет? После некоторого количества экспериментов выяснил, что фласк отказывается подниматься, будучи запущенным не в основном потоке. Наверняка есть способы обойти это, но тыкаться вслепую не хотелось, поэтому сразу перешел к следующему очевидному решению: обмен данными через сокеты.
Состряпал в основном скрипте сервер, а во фласке – клиент и давай проверять. Засада оказалась, опять же, во фласке – он категорически отказывался удерживать соединение. И снова – наверняка решение можно было найти, но тратить на это свободное от работы время не хотелось, поэтому сразу перешел к третьему очевидному варианту: обмен данными через БД.
Сказано сделано: на многострадальной малине был поднят MySql сервер, а в ем – две таблицы: первая status, а вторая - order. Теперь основной скрипт пишет в status json с текущими состояниями и проверяет, не ли новых повелений, а фласк, со своей стороны, при запросе страницы лезет в БД, что бы получить последние новости о датчиках и пишет в нее повеления создателя.
Все работает, все довольны. Все, кроме SD-карты Малины, которая наверняка в скором времени выскажет свое недовольство постоянной писаниной строк в БД и сдохнет в самый неподходящий момент.
З.Ы. С непрограммными делами на ниве роботостроения пока затык, так как ожидаю поставку комплектующих.
]]>
Есть у меня незавершенный гештальт — сделать робота. И чтобы это был не танк на радиоуправлении, а нечто самостоятельно принимающее решение на уничтожение действующее в зависимости от условий окружающей среды и собственных задач.
Основной затык долгие годы был в шасси. Врожденное рукожопство, лень и желание сделать конфетку из дешевого амна раз за разом приводили к рождению мертворожденных особей. То мощности моторов не хватает, чтобы увезти собственный аккумулятор, то сожгу какой-нибудь драйвер неправильным подключением, то сожгу очередную Raspberry Pi, забыв что ест она только 3,3 В. После каждого несчастного случая я забывал про проект на год-полтора, однак ж, через некоторое время страсть к постройке Терминатора разгоралась с новой силой.
Недавно я похоронил очередную Rpi 2, пытаясь подключить к ней драйвер моторов ul489 (который пытался поставить вместо толи бракованного, то ли слегка сожженого l298). После этого я принял 2 решения:
Ардуина, как ни крути, гораздо лучше приспособлена для такого рода проектов. Она и более дубовая, и имеет логику 5 В, и аналоговые порты. Да и тупо мамские GPIO удобнее папских.
Да, не умеет в многопоточность, но для этих целей есть Малина.
Сказано - сделано. Через полдня у меня появился Франкенштейн с корпусом из картона (я ничего не проектировал, вырезал "по-месту". На шасси от игрушечного танка:
Оно уже ездит и даже почти не натыкается на стены. А самое главное - не разваливается в процессе эксплуатации. Это большое достижение. ))
В ближайших планах:
Назову его T-0,33. Код и дальнейшее развитие проекта - в следующих постах, если боги рукожопия будут благосклонны.
]]>