Monitor การทำงานของ Rig ขุดเหรียญ Crypto ระบบ HiveOS ด้วย Home-assistant

สวัสดีคุณผู้ชมทุกท่านครับ ห่างหายการอัพเดทคลิปไปนานพอสมควรเลยนะครับสำหรับช่วงนี้ต้องขออภัยคุณผู้ชมทุกท่านด้วยครับ สำหรับวันนี้ผมจะการนำเสนอ วิธีการ Monitor การทำงานของ Rig ขุดเหรียญ Crypto ระบบ HiveOS ด้วย Home-assistant โดยเราสามารถ Monitor การทำงานของ GPU ทุกตัวไม่ว่าจะเป็น อุณหภูมิ ,อัตราการบริโภคพลังงาน ,ความเร็วรอบพัดลม รวมไปถึง HiveOS Status อื่นๆด้วยครับ ช่วยให้เราสามารถนำไปต่อยอดสร้างระบบ Automation ต่างๆได้เพิ่มเติมในอนาคตครับ ผิดตกตรงไหนต้องขออภัยด้วยนะครับ เชิญรับชมครับ

Sample Code

HiveOS Config

1. Create HiveOS File – hiveos2mqtt.sh

> sudo nano hiveos2mqtt.sh

2. Enter this script to file

#!/bin/bash
# MQTT settings
BROKER="HA IP"
TOPIC="hive_mqtt_1"
USER="mqtt_user"
PASS="mqtt password"

# Ensure mosquitto-clients is installed
dpkg -s mosquitto-clients >/dev/null 2>&1 || apt update && apt install -y mosquitto-clients

# Stream logs to MQTT
tail /var/log/hive-agent.log | while read -r line; do
    json_line=$(echo ${line} | awk -F'[<>]' {'print $2'})
    if $(echo "$json_line" | jq -e 'has("method")'); then
        mosquitto_pub -h $BROKER -t $TOPIC -u "$USER" -P "$PASS" -m "$json_line"
    fi
done
3.Setting file permission

> chmod +x /home/user/hiveos2mqtt.sh

4. Make the script run once every minute
> sudo nano /hive/etc/crontab.root

5. Enter this script to file
    * * * * * /home/user/hiveos2mqtt.sh
6. Reboot HiveOS
Home-Assistant Config

1. Add the Script to sensor.yaml

– platform: mqtt
name: hiveos_stats
state_topic: “hive_mqtt_1”
value_template: “{{ value_json.params.miner_stats.uptime }}”
json_attributes_topic: “hive_mqtt_1”
json_attributes_template: “{{ value_json.params.miner_stats | to_json }}”

– platform: mqtt
name: hiveos_params
state_topic: “hive_mqtt_1”
value_template: “{{ value_json.params.miner_stats.uptime }}”
json_attributes_topic: “hive_mqtt_1”
json_attributes_template: “{{ value_json.params | to_json }}”

Sensor Templete Script

1. Add the Script to sensor.yaml

– platform: template
sensors:

hiveos_uptime:
friendly_name: “Hive OS Uptime”
value_template: >-
{% set time = (states.sensor.hiveos_stats.attributes[‘uptime’] | int) | int %}
{% set minutes = ((time % 3600) / 60) | int %}
{% set hours = ((time % 86400) / 3600) | int %}
{% set days = (time / 86400) | int %}

{%- if time < 60 -%}
Less than a minute
{%- else -%}
{%- if days > 0 -%}
{{ days }}d
{%- endif -%}
{%- if hours > 0 -%}
{%- if days > 0 -%}
{{ ‘ ‘ }}
{%- endif -%}
{{ hours }}h
{%- endif -%}
{%- if minutes > 0 -%}
{%- if days > 0 or hours > 0 -%}
{{ ‘ ‘ }}
{%- endif -%}
{{ minutes }}m
{%- endif -%}
{%- endif -%}
# value_template: “{{ (states.sensor.hiveos_stats.attributes[‘uptime’]) }}”
# unit_of_measurement: “s”

hiveos_cpu_temp:
friendly_name: “Hive OS CPU Temp”
value_template: “{{ (states.sensor.hiveos_params.attributes[‘cputemp’][0]) }}”
unit_of_measurement: “°C”

hiveos_total_mhs:
friendly_name: “Hive OS Total MH/s”
value_template: “{{ (states.sensor.hiveos_params.attributes[‘total_khs’])/1000 }}”
unit_of_measurement: “MH/s”

hiveos_total_pwr:
friendly_name: “Hive OS Total Power Consumption”
value_template: “{{(states.sensor.gpu_0_pwr.state)|int+(states.sensor.gpu_1_pwr.state)|int+(states.sensor.gpu_2_pwr.state)|int+(states.sensor.gpu_3_pwr.state)|int+(states.sensor.gpu_4_pwr.state)|int+(states.sensor.gpu_5_pwr.state)|int}}”
unit_of_measurement: “W”

