Šta je novo?

USB watchdog python skripta pomoc

TwistedMind

Slavan
Učlanjen(a)
30.05.2009
Poruke
7,009
Poena
485
Moja oprema  
CPU & Cooler
Intel i5-13600KF & Noctua NH-D15S chromax.black
Matična ploča
Gigabyte Z790M AORUS ELITE AX
RAM
Corsair VENGEANCE 32GB (2 x 16GB) DDR5 6000MHz C36
GPU
ASRock RX 6700 XT Challenger Pro 12GB OC
Storage
1TB Samsung 990 PRO NVMe M.2 SSD
Zvuk
FiiO K7 + HiFiMan Sundara, Soundpeats H1 TWS
PSU
Seasonic Prime PX 850W Platinum
Kućište
Cooler Master Storm Trooper
Monitor
2x ASUS MG279Q
Miš & tastatura
Logitech G502 LIGHTSPEED & Asus ROG Falchion MX Brown
Ostale periferije
Playstation 5
Mobilni telefon
Lenovo Z5
Pametni uređaji
Mobvoi TicWatch Pro 3 Ultra GPS
Pristup internetu
  1. Optički internet
Pokusavam da namestim da USB watchdog radi na raspbianu. U pitanju je onaj standardni sa 2 releja za reset i gasenje.
LINK
Nasao sam ovo, ali ne umem da podesim.
Skripta je sledeca
Kod:
#!/usr/bin/python
import logging
import sys
import time
import serial
import argparse
import threading
from datetime import timedelta


class UsbWatchDog(object):

    def __init__(self, port, heartbeat=10, baud=9600, daemon=True):
        self.heartbeat = heartbeat if 10 < heartbeat <= 360 else 10
        self.port = port
        self.watchdog = serial.Serial(self.port, baud)
        if daemon:
            run = threading.Thread(target=self.run)
            run.daemon = False
            run.start()
            
    def _read(self, byte):
        try:
            self._write(byte)
            a = self.read()
            print(a)
        except Exception as e:
            raise Exception('Error while reading: {}'.format(e))

    def _write(self, byte):
        try:
            self.watchdog.write(bytes([byte]))
            self.watchdog.flush()
        except Exception as e:
            raise Exception('Error while writing: {}'.format(e))

    def get_info(self):
        ''' TODO: get current system info
        '''
        with open('/proc/uptime', 'r') as f:
            uptime = float(f.readline().split()[0])
            last_boot = str(timedelta(seconds = uptime))

        scheduled_restart = 0
        info = {
            'last_boot':last_boot,
            'scheduled_restart': 0,
            'timeout':self.heartbeat
        }
        return info
        
    def run(self):
        ''' Interval ( in seconds ) = n/10,
        This number will always be rounded to the closest integer.
        If daemon variable is set, run this as a thread in background
        '''
        try:
            interval = int(self.heartbeat/10)
        except Exception as e:
            logging.warn("Interval seems invalids. Error {}".format(e))

        logging.debug ("Heartbeat configured for {} second(s) intervals"
                       .format(interval*10))
        while True:
            logging.debug ("Heartbeat {}".format(interval*10))
            self._write(interval)
            time.sleep(5)

    def reset(self):
        ''' Restart Now
        '''
        logging.debug('Restart Now')
        try:
            self._write(255)
        except Exception as e:
            print('Error {}'.format(e))
            logging.warning('Error {}'.format(e))

    def change_timeout_seconds(self, timeout):
        ''' Change Heartbeat timeout
        '''
        logging.debug('Changing heart beat from {} to {}'
                      .format(self.heartbeat, timeout))
        try:
            self.heartbeat = int(timeout) if 10 < int(timeout) <= 360 else 10
        except ValueError as e:
            logging.warning('Invalid type, integer is required. Error {}'.format(e))
            raise TypeError        

    def check_internet(self):
        ''' Test internet connection
        '''
        import urllib2
        try:
            urllib2.urlopen('http://google.com', timeout=5)
            return True
        except urllib2.URLError as e: 
            return False


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    parser = argparse.ArgumentParser(
        description='Python Script to allow you to control a usb watchdog')
    parser.add_argument('port', type=str, 
                        help='Serial port to use (e.g /dev/cu.wchussetila420)')
    parser.add_argument('--hb', nargs='?', const=10, type=int, 
                        help='Maximum amount of time without a hearbeat '
                        '(e.g. 180 seconds). 10 second increments only. '
                        'Default: 10 seconds, Max: 360')
    args = parser.parse_args()
    hb = 10 if not args.hb else args.hb

    try:
        device = UsbWatchDog(args.port, hb, daemon=False)
        logging.debug('Device Information {}'.format(device.get_info()))
        device.run()

    except (KeyboardInterrupt, SystemExit):
        logging.warning("Keyboard interrupt")
        sys.exit()

