From 2083a5b3d662c6c9253533b37bb2ae7f4c62973b Mon Sep 17 00:00:00 2001 From: Joerg Lehmann Date: Wed, 1 Jul 2020 18:15:17 +0200 Subject: [PATCH] plausibility checks implemented --- lorahandler.go | 121 ++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/lorahandler.go b/lorahandler.go index ad74c5b..a8e71d3 100644 --- a/lorahandler.go +++ b/lorahandler.go @@ -2,10 +2,10 @@ package main import ( "bytes" + "encoding/base64" "encoding/binary" "encoding/hex" "encoding/json" - "encoding/base64" "fmt" "io/ioutil" "log" @@ -16,11 +16,12 @@ import ( ) const ( - MyDB = "beieliscaledb" - username = "beieli" - password = "beieli4president" - outputfile = "/home/beieli/lorahandler/lorahandler.log" - NOT_ATTACHED = -2147483648 + MyDB = "beieliscaledb" + username = "beieli" + password = "beieli4president" + outputfile = "/home/beieli/lorahandler/lorahandler.log" + NOT_PLAUSIBLE_16 = 65535 + NOT_PLAUSIBLE_32 = 2147483647 ) type MetadataTTN struct { @@ -28,9 +29,9 @@ type MetadataTTN struct { } type MessageTTN struct { - Hardware_serial string `json:"hardware_serial"` + Hardware_serial string `json:"hardware_serial"` Metadata MetadataTTN `json:"metadata"` - Payload_raw string `json:"payload_raw"` + Payload_raw string `json:"payload_raw"` } type MessageProperties struct { @@ -203,37 +204,37 @@ func DecodePayload(s string, deveui string, devaddr string, lrrlat float32, lrrl // the second measurement as first..., the same for humidity, which is usually too low... t := pl_1.T t = t + int16(pl_1.TC1) - if valid_measurements > 0 { - WriteDatapoint(tfp, deveui, devaddr, pl_1.Vbat, pl_1.H1, pl_1.P1, pl_1.W1, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 0 { + WriteDatapoint(tfp, deveui, devaddr, pl_1.Vbat, pl_1.H1, pl_1.P1, pl_1.W1, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } //t = t + int16(pl_1.TC1) - if valid_measurements > 1 { - WriteDatapoint(tfp+(step), deveui, devaddr, 0, pl_1.H2, pl_1.P2, pl_1.W2, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 1 { + WriteDatapoint(tfp+(step), deveui, devaddr, 0, pl_1.H2, pl_1.P2, pl_1.W2, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC2) - if valid_measurements > 2 { - WriteDatapoint(tfp+(2*step), deveui, devaddr, 0, pl_1.H3, pl_1.P3, pl_1.W3, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 2 { + WriteDatapoint(tfp+(2*step), deveui, devaddr, 0, pl_1.H3, pl_1.P3, pl_1.W3, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC3) - if valid_measurements > 3 { - WriteDatapoint(tfp+(3*step), deveui, devaddr, 0, pl_1.H4, pl_1.P4, pl_1.W4, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 3 { + WriteDatapoint(tfp+(3*step), deveui, devaddr, 0, pl_1.H4, pl_1.P4, pl_1.W4, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC4) - if valid_measurements > 4 { - WriteDatapoint(tfp+(4*step), deveui, devaddr, 0, pl_1.H5, pl_1.P5, pl_1.W5, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 4 { + WriteDatapoint(tfp+(4*step), deveui, devaddr, 0, pl_1.H5, pl_1.P5, pl_1.W5, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC5) - if valid_measurements > 5 { - WriteDatapoint(tfp+(5*step), deveui, devaddr, 0, pl_1.H6, pl_1.P6, pl_1.W6, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 5 { + WriteDatapoint(tfp+(5*step), deveui, devaddr, 0, pl_1.H6, pl_1.P6, pl_1.W6, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC6) - if valid_measurements > 6 { - WriteDatapoint(tfp+(6*step), deveui, devaddr, 0, pl_1.H7, pl_1.P7, pl_1.W7, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 6 { + WriteDatapoint(tfp+(6*step), deveui, devaddr, 0, pl_1.H7, pl_1.P7, pl_1.W7, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } t = t + int16(pl_1.TC7) - if valid_measurements > 7 { - WriteDatapoint(tfp+(7*step), deveui, devaddr, 0, pl_1.H8, pl_1.P8, pl_1.W8, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) - } + if valid_measurements > 7 { + WriteDatapoint(tfp+(7*step), deveui, devaddr, 0, pl_1.H8, pl_1.P8, pl_1.W8, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0) + } } } else if s[0:2] == "80" { fmt.Printf("{\n") @@ -259,19 +260,7 @@ func DecodePayload(s string, deveui string, devaddr string, lrrlat float32, lrrl var w uint16 w1_0_real := pl_128.W1_0 w2_0_real := pl_128.W2_0 - multiply_by_2 := false - if pl_128.W1_0 == NOT_ATTACHED { - w1_0_real = pl_128.W1 - multiply_by_2 = true - } - if pl_128.W2_0 == NOT_ATTACHED { - w2_0_real = pl_128.W2 - multiply_by_2 = true - } w32 = int32(((float64(pl_128.W1-w1_0_real) / float64(pl_128.W1_C)) + (float64(pl_128.W2-w2_0_real) / float64(pl_128.W2_C))) / 5.0) - if multiply_by_2 { - w32 = w32 * 2 - } if w32 < 0 { w = 0 } else if w32 > 65535 { @@ -325,6 +314,7 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint // wir nehmen humidity als Referenz, wenn diese > 0 ist, dann ist es // eine gueltige Messung var vp int16 // Voltage in % + var implausible bool //fmt.Printf("WriteDatapoint: h: %d\n", h) if h > 0 { vp = int16(v) - 70 @@ -346,7 +336,9 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint } s = fmt.Sprintf("measurement,deveui=%s devaddr=\"%s\",%sh=%di,p=%di,w=%di,t=%.1f,lrrlat=%f,lrrlon=%f%s %d\n", deveui, devaddr, sv, h, int32(p)+825, uint32(w)*5, float32(t)/10, lrrlat, lrrlon, sfw, mytime*60*1000*1000*1000) - WriteStringToFile(s, deveui) + implausible = (w1 == NOT_PLAUSIBLE_32) || (w2 == NOT_PLAUSIBLE_32) || (w == NOT_PLAUSIBLE_16) + + WriteStringToFile(s, deveui, implausible) w_gram := uint32(w) * 5 addValue(deveui, w_gram) @@ -360,20 +352,27 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint } } -func WriteStringToFile(s string, deveui string) { - n, err := file.WriteString(s) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - if n != len(s) { - fmt.Println("failed to write data") - os.Exit(1) +func WriteStringToFile(s string, deveui string, bool implausible) { + if !implausible { + n, err := file.WriteString(s) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + if n != len(s) { + fmt.Println("failed to write data") + os.Exit(1) + } } // Also write to individual files - datestr := time.Now().Format("2006-01") - individual_file := "/home/beieli/lorahandler/logs/" + deveui + "-" + datestr + ".log" + datestr := time.Now().Format("2006-01") + if implausible { + individual_file := "/home/beieli/lorahandler/logs/" + deveui + "-" + datestr + ".log" + } else { + individual_file := "/home/beieli/lorahandler/logs/" + "implausible" + "-" + datestr + ".log" + } + fi, err := os.OpenFile(individual_file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { fmt.Println(err) @@ -429,13 +428,13 @@ func main() { log.Printf("BODY: %s", rdr1) r.Body = rdr2 - // We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet, - // otherwise it should be a Swisscom Packet... + // We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet, + // otherwise it should be a Swisscom Packet... fmt.Printf("Length of JSON Body: %d\n", len(buf)) - if strings.Contains(string(buf),"mini-beieli") { - fmt.Printf("Seems to be a TTN Packet...\n") + if strings.Contains(string(buf), "mini-beieli") { + fmt.Printf("Seems to be a TTN Packet...\n") // it is probably a TTN package... err := json.NewDecoder(r.Body).Decode(&message_ttn) if err != nil { @@ -453,7 +452,7 @@ func main() { fmt.Println("Error: could not convert raw_package to hex: %s" + message_ttn.Payload_raw) } } else { - fmt.Printf("Seems to be a Swisscom Packet...\n") + fmt.Printf("Seems to be a Swisscom Packet...\n") // it is probably a Swisscom package... err := json.NewDecoder(r.Body).Decode(&message_swisscom) if err != nil {