tommib
Är det någon som har lyckats få NibeGW att fungera på Arduino mot OpenHab2?

Jag har nu hållit på ett tag och blir mer och mer frustrerad över att det inte fungerar. Koden jag använder på Arduinon är denna. Hårdvaran är en Arduino Nano (kopia) med en Ethernet Shield med W5100 chip samt en MAX485 på breadboard.

Det som händer när jag testkör är att pumpen går in i larmläge efter några sekunder. När jag testar arduinon på bänk så startar den som den ska men den skickar ingen debuginformation till den datorn jag har angivit. Faktum är att den enligt ethernetshieldens TX-lampa inte skickar något alls. Jag ser inte heller några paket från den med Wireshark.

När jag testar med Arduinos exempelkod för en enkel ekoserver över UDP fungerar det utmärkt med samma hårdvara. Således är ethernetshielden fungerande. Det fungerar också att prata RS485 mot en vanlig dator så det är inte felkopplat eller trasigt på breadboarden heller.

Jag blir snart tokig på varför detta inte fungerar.
 

Bästa svaret

Jag har en H60-gw som inte funkar till min Nibe750, samma felbeskrivning som i din maskin. Jag har tyvärr inte heller lyckats utröna varför det inte funkar...

Har du någon extra systemenhet, typ tilluftsfläkt, extra reglerenhet eller annat?

Hur långa kablar har du, använder du 120 Ohms motstånd för terminering?

Har du någon rs485-usb-dongel så kan du få mitt program jag använde för att sniffa trafiken...
 
tommib
Nej, inget sånt. Just nu är inte NibeGWn ansluten till pumpen alls, den står och skäms på bordet framför mig. Oavsett om den är ansluten till pumpen så borde den spotta ur sig lite UDP-paket vid uppstart när man har aktiverat debug. Det gör den inte. Verifierade ännu en gång att den faktiskt fungerar bra om man laddar upp en exempelsketch (i detta fallet UDPSendRecieveString från Ethernet-biblioteket). När man laddar upp NibeGW ver 3 så sänder den inget alls, varken enligt TX-lampan eller Wireshark.

Jag har förvisso en RS485-dongel men det verkar inte vara problemet här. Det är liksom nästa steg när jag har listat ut varför den inte vaknar alls i nuläget.
 
Ah, så du får inte ens några debugmeddelanden alltså. Det är inte så att du måste få minst ett paket innan den börjar skicka debuginformationen? Vet att jag tittade på NibeGW när jag tucklade med det här tidigare, men sen skrev jag ett eget program som jag aldrig fick att funka under någon längre tid på grund av den dumma hanteringen av missade svar i Nibe-pumpen
 
  • Gilla
Arne Nilsson1
  • Laddar…
Minst ett paket från värmepumpen alltså
 
tommib
Jag funderade på det och kommenterade bort allt som har med nibegw att göra. Nu är det bara init-funktionen för ethernet kvar och det fungerar ändå inte. Jag fattar verkligen inte vad som strular eftersom det fungerar bra med exempelsketchen.
 
Lägg ut relevanta delar av koden?
 
tommib
Kod:
/**
 * Copyright (c) 2010-2020 Contributors to the openHAB project
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * ----------------------------------------------------------------------------
 *
 *  Author: pauli.anttila@gmail.com
 *
 *
 *  2.11.2013   v1.00   Initial version.
 *  3.11.2013   v1.01
 *  27.6.2014   v1.02   Fixed compile error and added Ethernet initialization delay.
 *  29.6.2015   v2.00   Bidirectional support.
 *  18.2.2017   v3.00   Redesigned.
 */

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

#define VERSION                 "3.00"

// Enable if you use ProDiNo board
//#define PRODINO_BOARD
// Enable if ENC28J60 LAN module is used
//#define TRANSPORT_ETH_ENC28J60

// Enable debug printouts, listen printouts e.g. via netcat (nc -l -u 50000)
#define ENABLE_DEBUG
#define VERBOSE_LEVEL           3

#define BOARD_NAME              "Arduino NibeGW"
#define BOARD_MAC               { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }
#define BOARD_IP                { 192, 168, 1, 8 }
#define GATEWAY_IP              { 192, 168, 1, 1 }
#define NETWORK_MASK            { 255, 255, 255, 0 }
#define INCOMING_PORT_READCMDS  TARGET_PORT
#define INCOMING_PORT_WRITECMDS 10000

#define TARGET_IP               192, 168, 1, 182
#define TARGET_PORT             9999
#define TARGET_DEBUG_PORT       50000

// Delay before initialize ethernet on startup in seconds
#define ETH_INIT_DELAY          10

// Used serial port and direction change pin for RS-485 port
#ifdef PRODINO_BOARD
#define RS485_PORT              Serial1
#define RS485_DIRECTION_PIN     3
#else
#define RS485_PORT              Serial
#define RS485_DIRECTION_PIN     2
#endif

#define ACK_MODBUS40            true
#define ACK_SMS40               false
#define ACK_RMU40               false
#define SEND_ACK                true

#define DEBUG_BUFFER_SIZE       80