Probao da pokrenem, shvatam da port nije podesen i tu sam se zaglavio.
Probao sam da pronadjem port preko dmesg | grep tty, ali bez uspeha, odnosno ili nisam nasao pravu stvar ili je ubacujem na pogresno mesto.
Pokusavao sam /dev/ttyS0, /dev/ttyAMA0 i jos neke kombinacije koje su iskakale u dmesg.

port sam ubacivao u deo:
parser.add_argument('port', type=str,

help='Serial port to use (e.g /dev/cu.wchussetila420)')

Umesto 'port'

sta dalje?
 
Poslednja izmena:
Pokusavam da namestim da USB watchdog radi na raspbianu. U pitanju je onaj standardni sa 2 releja za reset i gasenje.
LINK
Nasao sam ovo, ali ne umem da podesim.
Skripta je sledeca
Kod:
#!/usr/bin/python
import logging
import sys
import time
import serial
import argparse
import threading
from datetime import timedelta


class UsbWatchDog(object):

    def __init__(self, port, heartbeat=10, baud=9600, daemon=True):
        self.heartbeat = heartbeat if 10 < heartbeat <= 360 else 10
        self.port = port
        self.watchdog = serial.Serial(self.port, baud)
        if daemon:
            run = threading.Thread(target=self.run)
            run.daemon = False
            run.start()
            
    def _read(self, byte):
        try:
            self._write(byte)
            a = self.read()
            print(a)
        except Exception as e:
            raise Exception('Error while reading: {}'.format(e))

    def _write(self, byte):
        try:
            self.watchdog.write(bytes([byte]))
            self.watchdog.flush()
        except Exception as e:
            raise Exception('Error while writing: {}'.format(e))

    def get_info(self):
        ''' TODO: get current system info
        '''
        with open('/proc/uptime', 'r') as f:
            uptime = float(f.readline().split()[0])
            last_boot = str(timedelta(seconds = uptime))

        scheduled_restart = 0
        info = {
            'last_boot':last_boot,
            'scheduled_restart': 0,
            'timeout':self.heartbeat
        }
        return info
        
    def run(self):
        ''' Interval ( in seconds ) = n/10,
        This number will always be rounded to the closest integer.
        If daemon variable is set, run this as a thread in background
        '''
        try:
            interval = int(self.heartbeat/10)
        except Exception as e:
            logging.warn("Interval seems invalids. Error {}".format(e))

        logging.debug ("Heartbeat configured for {} second(s) intervals"
                       .format(interval*10))
        while True:
            logging.debug ("Heartbeat {}".format(interval*10))
            self._write(interval)
            time.sleep(5)

    def reset(self):
        ''' Restart Now
        '''
        logging.debug('Restart Now')
        try:
            self._write(255)
        except Exception as e:
            print('Error {}'.format(e))
            logging.warning('Error {}'.format(e))

    def change_timeout_seconds(self, timeout):
        ''' Change Heartbeat timeout
        '''
        logging.debug('Changing heart beat from {} to {}'
                      .format(self.heartbeat, timeout))
        try:
            self.heartbeat = int(timeout) if 10 < int(timeout) <= 360 else 10
        except ValueError as e:
            logging.warning('Invalid type, integer is required. Error {}'.format(e))
            raise TypeError        

    def check_internet(self):
        ''' Test internet connection
        '''
        import urllib2
        try:
            urllib2.urlopen('http://google.com', timeout=5)
            return True
        except urllib2.URLError as e: 
            return False


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    parser = argparse.ArgumentParser(
        description='Python Script to allow you to control a usb watchdog')
    parser.add_argument('port', type=str, 
                        help='Serial port to use (e.g /dev/cu.wchussetila420)')
    parser.add_argument('--hb', nargs='?', const=10, type=int, 
                        help='Maximum amount of time without a hearbeat '
                        '(e.g. 180 seconds). 10 second increments only. '
                        'Default: 10 seconds, Max: 360')
    args = parser.parse_args()
    hb = 10 if not args.hb else args.hb

    try:
        device = UsbWatchDog(args.port, hb, daemon=False)
        logging.debug('Device Information {}'.format(device.get_info()))
        device.run()

    except (KeyboardInterrupt, SystemExit):
        logging.warning("Keyboard interrupt")
        sys.exit()

