www.errorediridondanzaciclicodotcom

  • HOME
  • DALLAS MANAGE
  • BACK P.P.

  • COME GESTIRE LE DALLAS SENZA SFORZO

    In questa pagina spiego il mio script per aggiungere, eliminare o modificare le Dallas in python in modo automatico.

    Per il corretto cablaggio e una spiegazione del codice per la lettura, potete vedere questa pagina.

    Capita a chi crea della domotica di avere più sensori di temperatura one-wire (le solite Dallas 18b20) che possono variare in numero o essere sostituite tra modelli diversi. Ogni volta che si deve introdurre una nuova sonda bisogna andare nella directory e leggere il codice, assegnare un nome e modificare gli script per leggere la nuova sonda.
    Per evitare questo lavoro ho pensato di creare uno script che permetta la gestione delle Dallas in maniera automatica, concentrandoci solo sul nome che vogliamo assegnare.

    Questo script andrà lanciato la prima volta che si collegano le Dallas e, successivamente, ad ogni cambio o aggiunta di sensore. Si può anche lanciare solo per vedere la lista dei sensori con i rispettivi nomi
    In caso di cambio di un sensore, rimanendo comunque la vecchia directory in memoria, è meglio spegnere il raspi dopo avere collegato il nuovo sensore e riaccenderlo. In questo modo la sostituzione della directory è immediata e lo script chiederà semplicemente il nuovo nome (o quello di prima).
    Anche senza seguire la procedura sopra lo script verificherà il numero di dir delle Dallas e il numero di sensori nel file .json e provvederà alla cancellazione di quello vecchio semplicemente rilanciadolo una seconda volta, dopo la registrazione del nuovo nome.

    Questo è lo screenshot de lancio dello script la prima volta:


    Si vede che lo script non ha trovato nessun file .json esistente, quindi legge le directories delle Dallas presenti sul dispositivo e, per ognuna di esse, chiede il nome del sensore da abbinare.
    Alla fine riporta il file .json creato dove è possibile vedere tutti gli abbinamenti.

    Qui sotto il codice completo:

    import os
    import glob
    import time
    import json

    istruzioni per definire l'elenco delle dallas inserite - obbiettivo: definire list e lunghezza list
    base_dir = '/sys/bus/w1/devices/'
    device_folder = glob.glob(base_dir + '28*')
    list=device_folder
    lenlist = len(device_folder)

    Se il file esiste e ci sono dei sensori, procedo
    if os.path.isfile('sens.json') and lenlist > 0:

    print('file exists')

    apro il file json in lettura e con load del json leggo i dati in data
    with open('sens.json', 'r') as file:
    data = json.load(file)
    lendata=len(data)

    caso uno: il numero di dallas collegate è inferiore al numero di sensori nel json
    if lenlist < lendata:

    creo un dict temporaneo
    data1={}
    itero in data per key e value (posso chiamarli come voglio!)
    for key, value in data.items():

    se la key iterante è nella list (elenco directories)
    if key in list:

    print(";json key already in list: ";+key, value)

    scrivo il key e il valore nel dict temporaneo
    data1[key] = value

    dopo avere iterato tutte gli item in data apro il file json e scrivo (serializzo) il nuovo dict
    with open('sens.json', 'w') as file:

    json.dump(data1, file)
    print(data1)

    assegno il nuovo dict (data1) al vecchio data
    data=data1

    dopo avere verificato se lenlist minore di lendata eseguo un altro controllo: per ogni elemento della list controllo se esso è nelle keys del dict di json, se non lo è, creo il nuovo sensore. Io ho una dir della nuova dallas ma non ho assegnato il nome. Scelgo il nome con input e lo aggiungo insieme alla dir al dict data. Scrivo infine il dict aggiornato sul file json.
    for i in range(lenlist):

    if list[i] in data.keys():
    print(";list already in json: "; +list[i])

    elif list[i] not in data.keys():
    new=input('sensor name: ')
    data[list[i]] = new

    with open('sens.json', 'w') as file:
    json.dump(data, file)

    questo è invece il caso non esista nessun file json
    else:
    print('No file')

    inizializzo il dict
    data={}

    creo un file json e lo inizializzo con il dict vuoto
    with open('sens.json', 'w') as file:
    json.dump(data, file)

    itero le dir delle dallas che sono collegate, inserisco il nome
    e lo aggiungo al dict data

    for i in range(lenlist):
    new=input('sensor name: ')
    data[list[i]] = new

    riscrivo il dict completato nel file json
    with open('sens.json', 'w') as file:
    json.dump(data, file)

    print(data)


    Nella pagina seguente mostro come utilizzare questo script per la modifica dei sensori di cui leggiamo i valori di temperatura.
    Colgo anche l'occasione per spiegare da niubbo come utilizzare le CLASSI in Python, utilizzando il codice per descrivere concretamente i passi da seguire.