From 66b5076208f98e78b6dde6bf923b20980ced6b9e Mon Sep 17 00:00:00 2001
From: Benji <46675043+BenjiU@users.noreply.github.com>
Date: Fri, 24 Jan 2020 14:21:38 +0100
Subject: [PATCH] Adding support for 1wire sensors DS18S20 and co (#80)

* Create ds18b.py

* Update and rename pi_mqtt_gpio/module/ds18b.py to pi_mqtt_gpio/modules/ds18b.py

* testing DS18B

* add config example

* Update README.md

Adding ds18b sensor module documentation and example.

* Update README.md

* Delete server.py

* accidently deleted server.py

* fix after testing

Co-authored-by: Ellis Percival <github.com@failcode.co.uk>
---
 README.md                     | 12 +++++++++++
 config.example.yml            | 14 ++++++++++--
 pi_mqtt_gpio/modules/ds18b.py | 40 +++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 pi_mqtt_gpio/modules/ds18b.py

diff --git a/README.md b/README.md
index 88703b1..5492f95 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,7 @@ Sensors
 - LM75 i2c temperature sensor (`lm75`)
 - DHT11 DHT22 AM2302 temperature/humidity sensor (`dht22`)
 - BH1750 light level sensor (`bh1750`)
+- DS18S20, DS1822, DS18B20, DS1825, DS28EA00, MAX31850K one-wire temperature sensors: (`ds18b`)
 
 Installation
 ------------
@@ -148,6 +149,17 @@ sensor_inputs:
     interval: 10
     digits: 2
     
+sensor_modules:
+  - name: ds18b22
+    module: ds18b
+    type: DS18S20
+    address: 000803702e49
+
+sensor_inputs:
+  - name: ds18b22
+    module: ds18b22
+    interval: 60
+    digits: 2
 ```
 
 #### SSL/TLS
diff --git a/config.example.yml b/config.example.yml
index 9fcc900..156bf83 100644
--- a/config.example.yml
+++ b/config.example.yml
@@ -24,6 +24,11 @@ sensor_modules:
     i2c_bus_num: 1
     chip_addr: 0x48
 
+  - name: ds18b22
+    module: ds18b
+    type: DS18S20
+    address: 000803702e49
+
 digital_inputs:
   - name: button
     module: raspberrypi
@@ -57,7 +62,12 @@ digital_outputs:
     off_payload: "OFF"
 
 sensor_inputs:
-  - name: temperature
+  - name: temp_lm75
     module: lm75
     interval: 15
-    digits: 4
\ No newline at end of file
+    digits: 4
+
+  - name: temp_dsb18
+    module: ds18b22
+    interval: 10
+    digits: 2
diff --git a/pi_mqtt_gpio/modules/ds18b.py b/pi_mqtt_gpio/modules/ds18b.py
new file mode 100644
index 0000000..5a47f53
--- /dev/null
+++ b/pi_mqtt_gpio/modules/ds18b.py
@@ -0,0 +1,40 @@
+from pi_mqtt_gpio.modules import GenericSensor
+
+REQUIREMENTS = ("w1thermsensor",)
+ALLOWED_TYPES = ["DS18S20", "DS1822", "DS18B20", "DS1825", "DS28EA00", "MAX31850K"]
+CONFIG_SCHEMA = {
+    "address": dict(type="string", required=True, empty=False),
+    "type": dict(
+        type="string", required=True, empty=False, allowed=ALLOWED_TYPES + list(map(str.lower, ALLOWED_TYPES))
+    ),
+}
+
+class Sensor(GenericSensor):
+    """
+    Implementation of Sensor class for the one wire temperature sensors. DS18B etc.
+    """
+
+    def __init__(self, config):
+        from w1thermsensor import W1ThermSensor
+         
+        sensor_config_type = config["type"]
+        
+        #get the sensor type mapping
+        self.sensor_type = None
+        for w1_sensor_type, w1_sensor_name in W1ThermSensor.TYPE_NAMES.items():
+            if w1_sensor_name.lower() == sensor_config_type.lower():
+                self.sensor_type = w1_sensor_type
+                
+        # initialization failed
+        if self.sensor_type is None:
+            raise Exception("Supported sensor types: " + str(W1ThermSensor.TYPE_NAMES.values()))
+     
+        self.sensor = W1ThermSensor(self.sensor_type, config["address"].lower())
+
+    def setup_sensor(self, config):
+        return True  # nothing to do here
+
+    def get_value(self, config):
+        """get the temperature value from the sensor"""
+        temperature = self.sensor.get_temperature()
+        return temperature
-- 
GitLab