Ad
CitCop - Värmepumpar med installation i hela Sverige
Besök oss idag
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!

Skriv svar

Varning - medan du läste inläggen, hann 34 nya svar postas i ämnet. Du kanske bör se över ditt inlägg.
Varning: Det har inte skrivits nya inlägg i detta ämne på 50 dagar.
Om du inte är säker på att du faktiskt vill svara i det här ämnet, så bör du överväga att istället starta ett nytt ämne.
Namn:
E-post:
Ämne:
Inläggsikon:

Verifiering:
This box must be left blank:

Skriv in bokstäverna som syns på bilden
Lyssna på bokstäverna muntligt / Begär en ny bild

Skriv in bokstäverna som syns på bilden:
Skriv in de tre sista bokstäverna i alfabetet:
Hur många var de älva dragspelarna (siffror):

För att slippa svara på kontrollfrågor, registrera dig här!


Ämnessammanfattning

Skrivet av: Bergen77
« skrivet: 11 september 2021, 03:47:20 »

Hvordan går det prosjektet? Hva har dere satt som timout?
Skrivet av: Krtek
« skrivet: 11 maj 2021, 13:51:40 »

Hej,

lite uppdatering till mina tidigare inlägg i det här ämnet. Jag har laborerat en del den här våren med att få Niben ansluten till hemautomationen och därtill även med målet att få en bättre styrning än Nibes orginal. Ifall ärendet intresserar nån annan så tänkte jag kort beskriva hur jag gått till väga och vilken hård- och mjukvara jag använt.

Jag har då Nibes F2120-16 pump och styningen med den gamla modellen (F) av SMO40.

Till detta köpte jag en raspberry pi 4b 4gb med strömkälla och en adapter usb-rs485 samt ett minneskort. Allt tillsammans kostade väl dryga 120 euro köpt i affär här i Finland. På nätet får man säkert billigare.

På raspberryn kör jag OpenHAB (v 3.1.0.M4) och har kompletterat med Nibe Heatpump binding och Nibe Uplink binding. Nibe Heatpump bindingen emulerar Modbus40 men utan att man behöver köpa Nibes dyra låda. Uplink bindingen har jag paralellt för att hålla kontroll på så inte raspberryn tiltar. Akilleshälen här är nämligen att ifall raspberryn slutar svara så går värmepumpen i felläge.

https://www.openhab.org/addons/bindings/nibeheatpump/#supported-things

https://www.openhab.org/addons/bindings/nibeuplink/

Med hjälp av dessa går det då att läsa samtliga modbusregister i pumpen/styret och efter en del försök och misstag även skriva till behövliga register med hjälp av hemautomationen.

Nu återstår det att testa det hela i praktiken och se ifall kombinationen är pålitlig eller om man måste till med nån form av vakthund på raspberryn för att kunna boota den vid behov.

Detta då ifall det är nån annan som är intresserad av ett budgetalternativ till inköp av modbus40 för styrande av sin Nibe. Stort tack även till @Bergen77 för hjälp och stöd under projektets gång.
Skrivet av: tipo874
« skrivet: 09 mars 2021, 22:00:02 »

Ethernet rakt in. Kör kablat nät så mycket det går.
Skrivet av: Uffen
« skrivet: 09 mars 2021, 19:42:06 »

Man kunde ju önska att Nibe gjort som SolarEdge. Min SolarEdge växelriktare tankar normalt upp driftdata till SolarEdges molntjänst och man kan övervaka det via en webbläsare eller deras app, men man också köra modbus över TCP till växelriktaren direkt. Ingen extra hårdvara behövs.

Nu tvivlar jag på att man kan styra så mycket i växelriktaren, det är mest solen som styr där.

Min gamla F1245-12 har inget nätverk, men de nyare är ju klara för detta från början.
Kommunicerar du med växelriktaren via deras wifi modul eller har har du nätverk rakt in i den?
Skrivet av: Bergen77
« skrivet: 08 mars 2021, 09:55:45 »

Er det forresten noen som vet om man kan oppgradere software på modbus-40?
Nibe krever timeout på hele 2,1 sekund, ikke i henhold til standarden altså. Man er avhengig av en modbus master som takler unaturlig høy timeout.
Skulle gjerne sett at modbus-40 svarte raskere...
Skrivet av: Bergen77
« skrivet: 06 mars 2021, 10:40:53 »

Eftersom NIBE uppdaterad mjukvaran så maskin började fungera bra la jag ner mitt projekt. Annars var det väl på väg att börja fungera ungefär som tänkt, jag styrde cirkulationspumpen efter utetemp och labbade med att tvinga kompressorn till önskad frekvens genom att sätta spärrbanden beroende på vad jag ville.
Nibe sin programvare har blitt bedre, men så lenge Nibe tviholder på gradminutter på en inverterpumpe så blir reguleringen aldri god nok.
Nibe kunne gjort bruk av gradminutt valgfritt slik at vi med romtermostater også kunne få en varmepumpe som fungerer.

