Ошибка при запуске кода/скрипта.

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Доброго времени суток, друзья!
Я сам вообще не программист и о Питоне узнал только пару дней назад. Посему прошу снисхождения.

Моя задача. Имеется блютусный температурный датчик-гигрометр Inkbird IBS-TH1.
В сети нашел простой скрипт, который умеет читать данные.
Запускаю скрипт на raspberry 3b+, Raspbian OS (Baster).
Даже для меня скрипт небольшой и относительно простой:

Python:
#!/usr/bin/env python3

from bluepy import btle
from struct import unpack


MAC='2C:AB:33:CE:A3:D5'


def scanDevices():
  pass

# feel free to use these to walk the inkbird device.. although I noticed
# more than once that mine has a habit of 'going away' when hit heavily
# if you want to, uncomment the calls below
def iterateServices():
  print("Services...")
  for svc in dev.services:
      print( str(svc) )

def iterateCharacteristics():
  print("Characteristics...")
  for char in dev.getCharacteristics():
      print( char )
      print( char.__dict__ )
      print( char.uuid )
      if char.supportsRead():
        try:
          val = char.read()
          print("raw val is {val}")
          print("converted value is ", binascii.b2a_hex(val))
        except:
          print("ERROR - attribute can't be read probably")
      else:
        print("Skipping - attribute can't be read probably")

print("Connecting...")
dev = btle.Peripheral(MAC)
# iterateServices()
# iterateCharacteristics()


# Characteristic fff2 seems to be temperature and humidity -> 0000fff2-0000-1000-8000-00805f9b34fb
# the fff2 has a read handle at 40 and (I am guessing here) a description handle at 39
readings = dev.readCharacteristic(40)
print(f"raw readings is {readings}")
temperature, humidity = unpack("<HH",readings[0:4])
print(f"temperature is {temperature/100}")
print(f"humidity is {humidity/100}")

Однако после запуска появляется ошибка :

Безымянный.png

Низкий поклон за помощь!
 

Farruh

Пользователь
Пользователь
Авг 9, 2020
15
5
3
pi@kodi:~/mi1 $ python3 --version
Python 3.5.3
На сколько я знаю в 3.5 нет f строк, попробуйте скачать более новую версию и ещё раз попробовать
 
  • Мне нравится
Реакции: Nathareth

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Да, я сейчас тоже задумался, действительно староватая версия получается.
Не подскажете, просто из командной стройки Питон можно обновить до последней версии ?
Можно просто f-строки не использовать. 46-ю строку тоже замените на:
Python:
print("raw readings is {}".format(readings))
 
  • Мне нравится
Реакции: Nathareth

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Синтаксис выглядит правильным. Попробуйте две последние строки заменить на:
Python:
print(temperature)
print(humidity)
 

Farruh

Пользователь
Пользователь
Авг 9, 2020
15
5
3
Да, я сейчас тоже задумался, действительно староватая версия получается.
Не подскажете, просто из командной стройки Питон можно обновить до последней версии ?
Если я не ошибаюсь Питон нельзя обновить, только скачать более новую версию, но никаких несостыковок не должно быть, просто потом будете указывать версию питона при запуске скрипта)
 

Farruh

Пользователь
Пользователь
Авг 9, 2020
15
5
3
Так ведь при запуске python3 он вероятно автоматом стартанет самую свежую версию, я полагаю ?
Надо пробовать, тут точно сказать не могу
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Заработало! ))

Посмотреть вложение 491

Это значение температуры и влажности.
Правда оно в 100 больше, но это я уже в Home Assistant создам сенсор и поделю его на 100.
Огромное вам спасибо!!!
Чтобы значения не были в 100 раз больше можете заменить строки:
Python:
print(temperature)
print(humidity)
на такие:
Python:
print("temperature is {}".format(temperature / 100))
print("humidity is {}".format(humidity / 100))
 

Farruh

Пользователь
Пользователь
Авг 9, 2020
15
5
3
Друзья, чтобы не плодить темы, спрошу тут же.
Есть строка :

print(temperature / 100.0)

Результат я получаю с сотыми, не всегда размещается в окне. Мне необходимо округлить до десятых.
Прочитал про" ROUND", но не придумал как его здесь применить.
print(round(...))
Или же print(temp // 100)
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Он ругается на 46-ю строку :
print(f"raw readings is {readings}")

По сути не доходит до 48 и 49 строк.
 

Farruh

Пользователь
Пользователь
Авг 9, 2020
15
5
3
Он ругается на 46-ю строку :
print(f"raw readings is {readings}")

По сути не доходит до 48 и 49 строк.
Версия питона какая?
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
pi@kodi:~/mi1 $ python3 --version
Python 3.5.3
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Да, я сейчас тоже задумался, действительно староватая версия получается.
Не подскажете, просто из командной стройки Питон можно обновить до последней версии ?
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Заработало! ))

Безымянный1.png

Это значение температуры и влажности.
Правда оно в 100 больше, но это я уже в Home Assistant создам сенсор и поделю его на 100.
Огромное вам спасибо!!!
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
А можно набраться наглости и спросить, как сложно теперь эти 2 значения в этом же коде отправить топиком в MQTT.
Просто я теперь буду ломать голову как эти данные получить в Home Assistant.
Насколько я знаю там поддерживаются скрипты, но без импорта, посему этот код мне придется крутить на отдельной малине и через mqtt транслировать.
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Если я не ошибаюсь Питон нельзя обновить, только скачать более новую версию, но никаких несостыковок не должно быть, просто потом будете указывать версию питона при запуске скрипта)

Так ведь при запуске python3 он вероятно автоматом стартанет самую свежую версию, я полагаю ?
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Чтобы значения не были в 100 раз больше можете заменить строки:
Python:
print(temperature)
print(humidity)
на такие:
Python:
print("temperature is {}".format(temperature / 100))
print("humidity is {}".format(humidity / 100))

Теперь точно идеал!
Большое вам спасибо!
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
Друзья, чтобы не плодить темы, спрошу тут же.
Есть строка :

print(temperature / 100.0)

Результат я получаю с сотыми, не всегда размещается в окне. Мне необходимо округлить до десятых.
Прочитал про" ROUND", но не придумал как его здесь применить.
 

Nathareth

Новичок
Пользователь
Авг 9, 2020
10
0
1
print(round(...))
Или же print(temp // 100)

Две косые сработали. Спасибо!
 

Форум IT Специалистов