Probao da pokrenem, shvatam da port nije podesen i tu sam se zaglavio.
Probao sam da pronadjem port preko dmesg | grep tty, ali bez uspeha, odnosno ili nisam nasao pravu stvar ili je ubacujem na pogresno mesto.
Pokusavao sam /dev/ttyS0, /dev/ttyAMA0 i jos neke kombinacije koje su iskakale u dmesg.

port sam ubacivao u deo:
parser.add_argument('port', type=str,

help='Serial port to use (e.g /dev/cu.wchussetila420)')

Umesto 'port'

sta dalje?

Potrazi port opet sa komandom lspci. Output dmesg-a se ponekad razlikuje od output-a koji daje lspci.
 
Potrazi port opet sa komandom lspci. Output dmesg-a se ponekad razlikuje od output-a koji daje lspci.

lspci ne radi na raspbianu izgleda. meni daje command not found, a quick google mi nije rekao nista pametno.
lsusb ne daje rezultat koji meni treba

journalctl -f
Pa onda zakačiš uređaj.

Kod:
Jun 01 18:35:34 raspberrypi kernel: usb 1-1.4: new full-speed USB device number 4 using dwc_otg
Jun 01 18:35:34 raspberrypi kernel: usb 1-1.4: New USB device found, idVendor=1a86, idProduct=7523
Jun 01 18:35:34 raspberrypi kernel: usb 1-1.4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
Jun 01 18:35:34 raspberrypi kernel: usb 1-1.4: Product: USB2.0-Serial
Jun 01 18:35:34 raspberrypi mtp-probe[880]: checking bus 1, device 4: "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4"
Jun 01 18:35:34 raspberrypi mtp-probe[880]: bus: 1, device: 4 was not an MTP device
Jun 01 18:35:34 raspberrypi kernel: usbcore: registered new interface driver usbserial
Jun 01 18:35:34 raspberrypi kernel: usbcore: registered new interface driver usbserial_generic
Jun 01 18:35:34 raspberrypi kernel: usbserial: USB Serial support registered for generic
Jun 01 18:35:34 raspberrypi kernel: usbcore: registered new interface driver ch341
Jun 01 18:35:34 raspberrypi kernel: usbserial: USB Serial support registered for ch341-uart
Jun 01 18:35:34 raspberrypi kernel: ch341 1-1.4:1.0: ch341-uart converter detected
Jun 01 18:35:34 raspberrypi kernel: usb 1-1.4: ch341-uart converter now attached to ttyUSB0
Jun 01 18:35:34 raspberrypi kernel: Under-voltage detected! (0x00050005)
Jun 01 18:35:39 raspberrypi kernel: Voltage normalised (0x00000000)
Jun 01 18:35:42 raspberrypi kernel: w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
Jun 01 18:35:42 raspberrypi kernel: w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.

da li ovo znaci da meni treba ttyUSB0?
vec sam to probavao i njie radilo. probao sada ipet sa istim rezultatom

