nodo-domotica.nl

Nieuwe plugin - Mebus outdoor sensor

Hier alles over de Software in de Nodo

Nieuwe plugin - Mebus outdoor sensor

Berichtdoor Voyager » 03 nov 2014, 14:41

Ik ben een beetje aan het experimenteren geweest met wat RF signalen die ik hier ontvang.
De eerste is de Mebus sensor. Ooit gekocht omdat deze gelijk zou zijn kwa protocol aan de Cresta sensoren maar dat bleek voor dit model dus niet zo te zijn. Het protocol had ik al eerder uitgezocht. Was nu dus alleen aanpassen voor Nodo. Ik heb de Alecto plugin gepakt (ja, ik had begrepen dat plugin 255 daar voor was.. maar de Alecto aanpassen was sneller :D)

Hieronder de plugin zoals die op het moment is.
Ik krijg inderdaad de correcte temperatuur uit het signaal. (zichtbaar in de seriele data)
Het syntax gebeuren of eigenlijk het nut daarvan ontgaat me enig sinds.
Ook is me niet direct duidelijk hoe je een negatieve temperatuur in een variable zet.

Wat zijn de volgende stappen? Is er interesse door anderen en heeft het zin om deze plugin volledig te maken en een nummer toe te wijzen?

~William

Code: Selecteer alles
//#######################################################################################################
//##################################### Plugin-40 Mebus #################################################
//#######################################################################################################

/*********************************************************************************************\
 * Dit protocol zorgt voor ontvangst van Mebus temperatuur weerstation buitensensoren
 * het gaat om Mebus sensoren die niet het Cresta (Hideki) protocol volgen
 *
 * Auteur             : Nodo-team (Martinus van den Broek) www.nodo-domotica.nl
 *                      Support Mebus door forumlid: Voyager
 * Support            : www.nodo-domotica.nl
 * Datum              : 3-11-2014
 * Versie             : 1.0
 * Nodo productnummer : n.v.t. meegeleverd met Nodo code.
 * Compatibiliteit    : Vanaf Nodo build nummer ???
 * Syntax             : "Mebus <Par1:Sensor ID>, <Par2:Basis Variabele>"
 *********************************************************************************************
 * Technische informatie:
 * Decodes signals from a Mebus Weatherstation outdoor unit, (29 pulses, 28 bits, 433 MHz).
 * Mebus Message Format:
 * AAAA BBBB BBBB CCCC CCCC CCCC DDDD
 *
 * A = Rolling code/Counter, decreases only when there is a change in temperature
 * B = Changes after each reset, no change during normal operation. (Possibly device ID but does not have a relation to the channel 1/2/3 that can be selected on the device)
 * C = Temperature (21.5 degrees is shown as decimal value 215, minus values have the high bit set and need to be subtracted from a base value of 4096)
 * D = Possibly Checksum (unknown calculation for now)
 \*********************************************************************************************/
   // ==================================================================================
   // MEBUS bit packets
   // 0000 1101 1001 0000 1100 1000 0111
   // 0100 1101 1001 0000 1101 1100 0110
   // 0100 1101 1001 0000 1100 1101 0110
   // 1001 1101 1001 0000 1101 1100 1011
   // 1011 1101 1001 0001 0000 1111 0110
   // 0010 0110 1110 0000 0000 1001 0110    0.9
   // 0011 0110 1110 1111 1000 0011 0110    -12.5
   //                  |----------|----------> temperature 0 - 51.1 
   //                |-|---------------------> set when minus temperatures -51.2 - 0
   // ==================================================================================
 
#define PLUGIN_ID 40
#define PLUGIN_NAME "Mebus"

#define MEBUS_PULSECOUNT 58 // 29*2

uint8_t Plugin_040_ProtocolCRC( uint8_t *addr, uint8_t len);
byte Plugin_040_ProtocolCheckID(byte checkID);

byte Plugin_040_ProtocolValidID[5];
byte Plugin_040_ProtocolVar[5];