Jeg fraråder alle å kjøpe inverter-varmepumpe som bruker gradminutter, vi er ferdig med steinalderen nå!
Skrivet av: Bergen77
« skrivet: 06 mars 2021, 10:36:06 »

Jag försöker fundera ut ifall man med modbusens hjälp kunde få bättre och mer hanterbara verktyg att styra pumpen med.

Har du nån programvara som snurrar i datorn och kontinuerligt justerar parametrarna via modbus efter behov och väder eller hur har du löst det?
Jeg har en ekstern logikk som lytter på modbus registre og påvirker varmepumpen. Dette har surret og gått i 2 år og virker fint. Ettersom Nibe ikke klarer å lage software som fungerer fortsetter jeg å med dette. Om logikken slutter å virke vil Nibe operere på egenhånd.
Skrivet av: 944_Driver
« skrivet: 05 mars 2021, 23:02:50 »

Eftersom NIBE uppdaterad mjukvaran så maskin började fungera bra la jag ner mitt projekt. Annars var det väl på väg att börja fungera ungefär som tänkt, jag styrde cirkulationspumpen efter utetemp och labbade med att tvinga kompressorn till önskad frekvens genom att sätta spärrbanden beroende på vad jag ville.

// Magnus
Skrivet av: tipo874
« skrivet: 05 mars 2021, 18:14:57 »

Man kunde ju önska att Nibe gjort som SolarEdge. Min SolarEdge växelriktare tankar normalt upp driftdata till SolarEdges molntjänst och man kan övervaka det via en webbläsare eller deras app, men man också köra modbus över TCP till växelriktaren direkt. Ingen extra hårdvara behövs.

Nu tvivlar jag på att man kan styra så mycket i växelriktaren, det är mest solen som styr där.

Min gamla F1245-12 har inget nätverk, men de nyare är ju klara för detta från början.
Skrivet av: Krtek
« skrivet: 05 mars 2021, 16:42:19 »

Ja det går fint å sette modbus registre ved hjelp av Modbus 40. Men å sette frekvensen direkte er ikke mulig. Men man kan både skrive gradminutter, varmekurve, kurveforskyvning og mye annet. Nibes modbus grensesnitt er tregt og man må kunne sette lang timeout på sin modbus master.

Hej,

Mange tack för svar!

Jag försöker fundera ut ifall man med modbusens hjälp kunde få bättre och mer hanterbara verktyg att styra pumpen med.

Har du nån programvara som snurrar i datorn och kontinuerligt justerar parametrarna via modbus efter behov och väder eller hur har du löst det?

Mvh,
Skrivet av: Bergen77
« skrivet: 05 mars 2021, 03:02:21 »

Nu vet jag inte om det är möjligt men satt och tittade på Modbus 40 modulen, går det att styra pumpen via denna eller är modulen närmast för loggning och uppföljning av pumpen?
Ja det går fint å sette modbus registre ved hjelp av Modbus 40. Men å sette frekvensen direkte er ikke mulig. Men man kan både skrive gradminutter, varmekurve, kurveforskyvning og mye annet. Nibes modbus grensesnitt er tregt og man må kunne sette lang timeout på sin modbus master.
Skrivet av: Krtek
« skrivet: 04 mars 2021, 21:18:54 »

Gammal tråd men försöker trots det.

Jag skulle vilja hitta bättre verktyg för att styra och tämja F2120 pumpen och många gånger synes det mig att SMO40:s logik och agerande är långt ifrån sunt och ekonomiskt driftsmässigt.

Känns som SMO:n främst strävar till att köra bort gradminuterna fortast möjligt med högsta möjliga fart för att sedan ta paus. Jag skulle vilja hitta ett sätt där jag externt kunde ge pumpen kommandon tex gällande driftshastighet, typ 40hz eller så. Jag har ställt kompressorkuva mm och twekat det man i stort sett kan göra från SMO:n men tycker det fortfarande är långt från optimalt.

Nu vet jag inte om det är möjligt men satt och tittade på Modbus 40 modulen, går det att styra pumpen via denna eller är modulen närmast för loggning och uppföljning av pumpen?

Jag ser i denna  tråd att det är några av medlemmarna på forumet som har labbat en del med Nibes modbus kommunikation och hoppas således att ni kan dela med er lite av vad ni kommit fram till.

Tack på förhand!

Skrivet av: Bergen77
« skrivet: 30 januari 2018, 23:26:18 »

Googla "elektronikforum teamt"  ;) Hör av dig om du vill hjälpa till.
tummenupp
Skrivet av: TeamT
« skrivet: 30 januari 2018, 22:35:10 »

Tyvärr råder det brist på hobby tid i mitt liv så jag har inte gjort något vettigt av detta ännu. Det är fortfarande bara en provisorisk uppkoppling som ligger i pannrummet och väntar...

@Team T, vad är det du har för planer? Själv försöker jag tämja 1x55 pumpens envisa självsvängningar...

// Magnus

Googla "elektronikforum teamt"  ;) Hör av dig om du vill hjälpa till.
Skrivet av: Bergen77
« skrivet: 24 januari 2018, 15:25:11 »

