nodo-domotica.nl

werkende routine voor Oregon Scientific Remote Sensor

Hier alles over de Software in de Nodo

werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor mvdbro » 11 nov 2011, 09:27

Hallo Allemaal,

Ik zat eergisteren te googlen naar 'domotica' in het algemeen en kwam daarbij de RFXCOM unit tegen, een apparaat dat net zoals de nodo ook RF signalen kan ontvangen. Ik zag ook support voor Oregon Scientific (weerstations) en ik dacht als zij dat kunnen maken, dan moet de Nodo dat toch ook kunnen.

Dus gisteren maar even bij de Mediamarkt de goedkoopste Oregon temperatuurmeter met remote sensor gekocht (19 euro, acceptabel risico als het toch niet gaat werken...). Protocol documentatie gegoogled en gevonden en dus maar een routine in elkaar geknutseld.

En jawel, het werkt! Software is in 'alpha' stage, maar ik ontvang nu netjes elke 35 seconden de buitentemperatuur via 'rawsignal' event. Hoef ik geen gaten te boren om een directe sensor van de Nodo naar buiten te krijgen...

Hieronder de software routine, is zeker nog veel op aan te merken, maar het is dan ook mijn eerste poging tot uitbreiden van de Nodo. Ik weet overigens niet of uitbreiden van de code snel tot instabiliteit gaat leiden, ik begreep dat het geheugen van deze versie van de chip eigenlijk bijna vol zit.

/*********************************************************************************************\
* Analyseert een RF signaal van Oregon Scientific remote temperatuur sensoren.
* Routine is in 'alpha' stage, gebruik op eigen risico, neveneffecten op de Nodo Software niet bekend.
* Routine bevat (nog) geen foutdetectie en CRC check
* Minwaarde nog niet geimplementeerd.
* Alleen getest met Oregon Scientific THN132 remote sensor.
* Send na ontvangst een 'rawsignal' via de serial bus met structuur "ID, Channel, Measured Value"
* Alleen V2 protocol messages worden ondersteund, message format:
* AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCDDDDEEEEFFFFFFFFGGGGGGGGGGGG, A = startbits/preamble, B = sync bits, C = ID
* D = Channel, E = flags, F = RC, G = Meetwaarde, 3 digits BCD encoded
\*********************************************************************************************/

void Oregon_Decode(void)
{
int y = 1;
int c = 1;
unsigned long rfbit = 1;
unsigned long id = 0;
unsigned long channel = 0;
unsigned long data = 0;
byte digit1, digit2, digit3;

if (RawSignal[0] < 196) return;

for(byte x=1;x<=RawSignal[0];x++)
{
if(RawSignal[x] < 500)
{
rfbit = rfbit ^ 1;
x++;
}
if (y%2 == 1)
{
if ((c>21) && (c<37)) id = (id >> 1) | (rfbit << 15);
if ((c>36) && (c<41)) channel = (channel >> 1) | (rfbit << 3);
if ((c>52) && (c<65)) data = (data >> 1) | (rfbit << 11);
c++;
}
y++;
}
PrintText(Text_07);
PrintValue(id);
PrintChar(',');
PrintValue(channel);
PrintChar(',');
digit3 = data & 0xf;
digit2 = (data >> 4) & 0xf;
digit1 = (data >> 8) & 0xf;
PrintValue(digit1);
PrintValue(digit2);
PrintChar('.');
PrintValue(digit3);
PrintTerm();
}
mvdbro
 
Berichten: 1092
Geregistreerd: 21 okt 2011, 12:06

Re: werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor mvdbro » 17 nov 2011, 09:10

Ik ontving via een PB een verzoek om meer uitleg over hoe de code kan worden gebruikt. De eerder getoonde code was eigenlijk alleen bedoeld ter illustratie. Een kleine aanpassing is nodig om het ook daadwerkelijk te gebruiken. Hieronder de aangepaste code en instructies om het op te nemen in een bestaande Nodo routine.

Je kan het beste in de Arduino compiler in het Nodo_Due project een nieuw tabbblad b.v. 'custom' maken waarin je de oregon_decode routine opneemt. Ga dan naar het tabblad Signal_processing_IR_RF en pas de code aan in de functie 'AnalyzeRawSignal'. Ik heb alleen de eerste regel zoals hieronder te zien toegevoegd aan de bestaande code:

