update to firmware 1.6
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
530a95cc36
commit
4b0fa0487a
34
lgt92.py
34
lgt92.py
|
@ -20,7 +20,7 @@ DST_INFLUX_USER = os.getenv("DST_INFLUX_USER")
|
||||||
DST_INFLUX_PASS = os.getenv("DST_INFLUX_PASS")
|
DST_INFLUX_PASS = os.getenv("DST_INFLUX_PASS")
|
||||||
DST_INFLUX_DB = os.getenv("DST_INFLUX_DB")
|
DST_INFLUX_DB = os.getenv("DST_INFLUX_DB")
|
||||||
HC_PING_URL = os.getenv("HC_PING_URL")
|
HC_PING_URL = os.getenv("HC_PING_URL")
|
||||||
VERSION = "V1.1"
|
VERSION = "v2.0"
|
||||||
|
|
||||||
OT_TOPIC="owntracks/tobru/dragino"
|
OT_TOPIC="owntracks/tobru/dragino"
|
||||||
OT_TID="dragino"
|
OT_TID="dragino"
|
||||||
|
@ -61,19 +61,19 @@ def on_message_ttn(client, userdata, msg):
|
||||||
logging.info("received via gw %s", gtw_id)
|
logging.info("received via gw %s", gtw_id)
|
||||||
|
|
||||||
# max is 4 volts, 3 volts is considered empty
|
# max is 4 volts, 3 volts is considered empty
|
||||||
batpercent = round((data["payload_fields"]["batV"] - 3) * 100)
|
batpercent = round((data["payload_fields"]["BatV"] - 3) * 100)
|
||||||
|
|
||||||
if data["payload_fields"]["alarm"]:
|
if data["payload_fields"]["ALARM_status"]:
|
||||||
print("ALARM button pressed")
|
print("ALARM button pressed")
|
||||||
|
|
||||||
got_fix = False
|
got_fix = False
|
||||||
if "latitude" in data["payload_fields"]:
|
if "Latitude" in data["payload_fields"]:
|
||||||
got_fix = True
|
got_fix = True
|
||||||
# transform received data into OwnTracks format
|
# transform received data into OwnTracks format
|
||||||
ot_data = json.dumps({
|
ot_data = json.dumps({
|
||||||
"_type": "location",
|
"_type": "location",
|
||||||
"lat": data["payload_fields"]["latitude"],
|
"lat": data["payload_fields"]["Latitude"],
|
||||||
"lon": data["payload_fields"]["longitude"],
|
"lon": data["payload_fields"]["Longitude"],
|
||||||
"batt": batpercent,
|
"batt": batpercent,
|
||||||
"t": "p",
|
"t": "p",
|
||||||
"tid": OT_TID,
|
"tid": OT_TID,
|
||||||
|
@ -85,11 +85,15 @@ def on_message_ttn(client, userdata, msg):
|
||||||
logging.info("publishing data to owntracks via mqtt %s", OT_TOPIC)
|
logging.info("publishing data to owntracks via mqtt %s", OT_TOPIC)
|
||||||
client_ot.publish(OT_TOPIC, payload=ot_data, retain=True, qos=1)
|
client_ot.publish(OT_TOPIC, payload=ot_data, retain=True, qos=1)
|
||||||
else:
|
else:
|
||||||
logging.info("no GPS data / latitude present")
|
logging.info("no GPS data (latitude) present")
|
||||||
# set GPS data to 0 for InfluxDB
|
# set GPS data to 0 for InfluxDB
|
||||||
data["payload_fields"]["latitude"] = 0.0
|
data["payload_fields"]["Latitude"] = 0.0
|
||||||
data["payload_fields"]["longitude"] = 0.0
|
data["payload_fields"]["Longitude"] = 0.0
|
||||||
|
|
||||||
|
logging.info("Motion detection: %s", data["payload_fields"]["MD"])
|
||||||
|
logging.info("LED status for position: %s", data["payload_fields"]["LON"])
|
||||||
|
logging.info("Firmware version: %s", data["payload_fields"]["FW"])
|
||||||
|
|
||||||
# write to influxdb
|
# write to influxdb
|
||||||
logging.info("writing data to influxdb")
|
logging.info("writing data to influxdb")
|
||||||
influxdb.write_points(
|
influxdb.write_points(
|
||||||
|
@ -99,12 +103,12 @@ def on_message_ttn(client, userdata, msg):
|
||||||
"device": "lgt92",
|
"device": "lgt92",
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"bat": float(data["payload_fields"]["batV"]),
|
"bat": float(data["payload_fields"]["BatV"]),
|
||||||
"pitch": float(data["payload_fields"]["pitch"]),
|
"pitch": float(data["payload_fields"]["Pitch"]),
|
||||||
"roll": float(data["payload_fields"]["roll"]),
|
"roll": float(data["payload_fields"]["Roll"]),
|
||||||
"lat": data["payload_fields"]["latitude"],
|
"lat": data["payload_fields"]["Latitude"],
|
||||||
"lon": data["payload_fields"]["longitude"],
|
"lon": data["payload_fields"]["Longitude"],
|
||||||
"alarm": int(data["payload_fields"]["alarm"]),
|
"alarm": int(data["payload_fields"]["ALARM_status"]),
|
||||||
"counter": data["counter"],
|
"counter": data["counter"],
|
||||||
"airtime": data["metadata"]["airtime"],
|
"airtime": data["metadata"]["airtime"],
|
||||||
"rssi": data["metadata"]["gateways"][0]["rssi"],
|
"rssi": data["metadata"]["gateways"][0]["rssi"],
|
||||||
|
|
|
@ -1,45 +1,47 @@
|
||||||
function Decoder(bytes, port) {
|
function Decoder(bytes, port) {
|
||||||
// Decode an uplink message from a buffer
|
return {
|
||||||
// (array) of bytes to an object of fields.
|
// GPS coordinates; signed 32 bits integer, MSB; unit: °
|
||||||
var alarm=(bytes[6] & 0x40)?true:false; //Alarm status
|
// When power is low (<2.84v), GPS won’t be able to get location
|
||||||
value=((bytes[6] & 0x3f) <<8) | bytes[7];
|
// info and GPS feature will be disabled and the location field
|
||||||
var batV=value/1000; //Battery,units:Volts
|
// will be filled with 0x0FFFFFFF, 0x0FFFFFFF.
|
||||||
value=bytes[8]<<8 | bytes[9];
|
|
||||||
if(bytes[8] & 0x80)
|
Latitude:
|
||||||
{
|
(bytes[0]<<24 | bytes[1]<<16 | bytes[2]<<8 | bytes[3]) / 1000000,
|
||||||
value |=0xFFFF0000;
|
|
||||||
}
|
Longitude:
|
||||||
var roll=value/100; //roll,units: °
|
(bytes[4]<<24 | bytes[5]<<16 | bytes[6]<<8 | bytes[7]) / 1000000,
|
||||||
value=bytes[10]<<8 | bytes[11];
|
|
||||||
if(bytes[10] & 0x80)
|
|
||||||
{
|
// Alarm status: boolean
|
||||||
value |=0xFFFF0000;
|
ALARM_status: (bytes[8] & 0x40) > 0,
|
||||||
}
|
|
||||||
var pitch=value/100; //pitch,units: °
|
// Battery; 14 bits; unit: V
|
||||||
var json={
|
BatV: ((bytes[8] & 0x3f)<<8 | bytes[9]) / 1000,
|
||||||
roll:roll,
|
|
||||||
pitch:pitch,
|
// Motion detection mode; 2 bits
|
||||||
batV:batV,
|
MD: {
|
||||||
alarm:alarm
|
"0": "Disable",
|
||||||
|
"1": "Move",
|
||||||
|
"2": "Collide",
|
||||||
|
"3": "Custom"
|
||||||
|
}[bytes[10]>>6],
|
||||||
|
|
||||||
|
// LED status for position, uplink and downlink; 1 bit
|
||||||
|
LON: (bytes[10] & 0x20) ? "ON" : "OFF",
|
||||||
|
|
||||||
|
// Firmware version; 5 bits
|
||||||
|
FW:150+(bytes[10] & 0x1f),
|
||||||
|
|
||||||
|
// Roll; signed 16 bits integer, MSB; unit: °
|
||||||
|
|
||||||
|
// Sign-extend to 32 bits to support negative values: shift 16 bytes
|
||||||
|
|
||||||
|
// too far to the left, followed by sign-propagating right shift
|
||||||
|
|
||||||
|
Roll: (bytes[11]<<24>>16 | bytes[12]) / 100,
|
||||||
|
|
||||||
|
// Pitch: signed 16 bits integer, MSB, unit: °
|
||||||
|
|
||||||
|
Pitch: (bytes[13]<<24>>16 | bytes[14]) / 100,
|
||||||
};
|
};
|
||||||
var value=bytes[0]<<16 | bytes[1]<<8 | bytes[2];
|
}
|
||||||
if(bytes[0] & 0x80)
|
|
||||||
{
|
|
||||||
value |=0xFFFFFF000000;
|
|
||||||
}
|
|
||||||
var value2=bytes[3]<<16 | bytes[4]<<8 | bytes[5];
|
|
||||||
if(bytes[3] & 0x80)
|
|
||||||
{
|
|
||||||
value2 |=0xFFFFFF000000;
|
|
||||||
}
|
|
||||||
if (value == 0x0FFFFF && value2 == 0x0FFFFF)
|
|
||||||
{
|
|
||||||
//gps disabled (low battery)
|
|
||||||
} else if (value === 0 && value2 === 0) {
|
|
||||||
//gps no position yet
|
|
||||||
} else {
|
|
||||||
json.latitude=value/10000; //gps latitude,units: °
|
|
||||||
json.longitude=value2/10000; //gps longitude,units: °
|
|
||||||
}
|
|
||||||
return json;
|
|
||||||
}
|
|
Loading…
Reference in New Issue