Själv försöker jag tämja 1x55 pumpens envisa självsvängningar...
Jeg har endel tanker rundt dette men ønsker ikke å diskutere det i åpent forum.
Skrivet av: 944_Driver
« skrivet: 24 januari 2018, 15:19:21 »

Tyvärr råder det brist på hobby tid i mitt liv så jag har inte gjort något vettigt av detta ännu. Det är fortfarande bara en provisorisk uppkoppling som ligger i pannrummet och väntar...

@Team T, vad är det du har för planer? Själv försöker jag tämja 1x55 pumpens envisa självsvängningar...

// Magnus 
Skrivet av: Bergen77
« skrivet: 22 januari 2018, 21:59:30 »

Hvor mange her er det som har mulighet for å snakke med pumpen via modbus nå? Ser flere leser av men er det noen som skriver til pumpen?
Skrivet av: TeamT
« skrivet: 07 januari 2018, 21:13:55 »

Hej !

Många tack för denna tråd och info om protokollet.

Ser att det kommer ett paket med 5C 00 20 EE 00 CE.

Är det någon som har koll på vad cmd EE används till?

/ TeamT

Skrivet av: Bergen77
« skrivet: 19 november 2017, 00:46:55 »

Två exempel från dagens test.

40940
5C 0 20 6A 6 EC 9F 92 F4 FF FF 59
värdet blir då -2926 eller -291,6 GM

43005
5C 0 20 6A 6 FD A7 73 F4 0 0 91
värdet blir då -2957 eller -295,7 GM
 
Er det slik at du kan lese GM fra både 40940 og 43005? Hos meg kan jeg lese begge men 43005 oppdaterer seg ikke med mindre jeg selv skriver til registeret. Jeg leser samme verdi som displayet på 40940 mens på 43005 leser jeg ikke ut noe. Derimot kan jeg skrive til 43005 og endre GM i displayet, etter å ha skrevet verdien kan jeg også lese verdien tilbake.

47206 får jeg fortsatt ikke noe fornuftig verdi fra.
I firmware 8218R2 står det i changeloggen: MODBUS40: Improved control of 32-bites register
Skrivet av: 944_Driver
« skrivet: 18 november 2017, 23:49:49 »

Fortfarande inte uppdaterat mjukvaran, kvar på 7998R3
Alla, typ 15, register jag testat att läsa ger mig rätt resultat.
Det som är lite förvånande eller felaktigt är att nibe alltid skickar 4 bytes data även om det bara är en eller två bytes som innehåller något. Längden är dock rätt, alltid 6 när man frågar efter data, så får man själv hålla ordning på hur många bytes man ska läsa.

Två exempel från dagens test.

40940
5C 0 20 6A 6 EC 9F 92 F4 FF FF 59
värdet blir då -2926 eller -291,6 GM

43005
5C 0 20 6A 6 FD A7 73 F4 0 0 91
värdet blir då -2957 eller -295,7 GM
 
// Magnus
Skrivet av: Bergen77
« skrivet: 15 november 2017, 23:47:21 »

Har du testat att läsa av 43005 istället? Det ska vara samma som 40940 men i 16-bitar istället för 32-bitar.
43005 bruker jeg for å sette Gradminutter, det fungerer fint med 16 bit.
40940 bruker jeg for å lese Gradminutter, det fungerer fint med 16 bit.
47206 får jeg ikke til å virke, der leser jeg verdien -30 uansett hva jeg setter GMstart til.
Skrivet av: 944_Driver
« skrivet: 15 november 2017, 23:09:37 »

Har du testat att läsa av 43005 istället? Det ska vara samma som 40940 men i 16-bitar istället för 32-bitar.

// Magnus
Skrivet av: Bergen77
« skrivet: 14 november 2017, 23:13:19 »

Det går helt fint det, jeg er bare takknemlig noen andre tester dette i det hele tatt!
Jeg vet det stod noe om Modbus i den nest siste oppdateringen. Er litt rart at jeg får lest alle slags verdier men akkurat 47206 får jeg ikke lest rett. Forsøk med GM 40940 når du får tid, helst før du oppgraderer software  tummenupp

Jeg kjører 8218R3.
Skrivet av: 944_Driver
« skrivet: 14 november 2017, 23:08:09 »

Jag ligger lite efter på mjukvaran i pumpen, kör fortfarande 7998R3 då det senare inte verkar innehålla någon förändring jag har nytta av enligt change log. Jag ska uppdatera någon dag när jag får tid.

Jag har tyvärr inte hunnit testa med några fler register nu men jag testade med några olika förra säsongen och såg inga konstigheter. Det är lite omständigt att testa för mig eftersom jag inte skrivit klart koden för att översätta värdena från hex till decimal ännu utan det får jag göra manuellt vid varje test..

// Magnus
Skrivet av: Bergen77
« skrivet: 14 november 2017, 20:08:29 »

