NEWS
Verarbeitung von CaCrosse Sensoren TX29DTH
-
-
Ich habe diesen mit dem Jeelink am laufen…. aber wird leider im Moment nicht weiter entwickelt [emoji53]
Gesendet von iPhone mit Tapatalk Pro
-
Cool!
Serialport in javascript läuft. Wieder ein Punkt von meiner Liste checked.
bald kann ich Nodered abschalten :-: Wieder 30MB mehr RAM auf dem raspi…
@simpixo: Kannst du kurz erklären wie du den jeelink ans laufen bekommen hast?
Dann gucke ich mir den auch mal an.
-
> Über welche HW kommen die RawDaten rein?
??RFLink, CUL, selbstgebastelt?
-
Das ist ein Selbstbastel jeelink Clone.
Ein Arduino Nano aus China für ein paar Eur + ein RF12B
und die aktuelle LaCrosseITPlusReader Version
#define PROGNAME "LaCrosseITPlusReader" #define PROGVERS "10.1q"
Das Ganze in einen Schrumpfschlauch verpackt
-
Wenn das der Adapter vom KleinenDrachen ist, der speichert die Sensordaten unter seiner ID ab, richtig?
Also sowas wie Lacrosse_65_xxxx
Das wollte ich ja nicht!
Wenn ich die Batterien wechsel, will ich nicht immer das Projekt umbauen. Deshalb kann ich jetzt über die VIS den Räumen die neue Addresse mitteilen.
-
Hier mal die version 2 vom Script, die den Nodered Aufsatz überflüssig macht!
Dank an den blauen Fuchs
iobroker bringt mich noch dazu, das ich javascript auch noch gut finde…
! ````
/* System Lacrosse
Skript wertet Jeelink LaCrossemeldungen aus
! A Leelink clone has to be connected to /dev/ttyUSB0
In node-red a single link between Serial In and Jeelink_RAW_data need to be build
(TODO: Bring Serialport into this script)
! 08.01.2017: Initial Script:
Script subscribe to "Jeelink_RAW_data" and on event it checks for "OK 9" -> TX29DTH
Temperature, Humidity and battery state is read, dewpoint is calculated
! the script creates all objects in IOBroker itself! For that, you need to
list rooms in variable defrooms!
/
//Variables to define if a new sensor in room is added
var defrooms = ["Schlafzimmer","Dachboden","Keller","Terrasse","Garten","Wintergarten"];
! // Variablen erstellen
var LookupRooms ={};
var SerialPort = require("serialport");
var port = new SerialPort("/dev/ttyUSB0", {
baudRate: 57600
});
! //############################### One Time execution on scriptstart#######################################
createState('Jeelink_RAW_data', {
read: true,
write: true,
type: 'string',
name: 'Jeelink Raw data'
});
! //create all rooms if not defined
defrooms.forEach(function(einArrayElement) {
createState('Rooms.'+einArrayElement+'.Temperatur',0, {read: true,write: true,type: 'number',
name: einArrayElement+' Temperatur',desc: ''});
createState('Rooms.'+einArrayElement+'.Feuchte',0, {read: true,write: true,type: 'number',
name: einArrayElement+' Feuchte',desc: ''});
createState('Rooms.'+einArrayElement+'.Taupunkt',0, {read: true,write: true,type: 'number',
name: einArrayElement+' Taupunkt',desc: ''});
createState('Rooms.'+einArrayElement+'.LC_Batterie',0, {read: true,write: true,type: 'boolean',
name: einArrayElement+' Taupunkt',desc: ''});
createState('Config.LaCrosse.Mapping.'+einArrayElement,0, {read: true,write: true,type: 'int',
name: 'Mapping from LaCrosse sensor to room'+einArrayElement,desc: ''});
//Add new room to Lookup table
LookupRooms[getState('Config.LaCrosse.Mapping.'+einArrayElement).val] = einArrayElement;
});
log("Defined rooms: "+JSON.stringify(LookupRooms));
! port.on('open', function() {
console.log('Connected');
});
! port.on('error', function(err) {
console.log('Error: ', err.message);
});
! // close port if the script stopped (to be able to open it again)
onStop(function (callback) {
if (port && port.isOpen()) {
console.log('Port closed');
port.close();
}
callback();
});
! //############################### Event execution #######################################
//Address of LaCrosse was manually changed, read Lookuptable again
on({id: /^javascript.0.Config.LaCrosse.Mapping.$/}, function(obj) {
LookupRooms = {};
defrooms.forEach(function(einArrayElement) {
LookupRooms[getState('Config.LaCrosse.Mapping.'+einArrayElement).val] = einArrayElement;
});
log("Lookuptable was reloaded");
});
! //New Value received from Jeelink Adapter //on("Jeelink_RAW_data",
port.on('data', function(obj) {
setState('Jeelink_RAW_data',obj.toString());
//log(obj.toString());
tokens = obj.toString();
//obj.state.val.split(" ");
var tokens = tokens.split(" ");
//Is it a La Crosse device?
if (tokens.shift() == "OK")
{
//Is it a DHT29 device?
if (tokens[0] == "9")
{
tokens.shift();
//log(tokens);
Parse_LaCrosseDHT(tokens);
}
else
{
//ToDO: Something more intelligent as only a log message
log('Unbekanntes LaCrosse Device: '+obj.toString());
}
}
else
{
//TODO: Identify other devices
log('Unbekanntes Device auf 868MHz: '+obj.toString());
}
});
! //############################### Helper functions #######################################
function Parse_LaCrosseDHT (Jeelinkstring) {
//we are expecting data in form "OK nodeid data1 data2 etc"
//# OK 9 ID XXX XXX XXX XXX
//# | | | | | | |
//# [4]| | | | | | --- Humidity incl. WeakBatteryFlag
//# [3]| | | | | |------ Temp * 10 + 1000 LSB
//# [2]| | | | |---------- Temp * 10 + 1000 MSB
//# [1]| | | |-------------- Sensor type (1 or 2) +128 if NewBatteryFlag
//# [0]| | |----------------- Sensor ID
//# | |------------------- fix "9"
//# |---------------------- fix "OK"
var b0,b1,b2,b3,b4;
var Addr =0,batt_new=0,type=0,channel=0,temperature=0,batt_low=0,humidity=0,dewpoint=0,Room='';
var idTopic ='';b0=parseInt(Jeelinkstring.shift());//ID b1=parseInt(Jeelinkstring.shift());//Type b2=parseInt(Jeelinkstring.shift());//Temp1 b3=parseInt(Jeelinkstring.shift());//Temp2 b4=parseInt(Jeelinkstring.shift());//Humidity
! //new battery flag
batt_new = (b1 & 0x80) >> 7;
//sensor type
type = (b1 & 0x70) >> 4;
//channel (evry time 1)
channel = b1 & 0x0F;
! //Calculate temperature
temperature = b2 * 256;
temperature = temperature + b3;
temperature = temperature - 1000;
temperature = (temperature/10).toFixed(1);//get Battery status battery_low = (b4 & 0x80) >> 7;
! //get humidity
humidity = (b4 & 0x7f).toFixed(0);
! //calculate dewpoint))
if(temperature !==null && humidity !==null )
{
var temp = -1.0temperature;
es = 6.112Math.exp(-1.017.67temp/(243.5 - temp));
ed = humidity/100.0es;
eln = Math.log(ed/6.112);
td = -243.5eln/(eln - 17.67 );
dewpoint = td.toFixed(2);
}//random address from sensor Addr = (b0*4).toString(16); //log("Adr: "+Addr); if (LookupRooms[Addr] === undefined) { log('Undefined LaCrosse Dev: '+ Addr+ ' Temp:'+temperature+' Hum:'+humidity); return; } else { Room = LookupRooms[Addr]; //Store data in iobroker setState('Rooms.'+Room+'.Temperatur',parseFloat(temperature)); setState('Rooms.'+Room+'.Feuchte',parseFloat(humidity)); setState('Rooms.'+Room+'.LC_Batterie',battery_low =="1"); setState('Rooms.'+Room+'.Taupunkt',parseFloat(dewpoint)); }
! }
! ```` -
Bzgl CUL:
Den habe ich auch noch am alten FHEM Aufsatz laufen, weil ich den CUL Adapter nicht ans laufen gebracht habe.
@Bluefox: Hast du eine Idee ob der adapter laufen müsste oder ist der veraltet / unbrauchbar?
Der CUL läuft unter /dev/ttyAMA0 auf 9600. Wenn ich den CUL-Adapter konfiguriere sagt er immer er will eine Zahl und nicht 9600… ?? :?
-
Auch wenn ich nur ein Frosch und kein Fuchs bin:
@DerUwe:Hast du eine Idee ob der adapter laufen müsste oder ist der veraltet / unbrauchbar?
Der CUL läuft unter /dev/ttyAMA0 auf 9600. Wenn ich den CUL-Adapter konfiguriere sagt er immer er will eine Zahl und nicht 9600… ?? `
Der aktuelle Adapter läuft nicht - es wird gerade ein neuer entwickelt siehe diesen Thread
http://forum.iobroker.net/viewtopic.php?f=35&t=4391
Gruß
rainer
-
Auch wenn ich nur ein Frosch und kein Fuchs bin:
Der aktuelle Adapter läuft nicht - es wird gerade ein neuer entwickelt siehe diesen Thread
http://forum.iobroker.net/viewtopic.php?f=35&t=4391
rainer `
Jo, welche Firmware kommt auf den Nano drauf?
Richtig cool wäre wenn der Adapter den CC1101 auf ook stellen und die FS20 Geräte steuern könnte!
-
Wenn das der Adapter vom KleinenDrachen ist, der speichert die Sensordaten unter seiner ID ab, richtig?
Also sowas wie Lacrosse_65_xxxx
Das wollte ich ja nicht!
Wenn ich die Batterien wechsel, will ich nicht immer das Projekt umbauen. Deshalb kann ich jetzt über die VIS den Räumen die neue Addresse mitteilen. `
Ja Beim Batteriewechsel muss ich auch die ID in meinen Script ändern, aber nur an einer Stelle!
Da historisiere ich auch die ganzen Daten! Das LaCrosse Objekt interessiert mich in der Hinsicht ja nicht! Also ist es fast genauso wie bei dir! Ich weise sozusagen die ID einem Raum zu [emoji1360]
Gruß
Adrian
Gesendet von iPhone mit Tapatalk Pro