if(!(Code=Oregon_Decode()))
if(!(Code=RawSignal_2_Nodo()))
if(!(Code=RawSignal_2_KAKU()))
if(!(Code=RawSignal_2_NewKAKU()))
Code=RawSignal_2_32bit();

Daarnaast heb ik de buffer iets vergroot omdat de Oregon soms net iets meer bits verzend dan 200. Je doet dit in het tabblad "Nodo due". De oorspronkelijke waarde is 200, ik heb deze aangepast naar 210. Voor zover ik heb kunnen testen hebben deze aanpassingen geen neveneffecten veroorzaakt, maar ik geef geen garanties...

#define RAW_BUFFER_SIZE 210 // Maximaal aantal te ontvangen bits*2

Let er wel op dat deze routine alleen via rawsignal de data doorzend. Deze is dus eigenlijk alleen met eventghost te onvangen via een trigger op 'rawdata'. Op termijn zou het eigenlijk moeten worden omgebouwd zodat er binnen de Nodo een event wordt gecreerd en/of variable word ingesteld. De huidige variabelen zijn echter beperkt tot 8 bits, en om temperatuur op te slaan zou je eigenlijk een 16 bits nodig hebben. Dan kan het tekenbit alsmede de 3 digits BCD encoded worden opgeslagen. Ik heb dit zelf nog niet nodig. De routine geeft bij succes een returnwaarde 1 terug om aan te geven dat verdere analyse niet nodig is. Eigenlijk behoort deze een returnwaarde terug te geven die door de Nodo verder kan worden gebruikt als commando/eventcode

// functie in tabblad custom
// **************************** Oregon routine ************************************************
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 data = 0;
byte digit1, digit2, digit3;

// valid messages are between 196-206 pulses
if ((RawSignal[0] < 196) | (RawSignal[0] > 206)) return 0L;

// should start with minimum of 30 long pulses
for(byte x=1;x<=32;x++) if(RawSignal[x] > 500) startpulses++;
if (startpulses < 30) return 0L;

for(byte x=1;x<=RawSignal[0];x++)
{
if(RawSignal[x] < 500)
{
rfbit = rfbit ^ 1;
x++;
}
if (y%2 == 1)
{
if ((c>21) && (c<37)) id = (id >> 1) | (rfbit << 15);
if ((c>36) && (c<41)) channel = (channel >> 1) | (rfbit << 3);
if ((c>52) && (c<65)) data = (data >> 1) | (rfbit << 11);
c++;
}
y++;
}

PrintText(Text_07);
PrintValue(id);
PrintChar(',');
PrintValue(channel);
PrintChar(',');
digit3 = data & 0xf;
digit2 = (data >> 4) & 0xf;
digit1 = (data >> 8) & 0xf;
PrintValue(digit1);
PrintValue(digit2);
PrintChar('.');
PrintValue(digit3);
PrintTerm();
return 1L;
}
mvdbro
 
Berichten: 1092
Geregistreerd: 21 okt 2011, 12:06

Re: werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor wvh » 17 nov 2011, 09:54

Knap werk ga dit direct uit proberen , het zou prachtig zijn als dit in het nieuw nodo project toegevoegd zou kunen worden ;)
wvh
wvh
 
Berichten: 39
Geregistreerd: 15 nov 2011, 10:36

Re: werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor JeeGee » 17 nov 2011, 14:31

Cool. Straks met ethernet wellicht weer te geven op "internet".
JeeGee
 
Berichten: 92
Geregistreerd: 19 sep 2011, 12:58

Re: werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor Paul » 23 nov 2011, 17:11

De nieuwe Nodo release (nu in beta) heeft een mogelijkheid voor Userplugins. Dit is een ruimte voor een stuk eigen ontwikkelde code die je kunt aanroepen vanuit de standaard commandoset van de Nodo. Geheugen is niet meer zo'n issue want de Arduino mega heeft genoeg aan boord. Ik denk dat dit stuk code prima als plugin geschreven kan worden.

Goed iitiatief.
Groeten Paul
Paul
 
Berichten: 1152
Geregistreerd: 31 aug 2011, 20:33

Re: werkende routine voor Oregon Scientific Remote Sensor

Berichtdoor rwijbenga » 27 nov 2011, 18:53

Helemaal top dit ! :D
rwijbenga
 
Berichten: 344
Geregistreerd: 28 aug 2011, 14:58


Keer terug naar Nodo Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers. en 8 gasten

cron