Det som skulle kunna spöka för dig är att 47206 innehåller negativa tal och då måste man ju kunna hantera 2-komplement representation av tal för att kunna tyda det.
Gradminutt i register 40940 leser jeg fint ut, den er jo som oftest negativ. Hvis jeg leser 47206 på samme måte som 40940 leser jeg alltid ut -30.
Var det slik at du ikke hadde modbus-40 men henter rett fra pumpen? Kunne du oppgitt software versjon så jeg kan sammenligne? Jeg har siste versjonen instalert.
Skrivet av: 944_Driver
« skrivet: 14 november 2017, 14:17:00 »

Jag får prova på 47209 när jag får tid.
Det som skulle kunna spöka för dig är att 47206 innehåller negativa tal och då måste man ju kunna hantera 2-komplement representation av tal för att kunna tyda det.

// Magnus
Skrivet av: Bergen77
« skrivet: 14 november 2017, 09:38:52 »

Jeg klarer fint å lese ut eksempelvis DM Between add. steps register 47209. Bruker du samme format på 47209 som 47206?
Skrivet av: Bergen77
« skrivet: 13 november 2017, 22:08:49 »

Nu fick jag igång min testutrustning igen. Det gick fint att läsa ut 47206. Fick ut FFBA i hex eller -70 i decimalform vilket är vad jag ställt in just nu.
Hela strängen blev 5C 0 20 6A 6 66 B8 BA FF 0 0 D7
// Magnus
Har du noen andre verdier du leser med samme formatet? Hvilken versjon har du på programvaren, siste?
Skrivet av: 944_Driver
« skrivet: 13 november 2017, 22:04:06 »

Nu fick jag igång min testutrustning igen. Det gick fint att läsa ut 47206. Fick ut FFBA i hex eller -70 i decimalform vilket är vad jag ställt in just nu.

Hela strängen blev 5C 0 20 6A 6 66 B8 BA FF 0 0 D7

// Magnus
Skrivet av: Bergen77
« skrivet: 09 november 2017, 14:57:16 »

Nibe Modbus Manager er kommet i en ny versjon nå. Der finner man en rekke nye modbus registre for dere som liker sånt. Jeg får fortsatt ikke lest ut GMstart fra pumpen, noen andre som kan prøve dette?
Skrivet av: 944_Driver
« skrivet: 22 oktober 2017, 21:56:24 »

Min utrustning för test är tyvärr inte inkopplad nu, det är lite uppstartstid för att få igång den igen efter ett halvår i malpåse. Jag återkommer när jag tar tag i det men det kan ta sin tid.

// Magnus
Skrivet av: Bergen77
« skrivet: 20 oktober 2017, 22:17:53 »

Jag har legat lågt på VP fronten i väntan på kyla så jag har inte gjort några mer tester.
Jeg forstår, jeg sliter fortsatt med å få jevn temperatur på pumpen men har ikke fått testet noe nå før det har begynt å bli kaldt. Nå kan jeg forske mer her. Har du muligheten for å teste ut å hente 47206 fra varmepumpen? Jeg får lest ander verdier fint men ikke akkurat denne.
Skrivet av: 944_Driver
« skrivet: 20 oktober 2017, 22:09:22 »

Jag har legat lågt på VP fronten i väntan på kyla så jag har inte gjort några mer tester.

// Magnus
Skrivet av: Bergen77
« skrivet: 20 oktober 2017, 21:20:53 »

Jeg sliter med å lese ut verdien fra DMstart heating (47206), jeg får ut verdien -30 uansett hva GMstart står innstillit på. Er det andre her som leser og skriver modbus data her?
Skrivet av: 944_Driver
« skrivet: 28 mars 2017, 23:30:41 »

Här är lite kod jag knåpat ihop för att testa det hela med. I grunden är det NibeGW som jag utgått från och lagt till funktioner för att skriva till VP i. Troligen inte nått vidare optimal kod men det kan kanske hjälpa någon att förstå och utveckla det vidare.

OBS!! testa på egen risk, du skriver data rakt in i maskin och det kan bli väldigt fel.

// Magnus

/* ----------------------------------------------------------------------------
 *  Arduino Mega used.
 *  Serial1 used for RS485, settings: 9600 baud, 8 bits, Parity: none, Stop bits 1
 *  Modbus40 must be selected in heat pump.
 *
 *  Message:
 *  +----+----+----+-----+-----+----+-...---+-----+
 *  | 5C | 00 | 20 | CMD | LEN |  DATA...   | CHK |
 *  +----+----+----+-----+-----+----+-...---+-----+
 *
 *   ACK = 0x06
 *   NAK = 0x15
 */


// ######### CONFIGURATION #######################

// enable debug printouts, put '//' before to disable
#define ENABLE_DEBUG

// ######### VARIABLES #######################

// direction change pin for RS-485 port
#define directionPin  22

#ifdef ENABLE_DEBUG
char verbose = 9; 
char debug_buf[50];
#endif

const byte numChars = 16;
char receivedChars[numChars]; // an array to store the received data