// ######### INCLUDES #######################

#ifdef TRANSPORT_ETH_ENC28J60
#include <UIPEthernet.h>
#else
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#endif

#ifdef PRODINO_BOARD
#include "KmpDinoEthernet.h"
#include "KMPCommon.h"
#endif

#include <avr/wdt.h>

#include "NibeGw.h"

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

// The media access control (ethernet hardware) address for the shield
byte mac[] = BOARD_MAC;

//The IP address for the shield
byte ip[] = BOARD_IP;

//The IP address of the gateway
byte gw[] = GATEWAY_IP;

//The network mask
byte mask[] = NETWORK_MASK;

boolean ethernetInitialized = false;

// Target IP address and port where Nibe UDP packets are send
IPAddress targetIp(TARGET_IP);
EthernetUDP udp;
EthernetUDP udp4readCmnds;
EthernetUDP udp4writeCmnds;
/*
NibeGw nibegw(&RS485_PORT, RS485_DIRECTION_PIN);
*/
// ######### DEBUG #######################

#define DEBUG_BUFFER_SIZE       80

#ifdef ENABLE_DEBUG
#define DEBUG_PRINT(level, message) if (verbose >= level) { debugPrint(message); }
#define DEBUG_PRINTDATA(level, message, data) if (verbose >= level) { sprintf(debugBuf, message, data); debugPrint(debugBuf); }
#define DEBUG_PRINTARRAY(level, data, len) if (verbose >= level) { for (int i = 0; i < len; i++) { sprintf(debugBuf, "%02X", data[i]); debugPrint(debugBuf); }}
#else
#define DEBUG_PRINT(level, message)
#define DEBUG_PRINTDATA(level, message, data)
#define DEBUG_PRINTARRAY(level, data, len)
#endif

#ifdef ENABLE_DEBUG
char verbose = VERBOSE_LEVEL;
char debugBuf[DEBUG_BUFFER_SIZE];

void debugPrint(char* data)
{
  if (ethernetInitialized)
  {
    udp.beginPacket(targetIp, TARGET_DEBUG_PORT);
    udp.write(data);
    udp.endPacket();
  }
  else
  {
    Serial.println(data);
  }

}
#endif

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

void setup()
{
  // Start watchdog
  wdt_enable (WDTO_2S);
/*
  nibegw.setCallback(nibeCallbackMsgReceived, nibeCallbackTokenReceived);
  nibegw.setAckModbus40Address(ACK_MODBUS40);
  nibegw.setAckSms40Address(ACK_SMS40);
  nibegw.setAckRmu40Address(ACK_RMU40);
  nibegw.setSendAcknowledge(SEND_ACK);

#ifdef ENABLE_NIBE_DEBUG
  nibegw.setDebugCallback(nibeDebugCallback);
  nibegw.setVerboseLevel(VERBOSE_LEVEL);
#endif
*/

  DEBUG_PRINTDATA(0, "%s ", BOARD_NAME);
  DEBUG_PRINTDATA(0, "version %s\n", VERSION);
  DEBUG_PRINT(0, "Started\n");
}

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

