door mvdbro » 25 mei 2012, 07:03
Dit is de code die ik gebruik voor de Nodo r386 beta. Ik ben er nog niet helemaal uit of dit de juiste wijze is om de call naar processevent te maken, maar het werkt in elk geval wel. De waardes komen bij mij ook in de Webapp terecht. Ik gebruik zelf 3 van deze sensoren en sla de waardes op in de Nodo variabelen 11,12 en 13.
unsigned long Oregon_Decode(void)
{
int y = 1;
int c = 1;
int startpulses = 0;
unsigned long rfbit = 1;
unsigned long id = 0;
unsigned long channel = 0;
unsigned long rc = 0;
unsigned long flags = 0;
unsigned long data = 0;
unsigned long sign = 0;
byte digit1, digit2, digit3;
byte var;
int datavalue = 0;
// valid messages are between 196-206 pulses
if ((RawSignal.Number < 196) | (RawSignal.Number > 206)) return 0L;
// should start with minimum of 30 long pulses
for(byte x=1;x<=32;x++) if(RawSignal.Pulses[x] > 500) startpulses++;
if (startpulses < 30) return 0L;
for(byte x=1;x<=RawSignal.Number;x++)
{
if(RawSignal.Pulses[x] < 500)
{
rfbit = rfbit ^ 1;
x++;
}
if (y%2 == 1)
{
if ((c>=21) && (c<=36)) id = (id >> 1) | (rfbit << 15);
if ((c>=37) && (c<=40)) channel = (channel >> 1) | (rfbit << 3);
if ((c>=41) && (c<=48)) rc = (rc >> 1) | (rfbit << 7);
if ((c>=49) && (c<=52)) flags = (flags >> 1) | (rfbit << 3);
if ((c>=53) && (c<=64)) data = (data >> 1) | (rfbit << 11);
if ((c>=65) && (c<=68)) sign = (sign >> 1) | (rfbit << 3);
c++;
}
y++;
}
digit3 = data & 0xf;
digit2 = (data >> 4) & 0xf;
digit1 = (data >> 8) & 0xf;
// if valid type (1230), update user variable and process event
if (id == 1230)
{
var = 10 + channel;
if (var == 14) var = 13;
if ((var >= 11) & (var <= 13))
{
datavalue = ((1000 * digit1) + (100 * digit2) + (10 * digit3));
if ((sign & 0x8) == 8) datavalue = -1 * datavalue;
UserVar[var-1] = datavalue;
ProcessEvent(AnalogInt2event(UserVar[var-1], var, CMD_VARIABLE_EVENT), VALUE_DIRECTION_INTERNAL, VALUE_SOURCE_VARIABLE, 0, 0);
}
}
// broadcast sensor data through UDP packet
// broadcastUDP(TempString);
return 1L;
}
Ik gebruik de plugin (nog) niet omdat deze pas wordt aangeroepen na de RAW signal verwerking. Ik wil dat deze functie als eerste in de RAWsignal verwerking wordt uitgevoerd en dat daarna verdere verwerking ook niet meer nodig is. Om dit te bereiken heb ik de functie 'AnalyzeRawSignal' ook aangepast:
unsigned long AnalyzeRawSignal(void)
{
unsigned long Code=0L;
if(RawSignal.Number==RAW_BUFFER_SIZE)return 0L; // Als het signaal een volle buffer beslaat is het zeer waarschijnlijk ruis.
if(Code=Oregon_Decode()) return 0L;
if(!(Code=HomeEasy_Decode()))
if(!(Code=RawSignal_2_Nodo()))
if(!(Code=RawSignal_2_KAKU()))
if(!(Code=RawSignal_2_NewKAKU()))
Code=RawSignal_2_32bit();
return Code; // Geen Nodo, KAKU of NewKAKU code. Genereer uit het onbekende signaal een (vrijwel) unieke 32-bit waarde uit.
}
Zo komen de waarden bij mij in de Nodo log voorbij:
Date=2012-05-25 (Fri), Time=07:58, System=Variables, Unit=1, Event=Variable 13,20.6
Date=2012-05-25 (Fri), Time=07:58, Output=HTTP(93.95.0.90), Event=Variable 13,20.6
Dit is dus sensor nr 3 met temperatuur 20.6 graden
Succes!