boolean newData = false;
String addrString = "";     // string to hold input
byte bytesBuff[5];
byte addrBuff[2];   // addr should be in 40000-49999 range
byte dataBuff[4];   // data can 1 to 4 bytes depending on address, look in Nibe documentation
long dataLong;

// state machine states
enum e_state {
  STATE_WAIT_START,
  STATE_WAIT_DATA,
  STATE_OK_MESSAGE_RECEIVED,
  STATE_CRC_FAILURE,
  STATE_SEND_MESSAGE,
};

e_state state = STATE_WAIT_START;


// message buffers for RS-485 communication 
#define MAX_DATA_LEN 127
byte rx_buffer[MAX_DATA_LEN];
byte tx_buffer[30];     // just a guesss... needs to be checked up.

byte index = 0;
byte LastMessageCommand;
boolean WantToTx, PrintNextMess;
byte TxCommand = 0;
byte BytesToSend = 0;

// ######### SETUP #######################

void setup()  {
//  wdt_enable (WDTO_1S);
 
  pinMode(directionPin, OUTPUT);
  digitalWrite(directionPin, LOW);

  Serial.begin(115200, SERIAL_8N1);
  Serial1.begin(9600, SERIAL_8N1);
 
//  Ethernet.begin(mac,ip);
 // udp.begin(udp_port);
 
  #ifdef ENABLE_DEBUG
  if (verbose) {
    debugPrint("\nStarted...\n");
  }
  #endif
}

// ######### MAIN LOOP #######################

void loop() {

  recvWithEndMarker();    // read user input on serial

  // Read data from register x, syntax: r4xxxx
  if ((receivedChars[0] == 'r') && (receivedChars[1] == '4') && (receivedChars[7] == '\0') && (newData == true))  // look for r4xxxx data...
  {
    // create string for address
    addrString = "";    // clear before using
    addrString += receivedChars[1];
    addrString += receivedChars[2];
    addrString += receivedChars[3];
    addrString += receivedChars[4];
    addrString += receivedChars[5];
 
    dataLong = addrString.toInt();
    addrBuff[0] = (dataLong >> 0x08 )& 0xFF;   // high byte
    addrBuff[1] = dataLong & 0xFF;             // low byte
 
   // create buffer to send
    tx_buffer[0] = 0xC0;  // start?
    tx_buffer[1] = 0x69;  // Request data command 69
    tx_buffer[2] = 0x02;  // lenght
    tx_buffer[3] = addrBuff[1];
    tx_buffer[4] = addrBuff[0]; 
    tx_buffer[5] = CalcChecksum(tx_buffer, (2+3));
    // set some control variables
    TxCommand = tx_buffer[1];
    WantToTx = true;
    newData = false;    //true for test, false for live
    BytesToSend = tx_buffer[2];
  }

// Write data y to register x, syntax: w4xxxx=yyyyy
// test with room temp setpoint 47398=200 => 20,0C
// test with GM between elec. add on steps 47209=300

  if ((receivedChars[0] == 'w') && (receivedChars[1] == '4') && (receivedChars[6] == '=') && (receivedChars[14] == '\0') && (newData == true))  // look for w4xxxx:yyyyy...
  {
    // create string for address
    addrString = "";    // clear before using
    addrString += receivedChars[1];
    addrString += receivedChars[2];
    addrString += receivedChars[3];
    addrString += receivedChars[4];
    addrString += receivedChars[5];
 
    dataLong = addrString.toInt();
    addrBuff[0] = (dataLong >> 0x08 )& 0xFF;   // high byte
    addrBuff[1] = dataLong & 0xFF;             // low byte

    // create string for data
    addrString = "";    // clear before using
    addrString += receivedChars[7];
    addrString += receivedChars[8];
    addrString += receivedChars[9];
    addrString += receivedChars[10];
    addrString += receivedChars[11];

    dataLong = addrString.toInt();
    dataBuff[0] = (dataLong >> 0x08 )& 0xFF;   // high byte
    dataBuff[1] = dataLong & 0xFF;             // low byte

   // create buffer to send
    tx_buffer[0] = 0xC0;  // start?
    tx_buffer[1] = 0x6B;  // Write data command 6B (from modbus40)
    tx_buffer[2] = 0x06;  // lenght, need to check if last 0x00 bytes can be omitted and use length 4 instead?
    tx_buffer[3] = addrBuff[1];
    tx_buffer[4] = addrBuff[0]; 
    tx_buffer[5] = dataBuff[1];
    tx_buffer[6] = dataBuff[0];
    tx_buffer[7] = 0x00;
    tx_buffer[8] = 0x00;
    tx_buffer[9] = CalcChecksum(tx_buffer, (6+3));
    // set some control variables
    TxCommand = tx_buffer[1];
    WantToTx = true;
    newData = false;   //true for test, false for live
    BytesToSend = tx_buffer[2];
  }

 
  #ifdef ENABLE_DEBUG
 
  #endif
 
  switch(state) {
 
    case STATE_WAIT_START:
      if (Serial1.available() > 0) {
        byte b = Serial1.read();
 
        #ifdef ENABLE_DEBUG
        if (verbose > 2) {
          sprintf(debug_buf,"%02x", b);
        }
        #endif
       
        if (b == 0x5C) {
          rx_buffer[0] = b;
          index = 1;
          state = STATE_WAIT_DATA;
         
          #ifdef ENABLE_DEBUG
          if (verbose > 1) {
            debugPrint("Frame start found\n");
          }
          #endif
        }
      }
      break;
     
    case STATE_WAIT_DATA:
      if (Serial1.available() > 0) {
        byte b = Serial1.read();
 
        #ifdef ENABLE_DEBUG
        if (verbose > 2) {
          sprintf(debug_buf, "%02x", b);
        }
        #endif
     
        if (index >= MAX_DATA_LEN)
        {
          // too long message
          state = STATE_WAIT_START;
        }
        else
        {
          rx_buffer[index++] = b;
         
          int msglen = checkNibeMessage(rx_buffer, index);
         
          #ifdef ENABLE_DEBUG
          if (verbose > 1) {
            sprintf(debug_buf,"\ncheckMsg=%d\n", msglen);
          }
          #endif
             
          switch (msglen)
          {
            case 0:   break; // Ok, but not ready
            case -1:  state = STATE_WAIT_START; break; // Invalid message
            case -2:  state = STATE_CRC_FAILURE; break; // Checksum error
            default:  state = STATE_OK_MESSAGE_RECEIVED; break;
          }
        }
      }
      break;

    case STATE_CRC_FAILURE:
      #ifdef ENABLE_DEBUG
      if (verbose) {
        debugPrint("CRC failure\n");
      }
      #endif
     
      sendNak();
      state = STATE_WAIT_START;
      break;
   
    case STATE_OK_MESSAGE_RECEIVED:
      #ifdef ENABLE_DEBUG
      if (verbose) {
        debugPrint("Message received\n");
      }
      #endif

      LastMessageCommand = rx_buffer[3];

      // ****************** time to transmitt some data **********************
      if (WantToTx && (TxCommand == LastMessageCommand))
      {
        sendDataBytes(tx_buffer, (BytesToSend+4));
        PrintNextMess = true; // print respons for debug..
        WantToTx = false;
      }
      else
      {
        sendAck();
      }
     
      // print packet if....
      // if data contains 0x5C (start character)
      if (rx_buffer[0] == 0x5C)
        sendUdpPacket(rx_buffer, index);

      if (PrintNextMess && rx_buffer[3] == 0x6A)  // print for debug purpose...
      {
        PrintNextMess = false;
        for (int i=0 ; i<index ; i++)
        {
          Serial.print(rx_buffer,HEX);
          Serial.print(" ");
        }
        Serial.print('\n');
      }
     
      state = STATE_WAIT_START;
      break;
  }
}

