Ad
Varmvattenberedare från Indol
Bäst online casino i Sverige
Energibutiken.se smarta varor på nätet, leverans till dörren
Annonsera i Värmepumpsforum, klicka här för att ställa e-postfråga och få mer info.
140x140vpforum-11.gif
kontakta oss för pris!
 

Författare Ämne: Nya Nibe S1256: Officiell tråd  (läst 169560 gånger)

0 medlemmar och 1 gäst tittar på detta ämne.

Utloggad muy

  • Kan värmepumpar
  • ***
  • Stad/land: Kungsbacka
  • Antal inlägg: 58
  • Karma +0/-0
  • Kön: Man
SV: Nya Nibe S1256: Officiell tråd
« Svar #225 skrivet: 10 april 2026, 23:43:21 »
Ja det är mycket som saknas. Inte dumpat till USB. Testat lite MODBUS men att läsa ut en del o det funkar fint. Men är nu inne på REST API:t som är enklare att hantera. Målet i nån mening är att begränsa effekten vid vissa tillfällen. Hittar dock inget där så är inne på att begärnsa frekvensen på kompressorn. Min/Max frekvens är dock bara läsbara men det finns ju möjligheter till stoppband. Så skall prova det vid tillfälle.

Här är lite av mina "experiment" med MODBUS...som sagt funkar bra men svårt att hitta bland registren...och fick heller inget på 6007...

from pyModbusTCP.client import ModbusClient
from pyModbusTCP import utils
import numpy as np

# TCP auto connect on modbus request, close after it

nibe_IP = "192.168.x.xx"


def get_nibe_currents(IP):
    error = False
    current = np.zeros(4, dtype  = float)
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:       
        # reg 46/47 BE3, 48/49 BE2, 50/51, BE1     
        regs = c.read_input_registers(46, 6)       
        if regs:
            regs_32bit = utils.word_list_to_long(regs[::-1])
            current[1] = regs_32bit[0] / 10
            current[2] = regs_32bit[1] / 10
            current[3] = regs_32bit[2] / 10
            current[0] = np.sum(current[1 : ]) # Total currents
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(current)

def get_nibe_power(IP):
    error = False
    power = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:       
        # reg 2166/2167
        regs = c.read_input_registers(2166, 2)
        if regs:
            regs_32bit = utils.word_list_to_long(regs[::-1])
            power = regs_32bit[0]
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(power)

def get_nibe_DM(IP):
    error = False
    DM = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:       
        # reg 11/12
        regs = c.read_holding_registers(11, 2)       
        if regs:
            regs_32bit = utils.word_list_to_long(regs[::-1])
            regs_32bit = utils.get_2comp(regs_32bit[0], val_size = 32)
            DM = regs_32bit / 10
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(DM)

def get_nibe_temp_out(IP):
    error = False
    temp_out = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:
        # reg 1
        regs = c.read_input_registers(1, 1)       
        if regs:
            regs_16bit = utils.get_2comp(regs[0], val_size = 16)
            temp_out = regs_16bit / 10
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(temp_out)

def get_nibe_temp_in(IP):
    error = False
    temp_out = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:
        # reg 26       
        regs = c.read_input_registers(26, 1)     
        if regs:
            regs_16bit = utils.get_2comp(regs[0], val_size = 16)
            temp_in = regs_16bit / 10
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(temp_in)

def get_nibe_brine(IP):
    error = False
    brine_in = 0
    brine_out = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:       
        # reg 10/11
        regs = c.read_input_registers(10, 2)       
        if regs:
            regs_16bit = utils.get_list_2comp(regs, val_size = 16)
            brine_in = regs_16bit[0] / 10
            brine_out = regs_16bit[1] / 10
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(brine_in, brine_out)

def get_nibe_comp_freq(IP):
    error = False
    comp_freq = 0
    try:
        c = ModbusClient(host = IP, auto_open = True, auto_close = True, timeout = 5)
    except ValueError:
        print("Error with host or port params")
        error = True
    if error == False:
        # reg 1046   
        regs = c.read_input_registers(1046, 1)   
        if regs:
            regs_16bit = regs[0]
            comp_freq = regs_16bit / 10
        else:
            print("read error")           
    else:
        print('Fatal error')
        error = False         
    return(comp_freq)