void loop()
{
  wdt_reset();

  long now = millis() / 1000;
/*
  if (!nibegw.connected())
  {
    nibegw.connect();
  }
  else
  {
    do
    {
      nibegw.loop();
#ifdef TRANSPORT_ETH_ENC28J60
      Ethernet.maintain();
#endif
    } while (nibegw.messageStillOnProgress());
  }
*/
  if (!ethernetInitialized)
  {
    if (now >= ETH_INIT_DELAY)
    {
      DEBUG_PRINT(1, "Initializing Ethernet\n");
      initializeEthernet();
#ifdef ENABLE_DEBUG
      DEBUG_PRINTDATA(0, "%s ", BOARD_NAME);
      DEBUG_PRINTDATA(0, "version %s\n", VERSION);
      sprintf(debugBuf, "MAC=%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
      DEBUG_PRINT(0, debugBuf);
      sprintf(debugBuf, "IP=%d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
      DEBUG_PRINT(0, debugBuf);
      sprintf(debugBuf, "GW=%d.%d.%d.%d\n", gw[0], gw[1], gw[2], gw[3]);
      DEBUG_PRINT(0, debugBuf);
      sprintf(debugBuf, "TARGET IP=%d.%d.%d.%d\n", TARGET_IP);
      DEBUG_PRINTDATA(0, "TARGET PORT=%d\n", BOARD_NAME);
      DEBUG_PRINTDATA(0, "ACK_MODBUS40=%s\n", ACK_MODBUS40 ? "true" : "false");
      DEBUG_PRINTDATA(0, "ACK_SMS40=%s\n", ACK_SMS40 ? "true" : "false");
      DEBUG_PRINTDATA(0, "ACK_RMU40=%s\n", ACK_RMU40 ? "true" : "false");
      DEBUG_PRINTDATA(0, "SEND_ACK=%s\n", SEND_ACK ? "true" : "false");
      DEBUG_PRINTDATA(0, "ETH_INIT_DELAY=%d\n", ETH_INIT_DELAY);
      DEBUG_PRINTDATA(0, "RS485_DIRECTION_PIN=%d\n", RS485_DIRECTION_PIN);
#endif
    }
  }
  DEBUG_PRINT(0,now);
}

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

void initializeEthernet()
{
  Ethernet.begin(mac, ip);
  ethernetInitialized = true;
  //udp4readCmnds.begin(INCOMING_PORT_READCMDS);
  //udp4writeCmnds.begin(INCOMING_PORT_WRITECMDS);
  //udp.beginPacket(IPAddress(192,168,1,182),50000);
  //udp.write("test\n");
  //udp.endPacket();
  DEBUG_PRINT(1,"Eth init done");
}

void nibeCallbackMsgReceived(const byte* const data, int len)
{
  if (ethernetInitialized)
  {
    sendUdpPacket(data, len);
  }
}


int nibeCallbackTokenReceived(eTokenType token, byte* data)
{
  int len = 0;
  if (ethernetInitialized)
  {
    if (token == READ_TOKEN)
    {
      DEBUG_PRINT(2, "Read token received\n");
      int packetSize = udp4readCmnds.parsePacket();
      if (packetSize) {
        len = udp4readCmnds.read(data, packetSize);
#ifdef TRANSPORT_ETH_ENC28J60
        udp4readCmnds.flush();
        udp4readCmnds.stop();
        udp4readCmnds.begin(INCOMING_PORT_READCMDS);
#endif
      }
    }
    else if (token == WRITE_TOKEN)
    {
      DEBUG_PRINT(2, "Write token received\n");
      int packetSize = udp4writeCmnds.parsePacket();
      if (packetSize) {
        len = udp4writeCmnds.read(data, packetSize);
#ifdef TRANSPORT_ETH_ENC28J60
        udp4writeCmnds.flush();
        udp4writeCmnds.stop();
        udp4writeCmnds.begin(INCOMING_PORT_WRITECMDS);
#endif
      }
    }
  }
  return len;
}

void nibeDebugCallback(byte verbose, char* data)
{
  DEBUG_PRINT(verbose, data);
}

void sendUdpPacket(const byte * const data, int len)
{
  DEBUG_PRINTDATA(2, "Sending UDP packet, len=%d\n", len);
  DEBUG_PRINTARRAY(2, data, len)
  DEBUG_PRINT(2, "\n");

  udp.beginPacket(targetIp, TARGET_PORT);
  udp.write(data, len);
  udp.endPacket();
}
 
Borde du inte sätta ethernetInitialized till true någonstans, eller görs det internt i biblioteket?
 
tommib
Jag har modifierat den lite från det som finns på länken i första posten. Dessa modifieringar består mest i att ha tagit bort lite ifdef-block om prodino samt lite annat. Den största ändringen som jag gjort som kanske kan påverka är att jag ändrat initfunktionen för Ethernet från orginalet Ethernet.begin(mac,ip,gw,mask), som är fel enligt referensen (tredje parametern ska vara DNS) till Ethernet.begin(mac,ip) som borde räcka eftersom defaults är rimliga.
 
tommib
M Millox skrev:
Borde du inte sätta ethernetInitialized till true någonstans, eller görs det internt i biblioteket?
Det görs i funktionen initializeEthernet som ligger nedom loopblocket.

Edit: där alltså själva anropet också görs till Ethernet.begin.
 
Jag ser inte var du anropar den funktionen, det är inte från setup() i alla fall?
 
tommib
Det är från loop(), anropet görs i den andra delen

Kod:
if (!ethernetInitialized)
  {
   if (now >= ETH_INIT_DELAY)
   {
     DEBUG_PRINT(1, "Initializing Ethernet\n");
     initializeEthernet();

Vitsen verkar vara att fördröja starten av ethernet, antagligen för att något ska hinna initialisera på Wiznetchippet, men inte fördröja starten av nibegw (som alltså inte startar just nu pga bortkommenterad) och ACK till värmepumpen (dra åt helvete Nibe för den funktionen).
 
tommib
Elektronikmodul med nätverkskabel och USB ansluten, LED påslagen och etiketterad D13 SCK för SPI-länk.
Inloggade ser högupplösta bilder
Skapa konto
Gratis och tar endast 30 sekunder

Så här ser det ut. Ett av problemen är att jag inte kan använda den inbyggda lysdioden för diagnostik eftersom den är kopplad på D13 som också är SCK i SPI-länken till ethernetkortet. Jag känner verkligen inte för att mickla dit ett par extra lysdioder eller en header för SoftwareSerial för felsökning men snart måste jag nog göra något sånt för jag blir tokig på detta.
 
Har du någon liten alligatorklämma du kan ansluta på någon pin som går att använda tillsammans med en multimeter, du behöver ju strikt sett inte någon lysdiod, det räcker ju med att mäta spänningen..

Jag såg det sen, att anropet låg i loop(), och jag hade inget mer smart att säga, så jag fick lägga mig. Har fortfarande inget annat smart, du behöver fixa möjlighet till jtag eller lysdiod/multimeter...
 
Vi vill skicka notiser för ämnen du bevakar och händelser som berör dig.