boolean Plugin_040(byte function, struct NodoEventStruct *event, char *string)
{
  boolean success=false;

  switch(function)
  {
#ifdef PLUGIN_040_CORE
  case PLUGIN_RAWSIGNAL_IN:
    {
      if (RawSignal.Number != MEBUS_PULSECOUNT) return false;

      Serial.print(F("Mebus"));

      unsigned long bitstream1=0;
      byte rc=0;
      int temperature=0;
      byte minus=0;
      byte checksum=0;
      byte checksumcalc=0;
      byte basevar=0;
      byte data[7];

      // get all 28 bits
      for(byte x=2;x <=56;x+=2) {
         if(RawSignal.Pulses[x]*RawSignal.Multiply > 0xb9f) {
           bitstream1 = (bitstream1 << 1) | 0x1;
         } else {
           bitstream1 = (bitstream1 << 1);
         }
      }
      Serial.print(bitstream1);
      Serial.println();
      //==================================================================================
      data[0] = (bitstream1 >> 24) & 0x0f;
      data[1] = (bitstream1 >> 20) & 0x0f;
      data[2] = (bitstream1 >> 16) & 0x0f;
      data[3] = (bitstream1 >> 12) & 0x0f;
      data[4] = (bitstream1 >>  8) & 0x0f;
      data[5] = (bitstream1 >>  4) & 0x0f;
      data[6] = (bitstream1 >>  0) & 0x0f;

      temperature=(data[3]<<8)+(data[4]<<4)+data[5];
      if (temperature > 3000) {
         temperature=4096-temperature;  // fix for minus temperatures
         minus=1;
      }

      if (minus == 0) {
         Serial.print(F(" Temperature = "));
      } else {
         Serial.print(F(" Temperature = -"));
      }
      Serial.print( (float)temperature/10 );
      Serial.println();
     
      checksum=data[6];
      checksumcalc = Plugin_040_ProtocolCRC(data, 4);

      rc = (bitstream1 >> 20) & 0xff;

      //if (checksum != checksumcalc) return false;
      basevar = Plugin_040_ProtocolCheckID(rc);

      event->Par1=rc;
      event->Par2=basevar;
      event->SourceUnit    = 0;                     // Komt niet van een Nodo unit af, dus unit op nul zetten
      event->Port          = VALUE_SOURCE_RF;
      event->Type          = NODO_TYPE_PLUGIN_EVENT;
      event->Command       = 40; // Nummer van dit device

      if (basevar == 0) return true;

      UserVar[basevar-1] = (float)temperature / 10;

      RawSignal.Number=0;
      success = true;
      break;
    }
  case PLUGIN_COMMAND:
    {
    if ((event->Par2 > 0) && (Plugin_040_ProtocolCheckID(event->Par1) == 0))
      {
      for (byte x=0; x<5; x++)
        {
        if (Plugin_040_ProtocolValidID[x] == 0)
          {
          Plugin_040_ProtocolValidID[x] = event->Par1;
          Plugin_040_ProtocolVar[x] = event->Par2;
          success=true;
          break;
          }
        }
      }
    break;
    }
#endif // PLUGIN_040_CORE

#if NODO_MEGA
  case PLUGIN_MMI_IN:
    {
    char *TempStr=(char*)malloc(INPUT_COMMAND_SIZE);

    if(GetArgv(string,TempStr,1))
      {
      if(strcasecmp(TempStr,PLUGIN_NAME)==0)
        {
        if(event->Par1>0 && event->Par1<255 && event->Par2>0 && event->Par2<=USER_VARIABLES_MAX)
          {
          event->Type = NODO_TYPE_PLUGIN_COMMAND;
          event->Command = 40; // Plugin nummer 
          success=true;
          }
        }
      }
      free(TempStr);
      break;
    }

  case PLUGIN_MMI_OUT:
    {
    strcpy(string,PLUGIN_NAME);            // Eerste argument=het commando deel
    strcat(string," ");
    strcat(string,int2str(event->Par1));
    strcat(string,",");
    strcat(string,int2str(event->Par2));
    break;
    }
#endif //NODO_MEGA
  }     
  return success;
}

#ifdef PLUGIN_040_CORE
/*********************************************************************************************\
 * Calculates CRC
 \*********************************************************************************************/
uint8_t Plugin_040_ProtocolCRC( uint8_t *addr, uint8_t len)
{
  uint8_t crc = 0;
  while (len--) {
    uint8_t inbyte = *addr++;
    for (uint8_t i = 8; i; i--) {
      uint8_t mix = (crc ^ inbyte) & 0x80; // changed from & 0x01
      crc <<= 1; // changed from right shift
      if (mix) crc ^= 0x31;// changed from 0x8C;
      inbyte <<= 1; // changed from right shift
    }
  }
  return crc;
}

/*********************************************************************************************\
 * Check for valid sensor ID
 \*********************************************************************************************/
byte Plugin_040_ProtocolCheckID(byte checkID)
{
  for (byte x=0; x<5; x++) if (Plugin_040_ProtocolValidID[x] == checkID) return Plugin_040_ProtocolVar[x];
  return 0;
}
#endif //CORE
Voyager
 
Berichten: 180
Geregistreerd: 23 okt 2014, 14:26

Keer terug naar Nodo Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers. en 1 gast

cron