print('Temp out: ' + str(get_nibe_temp_out(nibe_IP)) + ' degC')
print('Temp in: ' + str(get_nibe_temp_in(nibe_IP)) + ' degC')
print('Brine in/out: ' + str(get_nibe_brine(nibe_IP)) + ' degC')
print('Power: ' + str(get_nibe_power(nibe_IP)) + ' W')
print('Comp freq: ' + str(get_nibe_comp_freq(nibe_IP)) + ' Hz')
print('Degree minutes: ' + str(get_nibe_DM(nibe_IP)))
print('Ltot, L1, L2, L3: ' + str(get_nibe_currents(nibe_IP)) + ' A')


Temp out: 5.3 degC
Temp in: 22.1 degC
Brine in/out: (23.9, 17.5) degC
Power: 14 W
Comp freq: 0.0 Hz
Degree minutes: 100.0
Ltot, L1, L2, L3: [3.8 1.5 1.3 1. ] A
« Senast ändrad: 10 april 2026, 23:48:49 av muy »
Nibe S1256-13 + FLM S45, 160 m hål (153 m aktivt). Golvvärme i ett enplans trähus, 194 kvm (20 grader) och garage, 45 kvm (10-15 grader). Ca 70 kvm av huset har takhöjd 3.70 m resten 2.5 m. Kamin som "myseldas" några gånger i månaden under vintern. Byggår 2007. Huset beläget i Kungsbacka. Separat elmätare på VP installerad i aug-08. WiFi "puck" i P1 uttaget på elmätaren. Pythonscript som styr laddström (till hybridbil) för att minska effekttoppar. Experimenterar med styrning av Nibe VP. Ellevio nätbolag.
Bytt VP från Nibe 1230 till ovan 2025.

Utloggad Pen

  • Expert på värmepump
  • ****
  • Stad/land: Södertälje
  • Antal inlägg: 388
  • Karma +0/-0
  • Inbiten GDS
SV: Nya Nibe S1256: Officiell tråd
« Svar #226 skrivet: 11 april 2026, 08:08:20 »
Generellt verkar ide'n hos Nibe vara att det som är Modbus Input Register enbart är läsbart medan det som är Holding Registers är tänkt att kunna skrivas. Men det är inte konsekvent.

Exempel:
Holding 56, Varmvattenbehov: Skrivbart och fungerar (har provat)
Holding 2505, Börvärde inne: Skrivningen ignoreras (inget fel i själva Modbus dock)
     Registret är för övrigt odokumenterat (har endast ett id-nummer)

Återkom gärna när du har testat REST. Roten tycker jag borde ge en lista på samtliga register inklusive information huruvida de är skrivbara eller ej. Sedan vet man inte om det ignoreras eller ej innan man har testat.
« Senast ändrad: 13 april 2026, 13:25:20 av Pen »
Souterränghus 2*115 kvm. Värmepump Nibe 1235 8kW installerad 2007 S1256 13kW installerad 2025. Frikyla Kinnan (Eveco) CVP-T 3kW installerad 2015. Poolvärmeväxlare 8kW installerad 2016. Logger: Cacti via Modbus/TCP.

Utloggad muy

  • Kan värmepumpar
  • ***
  • Stad/land: Kungsbacka
  • Antal inlägg: 58
  • Karma +0/-0
  • Kön: Man
SV: Nya Nibe S1256: Officiell tråd
« Svar #227 skrivet: Idag kl. 15:28:01 »
Hej, testat REST och det funkar bra. Bara läst än så länge. Liknar väldigt mycket molnet men man slipper krångla med Token osv. Nästa steg är väl att testa o skriva också  :).

Kod som gör ungefär samma sak som ovan:

Kodstycke: [Välj]
import requests
requests.packages.urllib3.disable_warnings()
from requests.auth import HTTPBasicAuth
import numpy as np

float_formatter = "{:.1f}".format
np.set_printoptions(formatter={'float_kind':float_formatter})


nibe_IP = "https://192.168.x.xx:8443"

Serial_NO = "xxxxxxxxxxxxxxxx"


# Get device points from Nibe
def get_nibe_point(url, point_id, device_id):
    error = False
    auth = HTTPBasicAuth('username', 'password')
    headers = {
            "accept": "*/*",         
            "content-type": "application/json"
    } 
    try:
        response = requests.get(url + '/api/v1/devices/' + str(device_id) + '/points/' + str(point_id), headers = headers, auth = auth, timeout = 5, verify = False)
        response.raise_for_status()
    except requests.exceptions.HTTPError as errh:
        print("HTTP Error")
        print(errh.args[0])
        error = True
    except requests.exceptions.ReadTimeout:
        print("Time out")
        error = True
    except requests.exceptions.ConnectionError:
        print("Connection error")
        error = True
    except requests.exceptions.RequestException:
        print("Exception request")
        error = True       
    if error == False:
        if response.status_code == 200:   
            message = response.json()
        elif response.status_code == 429:
            print('Too many requests !!!!!!')
        else:
            message = 'Failed'
    else:
        message = 'Fatal error'
        error = False
    return(message) 


