Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- import sys
- import time
- from pathlib import Path
- class CRCError(ValueError):
- pass
- class DeviceNotExistsError(ValueError):
- pass
- class ReadError(ValueError):
- pass
- class W1:
- """
- Temperatur eines w1_slave lesen
- Beispieldaten:
- 24 01 4b 46 7f ff 0c 10 48 : crc=48 YES
- 24 01 4b 46 7f ff 0c 10 48 t=18250
- Ergebnis: 18.25 °C
- """
- def __init__(self, device: str, check_crc: bool = False):
- """
- device := eindeutige ID des W1 Sensors
- check_crc := Wenn True, dann wird der CRC check gelesen
- und bei einem ungültigen CRC wird ein CRCError ausgelöst
- """
- self.device = Path("/sys/bus/w1/devices", device, "w1_slave")
- self.check_crc = check_crc
- if not self.device.exists():
- raise DeviceNotExistsError(f"Device {self.device} not found", self.device)
- def _crc(self, data: str) -> None:
- """
- Prüfen ob der CRC stimmt.
- Wenn der CRC nicht OK ist, wird ein CRCError ausgelöst.
- """
- if not re.search(r"crc=\d+ YES", data):
- raise CRCError("CRC is not ok", self.device)
- def read(self) -> float:
- """
- Temperatur auslesen und als float zurückgeben
- """
- try:
- data = self.device.read_text()
- except PermissionError:
- raise ReadError("Permission denied.", self.device)
- if self.check_crc:
- self._crc(data)
- if not (match := re.search(r"t=(\d+)", data)):
- raise ReadError("Could not find t=xxxx", self.device)
- return int(match.group(1)) / 1_000
- __call__ = read
- if __name__ == "__main__":
- FUEHLER = ("28-0217c123ceff", "28-0217c123ceff", "28-0516b586b1ff")
- # ich bevorzuge nicht veränderbare Sequenzen als KONSTANTEN
- # die Tuple ist nicht veränderbar
- # str und bytes sind auch nicht veränderbar
- # die runden Klammern kann man auch weg lassen
- # nun die W1 Objekte mit einer List Comprehension erzeugen
- try:
- w1_sensoren = [W1(fuehler) for fuehler in FUEHLER]
- except Exception as e:
- print(e.args[0])
- # programm verlassen, da w1_sensoren nicht existiert,
- # wenn beim Erstellen der Liste ein Fehler auftritt
- raise SystemExit()
- while True:
- time.sleep(2)
- sensor_values = [sensor() for sensor in w1_sensoren]
- # das Resultierende Objekt der Klasse W1 ist aufrufbar (callable),
- # da die Methode __call__ implementiert ist, die dann
- # die Methode read aufruft.
- # Alternativ der direkte Aufruf von read:
- # sensor_values = [sensor.read() for sensor in w1_sensoren]
- print(sensor_values)
Add Comment
Please, Sign In to add comment