// ######### FUNCTIONS #######################

// read data from serial port
void recvWithEndMarker()
{
 static byte ndx = 0;
 char endMarker = '\n';
 int rc;
 
 // if (Serial.available() > 0) {
  while (Serial.available() > 0 && newData == false)
  {
    rc = Serial.read();
    if (rc != endMarker)
    {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars)
      {
        ndx = numChars - 1;
      }
    }
    else
    {
      receivedChars[ndx] = '\0'; // terminate the string
      ndx = 0;
      newData = true;
    }
  }
}


/*
 * Return:
 *  >0 if valid message received (return message len)
 *   0 if ok, but message not ready
 *  -1 if invalid message
 *  -2 if checksum fails
 */
int checkNibeMessage(const byte* const data, byte len)
{
    #ifdef ENABLE_DEBUG
    if (verbose > 2) {
      sprintf(debug_buf,"\nlen=%u\n", len);
    }
    #endif
   
    if (len <= 0)
        return 0;
   
    if (len >= 1)
    {
        if (data[0] != 0x5C)
            return -1;
       
        if (len >= 3)
        {
            if (data[1] != 0x00 && data[2] != 0x20)
                return -1;
        }
       
        if (len >= 6)
        {
            int datalen = data[4];
           
            if (len < datalen + 6)
                return 0;
           
            byte checksum = 0;
           
            // calculate XOR checksum
            for(int i = 2; i < (datalen + 5); i++)
                checksum ^= data;
           
            byte msg_checksum = data[datalen + 5];
           
            #ifdef ENABLE_DEBUG
            if (verbose > 1) {
              sprintf(debug_buf,"%02x", checksum, msg_checksum);
            }
            #endif
                     
            if (checksum != msg_checksum) {
             
              // check special case, if checksum is 0x5C (start character),
              // heat pump seems to send 0xC5 checksum
              if (checksum != 0x5C && msg_checksum != 0xC5)
                return -2;
            } 
            return datalen + 6;
        }     
    }
   
    return 0;
   
}

byte CalcChecksum(const byte* const data, int len)
{
  // calculate XOR checksum
  byte checksum = 0;
  for(int i = 0; i < len; i++)
    checksum ^= data;

    // check special case, if checksum is 0x5C (start character),
    // heat pump seems to want 0xC5 checksum back
  if (checksum == 0x5C)
    checksum = 0xC5;
  return checksum;
}