usage: test.py [-h] [--hb [HB]] ttyUSB0
test.py: error: the following arguments are required: ttyUSB0

sve jedno da li probam /dev/ttyUSB0 ili samo ttyUSB0
 
Kako pokrećeš skriptu? Daj tačnu naredbu.
 
Kako pokrećeš skriptu? Daj tačnu naredbu.

probao sam kao "python test.py" iz /home/pi foldera
takodje sam uradio chmod i probao /home/pi/test.py
takodje sam pokusao iz instaliranog python programa python 3 idle. Kao open i u novom prozoru gde mogu da editujem skriptu run.

i za kraj, najveci uspeh koji sam imao do sada /home/pi/test.py /dev/ttyUSB0
uspevam da uradim ping i watchdog trepce, ali ne znam kako da promenim heartbeat da ne bude 10 sekundi
 
Ovako menjaš vrednost heartbeata (ide od 10 do 360, u intervalu od 10)

Kod:
/home/pi/test.py --hb 120 /dev/ttyUSB0
 
nije lako biti *mjau**mjau**mjau**mjau**mjau*
shvatio sam posle nekog vremena da uopste nisam obratio paznju na parametre. Vodio sam se nekom prastarom temom gde se vodila diskusija na staroj verziji skripte.
Ovde cak postoji i -h za help koji nisam koristio.

e sad, uspeo sam da nateram da radi i watchdog trepce svakih 5 sekundi. kada uradim :(){ :|:& };:, rpi zabode i watchdog prestane da trepce posle nekog vremena, ali ne klikne i ne resetuje.

Moracu sutra jos malo da se pozabavim ovime da vidim sta se desava.
 
Poslednja izmena:
Ne sa onom poslednjom verzijom. Nasao sam v1 skriptu tog lika i ona radi besprekorno

Kod:
#!/usr/bin/python
import sys
import serial
import time


def run():
  '''
  Interval ( in seconds ) = n/10
  This number will always be rounded to the closest integer.
  '''
  interval = 1 
  
  try:
    user_interval = int(sys.argv[2])/10
    if 0 < user_interval < 360:
      interval = user_interval
  except Exception as e:
    # Interval seems invalid. Let's ignore it.
    pass
  print "Heartbeat configured for {} second(s) intervals".format((interval*10))
  while True:
    watchdog.write(chr(interval))
    watchdog.flush()
    time.sleep(1)

usage = '''{} <port> [ <heartbeat_interval> ]

                  port: Serial port to use ( e.g. /dev/cu.wchusbserial1420 )
    heartbeat_interval: maximum amount of time without a hearbeat ( e.g. 180 seconds. 10 second increments only )
'''.format(sys.argv[0])

def reset():
  watchdog.write(chr(255))
  watchdog.flush()
  time.sleep(1)

def checkInternet():
  import urllib2
  try:
    urllib2.urlopen('http://google.com', timeout=5)
    return True
  except urllib2.URLError as err: 
    return False

if len(sys.argv)> 1:
  watchdog = serial.Serial(sys.argv[1], 9600)
  time.sleep(1)
  run()
else:
  print usage

Pokrece se neznatno drugacije, odnosno redosled je drugaciji. HB ide na kraju
/home/pi/watchdog.py /dev/ttyUSB0 180
 
Sinoc sam bas sve "dekodirao" pohvatao sta gdei i kako treba i napisao svoju bash skriptu. Radi kao svajcarac :) Skripta je bukvalno u 10 linija. Okacicu kasnije.
Ovaj momak sto je pisao python skriptu je nepotrebno iskomplikovao sve. Kod mene nece ni v1 da radi sad sam testirao na brzinu. Istu gresku izbacuje kao v2. Ali to vise nije bitno :)
 
Evo samo da javim da je delevic sredio da radi ovo i na rpi sa svojom skriptom.
On ce okaciti svoj github sa svim platformama.

Posle junacke borbe, izdejstvovao je pobedu.
 
Nazad
Vrh Dno