nodo-domotica.nl

byron bel plugin

Hier alles over de Software in de Nodo

byron bel plugin

Berichtdoor dodge » 28 feb 2015, 14:39

Hallo,
Ik ben bezig een plugin voor de byron bel die ik heb liggen.

nu loop ik tegen het volgende probleem:
als ik op de bel duw herhaalt hij het signaal 50X

dit heb ik gezien via de sniffer plugin.
Hierin wordt dit erg duidelijk aangegeven.

als ik nu echter in mijn plugin RawSignal.Number laat weergeven op de serial zie ik ongeveer 9x 255 voorbij komen. Terwijl dit er maar 26 zouden moeten zijn.
Alleen de laatste is meestal 26.
Doordat hij dit maar 1x goed ziet is de betrouwbaarheid natuurlijk niet erg goed.
nu denk ik dat de 50X te snel gaan en de nodo deze aan elkaar plakt.
wat doe ik fout? dat er een verschil is tussen wat ik nu krijg en wat ik met de sniffer zie?
dodge
 
Berichten: 38
Geregistreerd: 09 dec 2012, 13:32

Re: byron bel plugin

Berichtdoor mvdbro » 01 maart 2015, 14:00

Het lijkt erop dat de pauze tussen de herhalingen van het bericht kleiner is dan wat de Nodo verwacht. Waarde 255 is de "buffer full" situatie.

Ik had hetzelfde met de Xiron plugin. Opgelost door dit in de nodo config te zetten:

Code: Selecteer alles
#define SIGNAL_TIMEOUT                     3


Daar zou je mee kunnen experimenteren, alleen kan het ook negatieve effecten hebben op andere signalen.

gr
Martinus
mvdbro
 
Berichten: 1092
Geregistreerd: 21 okt 2011, 12:06

Re: byron bel plugin

Berichtdoor Voyager » 01 maart 2015, 16:39

Ja, ik had al een uitgebreid pb gedaan.. Timeout op 3 is geen optie ivm de vele andere plugins die pulse lengtes hebben die daarboven zitten.
Grotere buffer helpt iets..maar niet altijd.
Ik gebruik hier een vertaal plugin maar daar zsm meer over.
Voyager
 
Berichten: 180
Geregistreerd: 23 okt 2014, 14:26

Re: byron bel plugin

Berichtdoor dodge » 01 maart 2015, 21:41

Ik ben zo hard aan de slag gegaan met de tip van Voyager dat ik nog geen tijd heb gehad te reageren.
De tip was erg goed.

wat ik nu doe is uit de 255 de grotere tussenpuls zoeken. Vervolgens neem ik de volgende 26 als het signaal. Dit werkt perfect.
Ik ben nu bezig met het verzenden en ontvangen te combineren in 1 script.

zodra dit af is zal ik deze posten zodat andere deze ook kunnen testen.

stukje code dat ik nu gebruik.

