Wpis z mikrobloga

Mam sobie skrypt w pythonie odczytujący temperaturę z DS18B20. Zwyczajnie otwieram plik "/sys/bus/w1/devices/28-001414baa9ff/w1_slave" za pomocą open(), potem odczytuję .readlines() i na koniec zamykam plik .close() i dalej to sobie interpretuję.

Tylko czasem termometr nie odpowiada. W sensie program zawiesza się na open() i stoi tak dopóki nie zabiję procesu i nie włączę skryptu od nowa. Jeśli program się zawiesi jest to bardzo niebezpieczne, bo steruje on grzałkami do akwarii, jak jest zawieszony to nie może odczytywać temperatur z innych termometrów, a tym samym doprowadzić do nie wyłączenia grzałek.

Z początku pomyślałem o timeut, że jeśli nie możemy odczytać temp przez np. 20sek to lecimy mimo wszystko dalej. Ale nie mogłem znaleźć takiej opcji. Help :P

#python #raspberrypi #programowanie
  • 16
@skew: zobacz ftrace'em. Może wisi gdzieś w kernelu. Dla raspberry pi włączenie ftrace może być zabójcze (mam na myśli wydajność) ale póki co innego pomysłu nie mam. Możesz też spróbować perf'a
@smirk0: Właśnie w tym problem że nie wiem jak ten timeout dać ;] Tutaj kod odpowiedzialny za pobieranie temperatur do tablicy "temps": http://pastebin.com/fL3J8wZP Nie zdarza się to często, ostatnio miałem już 28 dni uptime bez błędów i dopiero się to wydarzyło, ale jeśli zawiesi się np. o 22:00 i zauważę że coć nie tak dopiero rano, to w jednym z akwarii może być już 25C czego krewetki zbytnio nie lubią (
@smirk0: Tak też chyba zrobię, już w osobnych wątkach dałem aktualizację oświetlenia, konfiguracji i właśnie termometrów, teraz będę musiał każdy termometr osobno, no cóż trzeba będzie trochę kod przebudować :D

Dzięki wszystkim za pomoc :)
@skew: Ja to robie w bashu:
#!/bin/bash

TEMPFILE1=/sys/bus/w1/devices/28-0000054e64f9/w1slave
TEMPFILE2=/sys/bus/w1/devices/28-0000054ee49e/w1
slave

if [ ! -e "$TEMPFILE1" ];
then
modprobe w1-gpio
modprobe w1-therm
sleep 2
[ -e "$TEMPFILE1" ] || exit 1
[ -e "$TEMPFILE2" ] || exit 1
fi

TEMPVAL1=$( awk -F= '{ if(NR==2) printf "%3.2f", $2/1000 }' $TEMPFILE1 )
TEMPVAL2=$( awk -F= '{ if(NR==2) printf "%3.2f", $2/1000 }' $TEMPFILE2 )

echo "$TEMPVAL1"",""$TEMPVAL2" > /var/tmp/tempy.txt

Skrypt robi sie w cronie jako
Pobierz
źródło: comment_FocTzlLrKbG5qhioeywsRGEbr99IiZp0.jpg
@NigdyNieBedeBordowy @smirk0 @mati75 @drhipis @marionez @Ginden
Dobra, problem został rozwiązany w inny sposób. Problem z tymi termometrami miałem od dłuższego czasu (a to nagle się odłączały, a to pokazywały temperatury typu 120C) i jakoś sobie z tym radziłem. A teraz odkryłem prawdziwy powód tego wszystkiego.

Akwaria nie są uziemione. Potencjał między wodą w akwarium a masą w raspberry to ~60V co powodowało błędy w transmisji :) Więc trzeba będzie połączyć je z