void sendAck()
{
  #ifdef ENABLE_DEBUG
  if (verbose) {
    debugPrint("Sending ACK\n");
  }
  #endif
 
  digitalWrite(directionPin, HIGH);
  delay(1);             // 1ms
  Serial1.write(0x06);
  Serial1.flush();       // Wait for tx to finish
  delay(1);
  digitalWrite(directionPin, LOW);
}

void sendNak()
{
  #ifdef ENABLE_DEBUG
  if (verbose) {
    debugPrint("Sending NAK\n");
  }
  #endif
 
  digitalWrite(directionPin, HIGH);
  delay(1);
  Serial1.write(0x15);
  Serial1.flush();
  delay(1);
  digitalWrite(directionPin, LOW);
}

void sendDataBytes(const byte* const data, int len)
{
  #ifdef ENABLE_DEBUG
  if (verbose) {
    debugPrint(" **** Sending data ****\n");
  }
  #endif
 
  digitalWrite(directionPin, HIGH);
  delay(1);
  int i;
  for (i=0; i<len; i++)
  {
    Serial1.write(data);
  }
  Serial1.flush();
  delay(1);
  digitalWrite(directionPin, LOW);
}

void sendUdpPacket(const byte* const data, int len) {
 
  #ifdef ENABLE_DEBUG
  if (verbose) {
    sprintf(debug_buf, "Sending UDP packet, len=%d\n", len);
    if (verbose > 2) {
      int i;
      for (i=0; i<len; i++) {
        sprintf(debug_buf,"%02x", data);
      }
      debugPrint("\n");
    }
  }
  #endif
 
}

#ifdef ENABLE_DEBUG

void debugPrint(char* data) {
  Serial.write(data);

}
#endif
Skrivet av: 944_Driver
« skrivet: 28 mars 2017, 23:24:12 »

Jag har lyckats läsa och skriva till register på min F1155 med en Arduino och en RS485 omvandlare nu.
Protokollet bygger på att VP:n inleder all kommunikation och den anslutna enheten svarar med NAK, ACK eller med sitt eget meddelande.

Exempel, skicka -50 till register 47206:
Allt i HEX.
Detta kanske först framstår som ett meddelande men är tre stycken.
5C 00 20 6B 00 4B C0 6B 06 66 B8 CE FF 00 00 42 06

VP skickar
5C 00 20 6B 00 4B
nedbrutet:
5C= start på kommunikation
00= alltid 00?
20= adress till modbus40
6B= kommando, fråga från VP till modbus40 om den vill skriva till något register i VP
00= längd på data, 0 bytes i detta fall eftersom VP inte skickar någon data, bara en fråga.
4B= checksum

...och arduino/modbus svarar:
C0 6B 06 66 B8 CE FF 00 00 42
nedbrutet:
C0= meddelande inleds med C0
6B= kommando, skriva till register i VP
06= 6 bytes data i meddelandet, adress*2 + data*4, i detta exempel är det en 16-bitars int så två bytes används.
66 B8 CE FF 00 00= addressLSB addressMSB dataLSB dataMSB 0 0
10= checksum XOR

VP svarar
06 (ack)

Vill man läsa av samma register ser det ut så här:
Invänta att VP skickar meddelande med kommando 69, skicka C0 69 02 66 B8 [checksum] och VP skickar svaret i nästa meddelande.

// Magnus
Skrivet av: Andybaa
« skrivet: 21 mars 2016, 16:04:43 »

Hei,

Jeg har jobba en del med dette for noen måneder siden. Jeg har fått til å lese ut sykliske data ved bruk av en Arduino og nibegw programmet (søk på Google). Videre har jeg fått til å skrive og lese spesifikke parametre fra en VVM320. Alt er gjort uten Modbus-40.
Skrivet av: Bergen77
« skrivet: 11 mars 2016, 00:45:45 »

Noen som har sett noe mer på modbus til Nibe? Må man ha denne modbus-40 eller klarer man å lese ut modbus uten?
Skrivet av: tipo874
« skrivet: 19 oktober 2013, 19:03:50 »

Om inte ens denna typ av information får avhandlas på forumet tycker jag det har gått för långt med censuren.

Jag har köpt Logger 2020, och är väldigt nöjd med det, jag betalar ett abonnemang till E-logger, och denna typ av information är ingen konkurrent i mitt tycke.
Skrivet av: Raniman
« skrivet: 19 oktober 2013, 08:46:56 »

Jag provar igen utan länk. Det är en del av ett hemautomationsprogram. Openhab heter det och har org i slutet. Modulen för nibe går under namnet nibegw.
Skrivet av: Smurfen.
« skrivet: 19 oktober 2013, 07:52:46 »

Är intresserad av den lösningen kan du skicka länken till mig eller lägga in den igen borde vara ok bryter du mot nått borde du fått höra det.
Skrivet av: Raniman
« skrivet: 18 oktober 2013, 23:54:11 »