def get_nibe_currents(url, device_id):   
    current = np.zeros(4, dtype  = float) 
    data = np.zeros(4, dtype  = dict)
    BE = np.array([27816, 27815, 27814])
    i = 1
    for point in BE:
        data[i] = get_nibe_point(url, point, device_id)
        if data[i] == 'Failed' or data[i] ==  'Fatal error':
            current[i] = 999
        else:
            current[i] = data[i]['value']['integerValue'] / data[i]['metadata']['divisor']
        i += 1
    current[0] = current[0] = np.sum(current[1 : ]) # Total currents
    return(current)

def get_nibe_power(url, device_id):   
    power = np.zeros(3, dtype  = float)
    data = np.zeros(3, dtype  = dict)
    P = np.array([22130, 1801, 1932])
    i = 0
    for point in P:   
        data[i] = get_nibe_point(url, point, device_id)
        if data[i] == 'Failed' or data[i] ==  'Fatal error':
            power[i] = 999
        else:
            power[i] = data[i]['value']['integerValue'] / data[i]['metadata']['divisor']
        i += 1
    return(power)

def get_nibe_DM(url, device_id):   
    dm = 0
    point = 781
    data = get_nibe_point(url, point, device_id)
    if data == 'Failed' or data ==  'Fatal error':
        dm = 999
    else:
        dm = data['value']['integerValue'] / data['metadata']['divisor']
    return(dm)

def get_nibe_temp_out(url,device_id):   
    temp_out = 0
    point = 4
    data = get_nibe_point(url, point, device_id)
    if data == 'Failed' or data ==  'Fatal error':
        temp_out = 999
    else:
        temp_out = data['value']['integerValue'] / data['metadata']['divisor']
    return(temp_out)

def get_nibe_temp_in(url, device_id):   
    temp_in = 0
    point = 29
    data = get_nibe_point(url, point, device_id)
    if data == 'Failed' or data ==  'Fatal error':
        temp_in = 999
    else:
        temp_in = data['value']['integerValue'] / data['metadata']['divisor']
    return(temp_in)

def get_nibe_brine(url, device_id):   
    brine = np.zeros(2, dtype  = float)
    data = np.zeros(3, dtype  = dict)
    BR = np.array([13,14])
    i = 0
    for point in BR:
        data[i] = get_nibe_point(url, point, device_id)
        if data[i] == 'Failed' or data[i] ==  'Fatal error':
            brine[i]  = 999
        else:
            brine[i] = data[i]['value']['integerValue'] / data[i]['metadata']['divisor']
        i += 1
    return(brine)

def get_nibe_comp_freq(url, device_id):   
    freq = 0
    point = 1799
    data = get_nibe_point(url, point, device_id)
    if data == 'Failed' or data ==  'Fatal error':
        freq = 999
    else:
        freq = data['value']['integerValue'] / data['metadata']['divisor']
    return(freq)


print('Temp out: ' + str(get_nibe_temp_out(nibe_IP, Serial_NO)) + ' degC')
print('Temp in: ' + str(get_nibe_temp_in(nibe_IP, Serial_NO)) + ' degC')
print('Brine in/out: ' + str(get_nibe_brine(nibe_IP, Serial_NO)) + ' degC')
print('Power (Instant, CP, CP AVG): ' + str(get_nibe_power(nibe_IP, Serial_NO)) + ' W')
print('Comp freq: ' + str(get_nibe_comp_freq(nibe_IP, Serial_NO)) + ' Hz')
print('Degree minutes: ' + str(get_nibe_DM(nibe_IP, Serial_NO)))
print('Ltot, L1, L2, L3: ' + str(get_nibe_currents(nibe_IP, Serial_NO)) + ' A')

