코딩정보




● HA작업)node-red 보일러온도 자동변환 function 변수로 485 패킷 보내기 인공지능 답변 작업 투닝

♨ 카랜더 일정 : 2023년12월23일
  • 링크

  • 첨부

  • 컨텐츠 정보

    본문

    ● 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

    를 

    3232235521_1703334529.1372.png

    3232235521_1703334470.8678.png

    3232235521_1703334561.619.png

    # =============== 질문============


    서재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 패킷으로 변환되어 종단 장치에 전송됩니다.

    ================

    3232235521_1703335032.1955.png

    @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 작업

    3232235521_1703401155.0577.png

    c:\Users\shimss\Downloads\flows_온도변수_onoffdelay_20231224_1556_44.json

    저장 보관 합니다

    3232235521_1703401244.8852.png

    ☞ https://11q.kr 에 등록된 자료 입니다. ♠ 정보찾아 공유 드리며 출처는 링크 참조 바랍니다♠1.png

    [ 추가 정보 ... 더보기) ]
    뷰PDF 1,2



    office view

    관련자료

    댓글목록

    profile_image

    11qkr님의 댓글

    11qkr 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 아이피 (192.♡.0.1) 작성일

    ew11장비와 node-red만으로 간단히 온도 변화에대한 구성
    c:\Users\shimss\Downloads\flows_온도변수_onoffdelay_20231224_1556_44.json

    답변
    profile_image

    11qkr님의 댓글

    11qkr 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 아이피 (192.♡.0.1) 작성일

    // 패킷을 생성하고 체크섬을 계산하는 함수 정의
    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;

    답변



    ♥간단_메모글♥


    최근글


    새댓글



    PHP 안에 HTML ☞ 홈페이지 화면갱신 시간은 ♨
    ▶ 2024-05-02 17:53:50

    오늘의 홈 현황


    • 현재 접속자♨ 261 명
    • 오늘 가입자※ 0 명
    • 어제 가입자※ 4 명
    • 주간 가입자※ 16 명
    • 오늘 방문자 1,563 명
    • 어제 방문자 1,557 명
    • 최대 방문자 13,042 명
    • 전체 방문자 4,299,451 명
    • 전체 게시물※ 8,549 개
    • 전체 댓글수※ 24,546 개
    • 전체 회원수 10,944 명

    QR코드


    ☞ QR코드 스캔은 kakao앱 자체 QR코드

    알림 0








    최신글↑