● HA작업)node-red 보일러온도 자동변환 function 변수로 485 패킷 보내기 인공지능 답변 작업 투닝
본문
● HA작업)node-red 온도 function 변수로 485 패킷 보내기 인공지능 답변 작업 투닝
서재7도 명령 F7 0B 01 18 02 45 14 7 00 B1 EE
서재7도 응답 F7 0D 01 18 04 45 14 7 01 17 7 A0 EE
서재8도 명령 F7 0B 01 18 02 45 14 8 00 BE EE
서재8도 응답 F7 0D 01 18 04 45 14 8 01 17 8 A0 EE
서재9도 명령 F7 0B 01 18 02 45 14 9 00 BF EE
서재9도 응답 F7 0D 01 18 04 45 14 9 01 17 9 A0 EE
서재10도 명령 F7 0B 01 18 02 45 14 A 00 BC EE
서재10도 응답 F7 0D 01 18 04 45 14 A 01 17 A A0 EE
서재11도 명령 F7 0B 01 18 02 45 14 B 00 BD EE
서재11도 응답 F7 0D 01 18 04 45 14 B 01 17 B A0 EE
서재12도 명령 F7 0B 01 18 02 45 14 C 00 BA EE
서재12도 응답 F7 0D 01 18 04 45 14 C 01 17 C A0 EE
서재13도 명령 F7 0B 01 18 02 45 14 D 00 BB EE
서재13도 응답 F7 0D 01 18 04 45 14 D 01 17 D A0 EE
에서
서재7도 명령 F7 0B 01 18 02 45 14 7 00 B1 EE
를
# =============== 질문============
서재7도 on 명령은 ["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
으로
["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
485 패킷이며 패킷정보는
0번째 "0xF7"는 시작,
6번째는 "0x14"는 방이름,
7번째는 "0x07"는 온도 패킷 변화 0x07에 hex +1 증가 (0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 입력 형태로 node-red node의 inject 입력 각각 구성 ),
8번째는 "0x00"는 방이름 스위치 on,
9번째는 "0xB1"는 XOR 계산 checksum 값이며 0번에서 8번째 까지에서 XOR로 9번째에 계산 해주고,
10번째는 "0xEE" 종료 패킷으로 고정하고
7도 명령은 node-red의 function에서 buffer로
["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
ew11에 보내는 패킷이다,
온도 8도 0x08는 변화 +1 주어 패킷 7번째 0x07를 0x08에대한 8도 명령이고 30도 까지 계산하는 node-red fuction node를 만들어 주고
이를 home assistant에서 node-red 구성하여 적용을
방법과 스위치 온도 조절하는 카드구성 방법 알려주세요
888888888888888888888888888888888
// 패킷을 생성하고 체크섬을 계산하는 함수 정의
function createPacket(temperature) {
var packet = [0xF7, 0x0B, 0x01, 0x18, 0x02, 0x45, 0x14, temperature, 0x00]; // 체크섬 전까지의 초기 패킷
packet.push(checksum(packet)); // 체크섬 추가
packet.push(0xEE); // 종료 바이트 추가
return Buffer.from(packet);
}
// XOR 체크섬을 계산하는 함수
function checksum(bytes) {
return bytes.reduce((accum, byte) => accum ^ byte) & 0xFF;
}
// Flow 변수로 저장된 현재 온도 값 혹은 7도(0x07)에서 시작
//var currentTemperature = flow.get('targetTemperature') 0x07;
// Inject 노드로부터 받은 입력 온도 값
msg.payload = parseInt(msg.payload);
if (msg.payload >= 0x07 && msg.payload <= 0x1E) { // 0x07(7도)에서 0x1D(29도) 사이의 값
// Function 노드로부터 전송할 Buffer 패킷 생성
msg.payload = createPacket(msg.payload);
} else {
node.error("입력 값이 유효 범위를 벗어났습니다.", msg);
return null; // 에러가 발생할 경우, 메시지를 전송하지 않음
}
// Node-RED의 다음 노드로 메시지 전송
return msg;
9999999999999999999999999999
@GPT-4 128k 서재7도 on 명령은 ["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
로
["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
485 패킷이며 패킷정보는
0번째 "0xF7"는 시작,
6번째는 "0x14"는 방이름,
7번째는 "0x07"는 온도 패킷 변화 0x07에 hex +1 증가 (0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 입력 형태로 node-red node의 inject 입력 각각 구성 ),
8번째는 "0x00"는 방이름 스위치 on,
9번째는 "0xB1"는 XOR 계산 checksum 값이며 0번에서 8번째 까지에서 XOR로 9번째에 계산 해주고,
10번째는 "0xEE" 종료 패킷으로 고정하고
7도 명령은 node-red의 function에서 buffer로
["0xF7","0x0B","0x01","0x18","0x02","0x45","0x14","0x07","0x00","0xB1","0xEE"]
ew11에 보내는 패킷이다,
온도 8도 0x08는 변화 +1 주어 패킷 7번째 0x07를 0x08에대한 8도 명령이고 30도 까지 계산하는 node-red fuction node를 만들어 주고
이를 home assistant에서 node-red 구성하여 적용을
방법과 스위치 온도 조절하는 카드구성 방법 알려주세요
GPT-4
128k
홈 어시스턴트(HA)에서 Node-RED를 사용하여 RS485 패킷을 관리하고 온도 조절하는 스위치 카드를 구성하는 방법을 설명드리겠습니다.
Node-RED에서 온도 조절을 위한 패킷 생성
Node-RED의 Function Node를 사용하여 각기 다른 온도에 대응하는 패킷을 생성하는 로직을 구축합니다.
// 패킷을 생성하고 체크섬을 계산하는 함수 정의
function createPacket(temperature) {
var packet = [0xF7, 0x0B, 0x01, 0x18, 0x02, 0x45, 0x14, temperature, 0x00]; // 체크섬 전까지의 초기 패킷
packet.push(checksum(packet)); // 체크섬 추가
packet.push(0xEE); // 종료 바이트 추가
return Buffer.from(packet);
}
// XOR 체크섬을 계산하는 함수
function checksum(bytes) {
return bytes.reduce((accum, byte) => accum ^ byte) & 0xFF;
}
// Flow 변수로 저장된 현재 온도 값 혹은 7도(0x07)에서 시작
var currentTemperature = flow.get('targetTemperature') 0x07;
// Inject 노드로부터 받은 입력 온도 값
msg.payload = parseInt(msg.payload);
if (msg.payload >= 0x07 && msg.payload <= 0x1E) { // 0x07(7도)에서 0x1D(29도) 사이의 값
// Function 노드로부터 전송할 Buffer 패킷 생성
msg.payload = createPacket(msg.payload);
} else {
node.error("입력 값이 유효 범위를 벗어났습니다.", msg);
return null; // 에러가 발생할 경우, 메시지를 전송하지 않음
}
// Node-RED의 다음 노드로 메시지 전송
return msg;
홈 어시스턴트에서 온도 슬라이더 구성
configuration.yaml 파일에 input slider를 추가합니다.
input_number:
heater_temperature:
name: Heater Temperature
min: 7
max: 30
step: 1
mode: slider
홈 어시스턴트에서 슬라이더를 사용하여 온도를 조절할 수 있는 카드를 추가합니다.
type: entities
entities:
- entity: input_number.heater_temperature
title: Heater Temperature Control
show_header_toggle: false
state_color: true
홈 어시스턴트 자동화로 Node-RED 연결
온도 스위치가 변경될 때마다 Node-RED에 메시지를 보내도록 자동화를 추가합니다.
automation:
- alias: "Update Heater Temperature"
trigger:
- platform: state
entity_id: input_number.heater_temperature
action:
- service: mqtt.publish
data_template:
topic: "heater/temperature/set"
payload: "{{ states('input_number.heater_temperature') }}"
Node-RED에서 MQTT 설정
Node-RED에서 mqtt in 노드를 사용하여 해당 MQTT 토픽을 구독하고, input_number.heater_temperature 엔티티로부터 온도 값이 변경될 때마다 해당 온도에 해당하는 패킷을 생성하도록 설정합니다.
생성된 패킷을 원하는 RS485 장치(ew11 등)로 전송하기 위해 serial out 노드 또는 해당 장치와 통신하기 위해 필요한 노드로 연결합니다.
이 모든 과정을 마치면, 홈 어시스턴트에서 입력받은 온도 값에 맞추어 Node-RED가 RS485를 통해 장치에 명령을 보낼 수 있습니다. 사용자는 홈 어시스턴트의 인터페이스를 통해 온도 스위치를 조절하고, 해당 명령은 Node-RED를 거쳐 RS485 패킷으로 변환되어 종단 장치에 전송됩니다.
================
@GPT-4 128k inject 10진수로 들어오는 숫자 str를
node-red에서 fuction node에서 16진수 로 출력하는
방법을 만들어주세요
GPT-4
128k
Node-RED의 function 노드를 사용하여 10진수 값을 16진수 문자열로 변환하는 방법은 매우 간단합니다. 아래의 JavaScript 코드를 function 노드 내에 사용하여 이 변환을 수행할 수 있습니다.
Node-RED 대시보드에서 새 function 노드를 추가하세요.
function 노드를 더블 클릭하고 아래의 코드를 입력하세요:
// msg.payload는 inject 노드에서 온 10진수 값이라고 가정합니다.
msg.payload = parseInt(msg.payload).toString(16).toUpperCase();
// 16진수 값이 'msg.payload'에 저장되어 있으며, 이 값을 출력합니다.
return msg;
Done을 클릭하여 설정을 저장하세요.
이 function 노드를 inject 노드 및 결과를 확인할 수 있는 debug 노드와 연결하세요.
이제, inject 노드로부터 들어오는 10진수 값을 실행할 때마다 16진수 문자열로 변환하고, 이 결과를 debug 탭에서 확인할 수 있습니다. toString(16) 함수는 숫자를 16진수로 변환하는 JavaScript 내장 함수이며, toUpperCase()를 통해 결과를 대문자로 변환합니다.
작업
1) node-red 작업
c:\Users\shimss\Downloads\flows_온도변수_onoffdelay_20231224_1556_44.json
저장 보관 합니다
☞ https://11q.kr 에 등록된 자료 입니다. ♠ 정보찾아 공유 드리며 출처는 링크 참조 바랍니다♠
관련자료
-
첨부등록일 2023.12.24 16:01
-
이전
-
다음
11qkr님의 댓글
function createPacket(temperature) {
var packet = [0xF7, 0x0B, 0x01, 0x18, 0x02, 0x45, 0x14, temperature, 0x00]; // 체크섬 전까지의 초기 패킷
packet.push(checksum(packet)); // 체크섬 추가
packet.push(0xEE); // 종료 바이트 추가
return Buffer.from(packet);
}
// XOR 체크섬을 계산하는 함수
function checksum(bytes) {
return bytes.reduce((accum, byte) => accum ^ byte) & 0xFF;
}
// Flow 변수로 저장된 현재 온도 값 혹은 7도(0x07)에서 시작
// var currentTemperature = flow.get('targetTemperature') 0x07;
// Inject 노드로부터 받은 입력 온도 값
msg.payload = parseInt(msg.payload);
if (msg.payload >= 0x07 && msg.payload <= 0x1E) { // 0x07(7도)에서 0x1D(29도) 사이의 값
// Function 노드로부터 전송할 Buffer 패킷 생성
msg.payload = createPacket(msg.payload);
} else {
node.error("입력 값이 유효 범위를 벗어났습니다.", msg);
return null; // 에러가 발생할 경우, 메시지를 전송하지 않음
}
// Node-RED의 다음 노드로 메시지 전송
return msg;
==================
// 패킷을 생성하고 체크섬을 계산하는 함수 정의
function createPacket(temperature) {
var packet = [0xF7, 0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, temperature, 0x00]; // 체크섬 전까지의 초기 패킷
packet.push(checksum(packet)); // 체크섬 추가
packet.push(0xEE); // 종료 바이트 추가
return Buffer.from(packet);
}
// XOR 체크섬을 계산하는 함수
function checksum(bytes) {
return bytes.reduce((accum, byte) => accum ^ byte) & 0xFF;
}
// Inject 노드로부터 받은 입력 처리
if (msg.payload === "ON") {
msg.payload = Buffer.from([0xF7, 0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, 0x01, 0x00, 0xB4, 0xEE]); // ON 패킷
} else if (msg.payload === "OFF") {
msg.payload = Buffer.from([0xF7, 0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, 0x04, 0x00, 0xB1, 0xEE]); // OFF 패킷
} else {
// 바이트로 변환하여 온도 값을 추출
var temperature = parseInt(msg.payload, 16);
// 온도 값인 경우, 범위 내인지 확인
if (temperature >= 0x07 && temperature <= 0x1E) {
// Buffer 패킷 생성
msg.payload = createPacket(temperature);
} else {
node.error("입력 값이 유효 범위를 벗어났습니다.", msg);
return null; // 에러가 발생할 경우, 메시지를 전송하지 않음
}
}
// Node-RED의 다음 노드로 메시지 전송
return msg;