Temp out: 12.2 degC
Temp in: 21.5 degC
Brine in/out: [20.0 17.2] degC
Power (Instant, CP, CP AVG): [14.0 0.0 0.0] W
Comp freq: 0.0 Hz
Degree minutes: 100.0
Ltot, L1, L2, L3: [3.3 1.5 1.1 0.7] A
Nibe S1256-13 + FLM S45, 160 m hål (153 m aktivt). Golvvärme i ett enplans trähus, 194 kvm (20 grader) och garage, 45 kvm (10-15 grader). Ca 70 kvm av huset har takhöjd 3.70 m resten 2.5 m. Kamin som "myseldas" några gånger i månaden under vintern. Byggår 2007. Huset beläget i Kungsbacka. Separat elmätare på VP installerad i aug-08. WiFi "puck" i P1 uttaget på elmätaren. Pythonscript som styr laddström (till hybridbil) för att minska effekttoppar. Experimenterar med styrning av Nibe VP. Ellevio nätbolag.
Bytt VP från Nibe 1230 till ovan 2025.

Utloggad muy

  • Kan värmepumpar
  • ***
  • Stad/land: Kungsbacka
  • Antal inlägg: 58
  • Karma +0/-0
  • Kön: Man
SV: Nya Nibe S1256: Officiell tråd
« Svar #228 skrivet: Idag kl. 15:33:51 »
json listan som man kan läsa ut är rejält lång och en "point" ser ut så här:

    "4": {
        "title": "Current outdoor temper\u00adature (BT1)",
        "description": "",
        "metadata": {
            "type": "metadata",
            "variableId": 4,
            "variableType": "integer",
            "variableSize": "s16",
            "unit": "\u00b0C",
            "modbusRegisterType": "MODBUS_INPUT_REGISTER",
            "shortUnit": "\u00b0",
            "isWritable": false,
            "divisor": 10,
            "decimal": 1,
            "modbusRegisterID": 1,
            "minValue": 0,
            "maxValue": 0,
            "intDefaultValue": 0,
            "change": 5,
            "stringDefaultValue": ""
        },
        "value": {
            "type": "datavalue",
            "isOk": true,
            "variableId": 4,
            "integerValue": 124,
            "stringValue": ""
        }
    },
Nibe S1256-13 + FLM S45, 160 m hål (153 m aktivt). Golvvärme i ett enplans trähus, 194 kvm (20 grader) och garage, 45 kvm (10-15 grader). Ca 70 kvm av huset har takhöjd 3.70 m resten 2.5 m. Kamin som "myseldas" några gånger i månaden under vintern. Byggår 2007. Huset beläget i Kungsbacka. Separat elmätare på VP installerad i aug-08. WiFi "puck" i P1 uttaget på elmätaren. Pythonscript som styr laddström (till hybridbil) för att minska effekttoppar. Experimenterar med styrning av Nibe VP. Ellevio nätbolag.
Bytt VP från Nibe 1230 till ovan 2025.

Utloggad muy

  • Kan värmepumpar
  • ***
  • Stad/land: Kungsbacka
  • Antal inlägg: 58
  • Karma +0/-0
  • Kön: Man
SV: Nya Nibe S1256: Officiell tråd
« Svar #229 skrivet: Idag kl. 16:03:33 »
Ett tips om man vill leka lite med python är att installera spyder:

https://www.spyder-ide.org/

Väldigt smidigt och allt funkar nästan rakt av. Sen kan man ju som jag gjort flytta koden till en RPI om den skall rulla mer 24/7. Dock så får man ju ha koll så den snurrar som den skall...
Nibe S1256-13 + FLM S45, 160 m hål (153 m aktivt). Golvvärme i ett enplans trähus, 194 kvm (20 grader) och garage, 45 kvm (10-15 grader). Ca 70 kvm av huset har takhöjd 3.70 m resten 2.5 m. Kamin som "myseldas" några gånger i månaden under vintern. Byggår 2007. Huset beläget i Kungsbacka. Separat elmätare på VP installerad i aug-08. WiFi "puck" i P1 uttaget på elmätaren. Pythonscript som styr laddström (till hybridbil) för att minska effekttoppar. Experimenterar med styrning av Nibe VP. Ellevio nätbolag.
Bytt VP från Nibe 1230 till ovan 2025.

Vill du annonsera klicka här! Varmvattenberedare från Indol
 


Annonser

Right Block

luftvärmepumpar, tillbehör, installationsmaterial, vi har allt!
Köp din bergvärmepump av oss
Vibrationsdämpare
Besök vår webshop, klicka här!
Energioffert.se
Energibutiken.se smarta varor på nätet, leverans till dörren
Annonspriser

Online just nu!

Ad
Varmvattenberedare från Indol
Bäst online casino i Sverige
Energibutiken.se smarta varor på nätet, leverans till dörren
Annonsera i Värmepumpsforum, klicka här för att ställa e-postfråga och få mer info.
140x140vpforum-11.gif
kontakta oss för pris!