Code: Selecteer alles
if (RawSignal.Number == 255) {

         int i=0;
         for(byte y=2;y<RawSignal.Number;y++) {

                  if (RawSignal.Pulses[y]*RawSignal.Multiply > 4000) {          //imput is going to fast skip to where new part is going to start
                     int pos1=y+1;
                     for (i=0;i<26;i++){
                         RawSignal.Pulses[1+i]=RawSignal.Pulses[pos1+1+i];        // new filling of the pulses
                         }
                         RawSignal.Number=26;
                  }
         }
dodge
 
Berichten: 38
Geregistreerd: 09 dec 2012, 13:32

Re: byron bel plugin

Berichtdoor dodge » 02 maart 2015, 21:16

Ik heb de plugin zover klaar.

De plugin zal het signaal van de drukknop ontvangen en dit signaal is ook weer te verzenden naar de bel.

Aangezien dit mijn eerste plugin is die vooral bestaat uit knippen en plakken uit andere plugins.
bij deze mijn verzoek aan de gene die er iets meer verstand van hebben om eens te kijken of de plugin nog te verbeteren valt.

kijk er maar eens naar:

Code: Selecteer alles
 //#######################################################################################################
//########################### Plugin-250 Byron Wireless Doorbell ########################################
//#######################################################################################################
/*********************************************************************************************\
 * This Plugin takes care of reception And sending of the Byron doorbell
 *
 * Auteur             : Maurice Ruiter (Dodge)
 * Support            : www.nodo-domotica.nl
 * Datum              : 1-3-2015
 * Versie             : 1.0
 * Nodo productnummer : n.v.t. meegeleverd met Nodo code.
 * Compatibiliteit    : Vanaf Nodo build nummer ???
 * Syntax             : "Byron <Par1:Beltone>, <Par2:Sensor ID>"
 * Syntax             : "ByronSend <Par1:Beltone>, <Par2:Sensor ID>"
 *********************************************************************************************
 * Changelog: v1.0 initial release
 *********************************************************************************************
 * Technical information:
 *
 * Compleet signal:
 * 101010101010100110101001
 * ID               Ringtone
 * 1010101010101001|10101001
 *
 * ID's:
 * 1010101001101010
 * 1010101010011001
 * 0101101010101010
 * 1001011001010101
 * 0101101010101010
 * 0110101001101001
 * 1001101010101001
 * 1010011001101010
 *
 * The ringtones:
 *
 * 10101001   169
 * 10100110   166
 * 10010110   150
 * 01010110   86
 * 01101001   105
 * 01011001   89
 * 01011010   90
 * 01100110   102
 \*********************************************************************************************/
#define PLUGIN_ID 250
#define PLUGIN_NAME "Byron"
#define PLUGIN_250_EVENT        "Byron"
#define PLUGIN_250_COMMAND  "ByronSend"
#define BYRON_PULSECOUNT 26

#define BYRONSTART                 100
#define BYRONSPACE                  250
#define BYRONLOW                   350
#define BYRONHIGH                  675

byte Plugin_250_ProtocolCheckID(byte checkID);

byte Plugin_250_ProtocolValidID[2];
byte Plugin_250_ProtocolVar[2];

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

  switch(function)
  {
#ifdef PLUGIN_250_CORE
  case PLUGIN_RAWSIGNAL_IN:
    {
      if (RawSignal.Number == 255) {

         int i=0;
         for(byte y=2;y<RawSignal.Number;y++) {

                  if (RawSignal.Pulses[y]*RawSignal.Multiply > 4000) {          //imput is going to fast skip to where new part is going to start
                     int pos1=y+1;
                     for (i=0;i<26;i++){
                         RawSignal.Pulses[1+i]=RawSignal.Pulses[pos1+1+i];        // new filling of the pulses
                         }
                         RawSignal.Number=26;
                  }
         }
}

      if (RawSignal.Number !=BYRON_PULSECOUNT) return false;
      byte basevar=0;
      unsigned long bitstream0=0;                   // holds first 16 bits
      unsigned long bitstream1=0;                   // holds the 4 bits for checksum
      unsigned long bitstream2=0;                   // holds last 8 bits
      byte checksum=0;
      byte bitcounter=0;                            // counts number of received bits (converted from pulses)
      //==================================================================================
      // get bytes
      for(byte x=0;x<RawSignal.Number-1;x++) {
         if (RawSignal.Pulses[x]*(RawSignal.Multiply*2) < 600) {
            if ((bitcounter < 9) && (bitcounter > 4)) {
               bitstream0 = (bitstream0 << 1);    // only need from bit 5 to 8 to do the checksum
               bitstream1 = (bitstream1 << 1);
               bitcounter++;
            } else if (bitcounter < 17) {
               bitstream1 = (bitstream1 << 1);
               bitcounter++;                     
            } else {
               bitstream2 = (bitstream2 << 1);   // this should give the ringtone
            }
         } else {
            if ((bitcounter < 9) && (bitcounter > 4)) {
               bitstream0 = (bitstream0 << 1) | 0x1;     // only need from bit 5 to 8 to do the checksum
               bitstream1 = (bitstream1 << 1) | 0x1;
               bitcounter++;
            } else if (bitcounter < 17) {
               bitstream1 = (bitstream1 << 1) | 0x1;
               bitcounter++;
            } else {
               bitstream2 = (bitstream2 << 1) | 0x1;    // this should give the ringtone
            }
         }
      }
      //==================================================================================
      // all bytes received, make sure checksum is okay
      //==================================================================================
      //Serial.print("Byron doorbell:");
      //Serial.println(bitstream2,BIN);
      checksum = bitstream0;              // Second block
      if ((checksum != 0xA) && (checksum != 0x6))  return false; // Should be '1010' => 0xA or '0110' => 0x6
      //==================================================================================
     // Serial.print(" ID=");
    //  Serial.print(bitstream1,DEC);
     // Serial.print(" Ring=");
     // Serial.println(bitstream2,HEX);
      //==================================================================================
 //     basevar = Plugin_250_ProtocolCheckID(bitstream1);

      event->Par1=bitstream2;
      event->Par2=bitstream1;
      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       = 250; // Nummer van dit device
      RawSignal.Repeats    = true;
      if (basevar == 0) return true;
      //==================================================================================
      RawSignal.Number=0;
      success = true;
      break;
    }      //einde ontvangen
   
   case PLUGIN_COMMAND:
    {

      unsigned long bitstream1=event->Par2;

    unsigned long bitstream=event->Par1;
    RawSignal.Multiply=50;
    RawSignal.Repeats=30;
    RawSignal.Delay=20;
    RawSignal.Pulses[1]=BYRONLOW/RawSignal.Multiply;
        for(byte x=17;x>=2;x=x-1)
      {
      if ((bitstream1 & 1) == 1) RawSignal.Pulses[x] = BYRONHIGH/RawSignal.Multiply;
      else RawSignal.Pulses[x] = BYRONLOW/RawSignal.Multiply;
      bitstream1 = bitstream1 >> 1;
      }
    for(byte x=25;x>=18;x=x-1)
      {
      if ((bitstream & 1) == 1) RawSignal.Pulses[x] = BYRONHIGH/RawSignal.Multiply;
      else RawSignal.Pulses[x] = BYRONLOW/RawSignal.Multiply;
      bitstream = bitstream >> 1;
      }

    RawSignal.Pulses[26]=BYRONSTART/RawSignal.Multiply;
    RawSignal.Number=26;

    RawSendRF();
    success=true;

    break;
    }

#endif // PLUGIN_250_CORE

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

    if(GetArgv(string,TempStr,1))
      {
      if(strcasecmp(TempStr,PLUGIN_250_EVENT)==0)
        {
        event->Type = NODO_TYPE_PLUGIN_EVENT;
        event->Command = 250; // Plugin nummer
        success=true;
        }
        if(strcasecmp(TempStr,PLUGIN_250_COMMAND)==0)
        {
        event->Type = NODO_TYPE_PLUGIN_COMMAND;
        event->Command = 250; // Plugin nummer
        success=true;
        }
      }
    free(TempStr);
    break;
    }

  case PLUGIN_MMI_OUT:
    {
       if(event->Type==NODO_TYPE_PLUGIN_EVENT)
        strcpy(string,PLUGIN_250_EVENT);                                        // Event
         
      else if(event->Type==NODO_TYPE_PLUGIN_COMMAND)
        strcpy(string,PLUGIN_250_COMMAND);                                      // Command

 //   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;
}


dodge
 
Berichten: 38
Geregistreerd: 09 dec 2012, 13:32

Re: byron bel plugin

Berichtdoor Voyager » 02 maart 2015, 21:57

Ziet er al heel netjes uit.. ik ga um ff testen :)

~William
Voyager
 
Berichten: 180
Geregistreerd: 23 okt 2014, 14:26


Keer terug naar Nodo Software

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 1 gast

cron