Mix AMD & Nvidia GPU

1. Add the Script to sensor.yaml

### gpu0 Nvidia
gpu_0_index:
value_template: ‘0’
friendly_name_template: “{{states.sensor.gpu_0_name.state}} Index”
gpu_0_name:
value_template: “PNY RTX3060 LHR2”
gpu_0_hash:
value_template: “{{ (states.sensor.hiveos_stats.attributes[‘hs’][states.sensor.gpu_0_index.state|int])/1000 }}”
friendly_name_template: “{{states.sensor.gpu_0_name.state}} Hash”
unit_of_measurement: “MH/s”
gpu_0_core:
value_template: “{% set t = (states.sensor.hiveos_params.attributes[‘temp’][0]) | float %}
{% set u = (states.sensor.hiveos_params.attributes[‘temp’][0]) | float %}
{{ ((u)) }}”
friendly_name_template: “{{states.sensor.gpu_0_name.state}} Core Temp”
unit_of_measurement: “°C”
gpu_0_fan:
value_template: “{% set t = (states.sensor.hiveos_params.attributes[‘fan’][0]) | float %}
{% set u = (states.sensor.hiveos_params.attributes[‘fan’][0]) | float %}
{{ ((u)) }}”
friendly_name_template: “{{states.sensor.gpu_0_name.state}} Fan Speed”
unit_of_measurement: “RPM”
gpu_0_pwr:
value_template: “{% set t = (states.sensor.hiveos_params.attributes[‘power’][0]) | float %}
{% set u = (states.sensor.hiveos_params.attributes[‘power’][0]) | float %}
{{ ((u)) }}”
friendly_name_template: “{{states.sensor.gpu_0_name.state}} Power Consumption”
unit_of_measurement: “W”

### gpu1 AMD
gpu_1_index:
value_template: ‘1’
friendly_name_template: “{{states.sensor.gpu_1_name.state}} Index”
gpu_1_name:
value_template: “XFX Radeon RX6600”
gpu_1_hash:
value_template: “{{ (states.sensor.hiveos_stats.attributes[‘hs’][states.sensor.gpu_1_index.state|int])/1000 }}”
friendly_name_template: “{{states.sensor.gpu_1_name.state}} Hash”
unit_of_measurement: “MH/s”
gpu_1_core:
value_template: “{% set t = (states.sensor.hiveos_params.attributes[‘temp’][1]) | float %}
{% set u = (states.sensor.hiveos_params.attributes[‘temp’][1]) | float %}
{{ ((u)) }}”
friendly_name_template: “{{states.sensor.gpu_1_name.state}} Core Temp”
unit_of_measurement: “°C”
gpu_1_fan:
value_template: “{{ (states.sensor.hiveos_params.attributes[‘fan’][states.sensor.gpu_0_index.state|int +1]) }}”
friendly_name_template: “{{states.sensor.gpu_1_name.state}} Fan Speed”
unit_of_measurement: “RPM”
gpu_1_pwr:
value_template: “{{ (states.sensor.hiveos_params.attributes[‘power’][states.sensor.gpu_0_index.state|int +1]) }}”
friendly_name_template: “{{states.sensor.gpu_1_name.state}} Power Consumption”
unit_of_measurement: “W”

Pure GPU AMD or Nvidia

1. Add the Script to sensor.yaml

### gpu0
      gpu_0_index:
        value_template: '0'
        friendly_name_template: "{{states.sensor.gpu_0_name.state}} Index"
      gpu_0_name:
        value_template: "1660S-ASUS1"
      gpu_0_hash:
        value_template: "{{ (states.sensor.hiveos_stats.attributes['hs'][states.sensor.gpu_0_index.state|int])/1000 }}"
        friendly_name_template: "{{states.sensor.gpu_0_name.state}} Hash"
        unit_of_measurement: "MH/s"
      gpu_0_core:
        value_template: "{{ (states.sensor.hiveos_params.attributes['temp'][states.sensor.gpu_0_index.state|int +1]) }}"
        friendly_name_template: "{{states.sensor.gpu_0_name.state}} Core Temp"
        unit_of_measurement: "°C"
      gpu_0_fan:
        value_template: "{{ (states.sensor.hiveos_params.attributes['fan'][states.sensor.gpu_0_index.state|int +1]) }}"
        friendly_name_template: "{{states.sensor.gpu_0_name.state}} Fan Speed"
        unit_of_measurement: "RPM"
      gpu_0_pwr:
        value_template: "{{ (states.sensor.hiveos_params.attributes['power'][states.sensor.gpu_0_index.state|int +1]) }}"
        friendly_name_template: "{{states.sensor.gpu_0_name.state}} Power Consumption"
        unit_of_measurement: "W"

### gpu1...
Goto Top