Satte in en länk till en sida med en lösning hur man får ut all logdata direkt ur pumpen utan modbus40, tidigare idag. Men den har tagits bort. Har jag brutit mot någon regel?  Det var ju bara ett litet program och en kabel till serieporten som behövdes.  Sc:,h
Skrivet av: mexitegel
« skrivet: 17 oktober 2013, 20:03:57 »

Mitt projekt har hamnat på is på grund av andra prioriteringar. Blir det aktuellt att kika på det igen så köper jag antagligen en uppgraderingskit för nibe uplink.
Skrivet av: ducken
« skrivet: 09 oktober 2013, 08:43:42 »

Var står alla i detta?
Är det inköp av MODBUS40 som gäller eller går det att läsa data ur pumparna på annat sätt?
Skrivet av: mexitegel
« skrivet: 25 april 2012, 00:05:32 »

Varför inte en webserver på Linuxburken?
Hellre en webservice, då blir det lättare för andra att fortsätta utveckla tillämpningar också.
Skrivet av: purjo__
« skrivet: 24 april 2012, 13:06:58 »

Arbetar fortfarande på hur jag ska få data därifrån till resten av systemet.
Funderar starkt på SNMP - eller någan annan typ av daemon som cachar alla värden mellan mina läsningar.
Att läsa 39 värden tar ca 40s. (då bara 20 kan vara fördefinierade).

Varför inte en webserver på Linuxburken?
Skrivet av: JohanElmis
« skrivet: 24 april 2012, 11:50:09 »

Strulade en hel del med kommunikationen.
ModScan64 (64-bitarsversionen av ModScan32) visade sig vara underbar.
Testversionen fungerar ju så länge man inte får vettig data tillbaka, och har först därefter begränsningar.
Det går också enkelt att se om man får någonting tillbaka eller ej, vilket också är till väldigt stor hjälp.
Det visade sig att jag fått data+/- felvänt - även om jag kollat det hundratals gånger tidigare.
Normalt är väl A (-) och B (+) ?
Terminerings-motstånd mellan signal-ledarna - men ingen pull-upp/down.

Har nu en lista på alla Nibes parametrar - och ett litet c-program som kan läsa ut parametrarna.
Jag kör det på en liten Arm-baserad Linux. Arbetar fortfarande på hur jag ska få data därifrån till resten av systemet.
Funderar starkt på SNMP - eller någan annan typ av daemon som cachar alla värden mellan mina läsningar.
Att läsa 39 värden tar ca 40s. (då bara 20 kan vara fördefinierade).

Nu har jag ett Enervent LTR-6 FTX-aggregat med EDA-styrning som kan ska koppla upp mig mot också.
Och så de 3 M-Bus energimätarna som kan skymtas på bilden. Vi får väl se om jag får tid till att sätta ihop ett interface i helgen. :-)


Nibe Modbus 40 - med RS-485 till USB converter (USB-COMi-TB) samt Energimätare.

Bild på Modbus-signalerna (kurvorna är justerade i Y-led). http://www.villaelmerfjord.se/drupal6/node/90
Klicka här för en kopia på Nibes parameterlista: http://www.villaelmerfjord.se/drupal6/sites/villaelmerfjord.se/files/nibeparams_list.txt
Skrivet av: mexitegel
« skrivet: 11 april 2012, 20:15:03 »

Oj, här händer det saker. Kul att se  - själv har jag inte kommit så långt på grund av FVJ (Familj, Villa och Jobb)...
Skrivet av: JohanElmis
« skrivet: 10 april 2012, 14:51:55 »

Köpte Modbus 40 för ett halvår sedan men fick sedan aldrig tid att installera den.
Den kom på plats nu i påsken - men fungerade inte med det nya firmware som medleverarades (v1270).
Fanns helt enkelt ingen Modbus att bocka för i System-installningsmenyn.

Skulle ringa Nibe idag - men hittade till min förvåning att de lagt upp sina firmware på webben.
http://www.nibe.se/Support/programvara/
Jippi - som jag har väntat på - och frågat efter detta.

Har en liten liux-dator som jag tänkte använda för läsning och styrning.
Återkommer med hur det går senare.


Skrivet av: Wallac
« skrivet: 04 april 2012, 20:06:57 »

Hi

Yes I tried 47206 (DM start heating)
One time I was able to change the value, but I tried so many settings so I didn't find my way back.

I tried modscan32 and through mango m2m.

Today i got some more time to test and i found the problem.

In mango the setting "Use multiple write commands only" must be activated and I can't read any of the 20 fixed registers at the same time.
I think it has someting to do with the way mango handles the communication.

In the log I first changed 47206 to -100 and then back to -50

woops the second boss is caling , no more basement time today.  dontknaow

Annonser

Right Block

Vibrationsdämpare
Besök vår webshop, klicka här!
Energioffert.se
Energibutiken.se smarta varor på nätet, leverans till dörren
luftvärmepumpar, tillbehör, installationsmaterial, vi har allt!
Annonspriser
Ad
CitCop - Värmepumpar med installation i hela Sverige
Besök oss idag
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!