ส่งค่าอุณหภูมิจาก Pi ไป Home Assistant แบบ Docker
ต่อจาก
https://intranet.scivalve.com/blog.php?u=281&b=2051
1. ตัว HA ลงแบบ Docker ก็ต้อง Mosquitto ด้วย Docker container
1.1. สร้างโฟลเดอร์เก็บ config/data/log ของ Mosquitto:
- mkdir -p /HA/mosquitto/config /HA/mosquitto/data /HA/mosquitto/log
1.2. สร้างไฟล์ config
- nano /HA/mosquitto/config/mosquitto.conf
1.3. ใส่ค่า
แบบใช้ได้หมด ไม่ต้องใส่ use password ไม่ปลอดภัย
- persistence true
- persistence_location /mosquitto/data/
- log_dest file /mosquitto/log/mosquitto.log
- allow_anonymous true
- listener 1883
แบบตั้ง user password
- persistence true
- persistence_location /mosquitto/data/
- log_dest file /mosquitto/log/mosquitto.log
- allow_anonymous false
- password_file /mosquitto/config/password.txt
- listener 1883
1.4. สร้าง user ด้วยคำสั่ง
docker run --rm -it \
- -v /HA/mosquitto/config:/mosquitto/config \
- eclipse-mosquitto mosquitto_passwd -c /mosquitto/config/password.txt hauserXXXXX
มันจะถาม password ให้คุณใส่ → เก็บไว้ใน /HA/mosquitto/config/password.txt
1.5. รัน container Mosquitto:
- docker run -d \
- --name mosquitto \
- -p 1883:1883 \
- -p 9001:9001 \
- -v /HA/mosquitto/config:/mosquitto/config \
- -v /HA/mosquitto/data:/mosquitto/data \
- -v /HA/mosquitto/log:/mosquitto/log \
- eclipse-mosquitto
1.6. Restart Mosquitto
- docker restart mosquitto
1.7. ทดสอบ ที่เครื่อง HA Run
- mosquitto_sub -h localhost -p 1883 -u "hauser" -P "รหัสผ่าน" -t "#"
1.8. ที่เครื่องเรา ติดตั้ง
- apt install mosquitto-clients -y
แล้วลองส่งค่าไป
- mosquitto_pub -h 192.168.2.5 -p 1883 -u "xxx" -P "xxxx" -t "test/topic" -m "Hello MQTT"
- mosquitto_pub -h 192.168.2.5 -p 1883 -u "xxx" -P "xxxx" -t "hass/sensor/temperature" -m "27"
ที่ Terminal ของ HA จะต้องเห็นข้อความ Hello MQTT
1.9. ที่ เครื่อง HA เพิ่ม ที่ไฟล์ configuration.yaml เป็น Sensor และรอรับค่า MQTT
- mqtt:
- sensor:
- - name: "Server Temp."
- state_topic: "hass/sensor/temperature"
- value_template: "{{ value_json.temperature }}"
- unit_of_measurement: "°C"
- - name: "Server Hum."
- state_topic: "hass/sensor/temperature"
- value_template: "{{ value_json.humidity }}"
- unit_of_measurement: "%"
1.10. เข้า Setting --> Devices & Services Add integration MQTT เข้าไปด้วย
ใส่ IP User Password
1.11. ที่เครื่อง pi ทดลอง run python Code temp2mqtt.2.5.py
- #!/usr/bin/python3
- import sys
- import Adafruit_DHT
- import time, json
- import RPi.GPIO as GPIO
- import paho.mqtt.client as mqtt
- import requests
- # Config
- MQTT_BROKER = "192.168.2.5" # IP ของ Home Assistant
- MQTT_PORT = 1883
- MQTT_USER = "xx"
- MQTT_PASSWORD = "xx"
- MQTT_TOPIC = "hass/sensor/temperature"
- SENSOR = Adafruit_DHT.AM2302 # หรือ DHT11 แล้วแต่ที่ใช้
- PIN = 4 # GPIO ที่ต่อ sensor
- # Connect MQTT
- client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
- client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
- client.connect(MQTT_BROKER, MQTT_PORT, 60)
- # Try to grab a sensor reading. Use the read_retry method which will retry up
- # to 15 times to get a sensor reading (waiting 2 seconds between each retry).
- humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
- # Un-comment the line below to convert the temperature to Fahrenheit.
- # temperature = temperature * 9/5.0 + 32
- from datetime import datetime
- if humidity is not None and temperature is not None:
- print('Temp={0:0.1f}* Humidity={1:0.1f}% Date={2}'.format(temperature, humidity, datetime.today().strftime('%Y-%m-%d %H:%M:%S')))
- payload = {
- "temperature": round(temperature, 2),
- "humidity": round(humidity, 2)
- }
- #print('{0}'.format(json.dumps(payload)))
- client.publish(MQTT_TOPIC, json.dumps(payload))
แก้ Code ให้ส่ง MQTT ไป 2 เครื่อง
- #!/usr/bin/python3
- import Adafruit_DHT
- import time, json
- from datetime import datetime
- import paho.mqtt.client as mqtt
- # Config broker 1
- MQTT_BROKER1 = "192.168.0.187"
- MQTT_PORT1 = 1883
- MQTT_USER1 = "xxx"
- MQTT_PASSWORD1 = "xxx"
- BROKER1_TOPIC = "hass/sensor/temperature"
- # Config broker 2
- MQTT_BROKER2 = "192.168.2.5"
- MQTT_PORT2 = 1883
- MQTT_USER2 = "xxx"
- MQTT_PASSWORD2 = "xxx"
- BROKER2_TOPIC = "hass/sensor/temperature"
- SENSOR = Adafruit_DHT.AM2302
- PIN = 4
- # อ่านค่าจาก DHT
- humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
- if humidity is not None and temperature is not None:
- payload = {
- "temperature": round(temperature, 2),
- "humidity": round(humidity, 2)
- }
- print(f"Publish: {payload} at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
- # ส่งไป broker 1
- client1 = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
- client1.username_pw_set(MQTT_USER1, MQTT_PASSWORD1)
- client1.connect(MQTT_BROKER1, MQTT_PORT1, 60)
- client1.publish(BROKER1_TOPIC, json.dumps(payload))
- client1.disconnect()
- # ส่งไป broker 2
- client2 = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
- client2.username_pw_set(MQTT_USER2, MQTT_PASSWORD2)
- client2.connect(MQTT_BROKER2, MQTT_PORT2, 60)
- client2.publish(BROKER2_TOPIC, json.dumps(payload))
- client2.disconnect()
No comments:
Post a Comment