X

Traitement des données IOT avec SQLite et Golang


Dernière mise à jour : 9 janvier 2023

Construisez des applications Go plus rapidement avec du code testé pré-construit.
Découvrez mon cours sur le Accédez à la bibliothèque standard aujourd’hui!

Vous pouvez suivre ce cours pendant gratuit. Cliquez ici pour échanger !


Une vague de chaleur sans précédent a secoué le nord-ouest du Pacifique en juin. L’Oregon s’est transformé en four. Cela m’a donné une autre raison de sortir un Raspberry Pi et de collecter des données. Je l’ai envoyé à Adafruit car il reste l’un des meilleurs endroits pour envoyer et consulter des données IoT.

Le premier jour, j’ai placé un Raspberry Pi sous mon deck pour collecter et envoyer des données de température et d’humidité.

Je voulais obtenir la température de l’air ambiant aussi précisément que possible. J’ai placé le Raspberry Pi (Zero) sous le pont pour qu’il ne soit pas en plein soleil. C’est à l’ombre 24h/24 et 7j/7. Les solives bloquent la brise.

Puis mon fils a eu une idée incroyable :

Let's put a sensor in a car to see how hot it gets inside the cabin.

Super! J’ai donc installé un 2e Raspberry Pi à cet effet. Je l’ai mis dans la console centrale de notre Ford Focus. Je ne voulais pas non plus que celui-ci soit exposé à la lumière directe du soleil. La voiture elle-même était en plein soleil tout le temps. Je l’ai garé dans un endroit où il n’y avait pas d’ombre.

J’ai ouvert chaque fenêtre d’environ 2 pouces :

Puis mesuré les résultats sur quelques jours.

Dans cet article, je vais vous montrer comment nous avons construit cette configuration et les données que j’ai trouvées.

Vous pouvez passer à cette section si vous souhaitez uniquement voir les résultats.

Étape 1 : Configuration du Raspberry Pis

Pour collecter et envoyer ces données, j’ai utilisé deux Raspberry Pi configurés à l’identique.

Sous le pont (température extérieure)

À l’intérieur de la voiture

J’ai câblé les capteurs comme ceci:

Ils ont tous deux été configurés avec ces instructions si vous souhaitez l’essayer vous-même.

J’ai même fait une diffusion en direct lorsque j’ai installé le pi dans la voiture si vous voulez le voir en action.

Étape 2 : Collecte des données

J’ai envoyé les données à Adafruit et je l’ai laissé collecter des données pendant quelques jours. Adafruit m’a donné de jolis graphiques en temps réel à regarder :

C’était parfait pour les données en temps réel. La configuration est très simple. Encore une fois, je couvre comment envoyer des données à Adafruit et configurer un tableau de bord.

Bien que les tableaux de bord soient soignés, je voulais prendre l’ensemble des données et l’examiner. Les tableaux de bord n’affichent qu’une fenêtre de 24 heures, mais Adafruit collecte les données et vous pouvez les exporter au format JSON ou CSV.

J’ai donc exporté les données pendant quelques jours dans des fichiers CSV. Je pouvais les parcourir et vérifier des choses, mais je voulais fusionner toutes les données. J’ai décidé de les déposer dans une base de données SQLite pour ce faire.

Étape 3 : Traitement des données

J’ai eu quelques problèmes dès le départ lorsque je les ai déposés dans une base de données.

  • J’ai quatre flux d’informations distincts :
    • Température extérieure
    • Humidité extérieure
    • Température de la voiture
    • Voiture Humidité

J’ai dû les consolider dans une seule base de données. Ce qui a créé un autre problème :

  • Les échantillons ont tous été prélevés à des moments légèrement différents.

Les capteurs prélevaient des échantillons toutes les trente secondes. Les deux Raspberry Pi n’étaient pas synchronisés et il y avait une certaine dérive de l’horloge.


Étant donné que les horodatages montraient que les capteurs ne prenaient jamais les températures en même temps, je devrais sacrifier une certaine précision.

J’ai abordé ce problème en direct sur mon flux Twitch. J’arrondis les secondes et utilise cet horodatage comme index pour les valeurs.

timestamp := records[i][3][:len(records[i][3])-4]
seconds, err := strconv.Atoi(string(timestamp[len(timestamp)-2:]))

if err != nil {
  log.Printf("Error: %v", err)
}

if seconds >= 30 {
  timestamp = timestamp[:len(timestamp)-2] + "30"
} else {
  timestamp = timestamp[:len(timestamp)-2] + "00"
}

ourValue, err := strconv.ParseFloat(records[i][1], 64)

J’ai écrit un programme Go en direct sur le flux qui a fait ce qui suit :

  • Lire dans les fichiers CSV (un par flux de données)
  • Stocké dans Sqlite

Tout d’abord, j’ai pris le CSV contenant le moins d’enregistrements. De cette façon, je savais que nous aurions le plus de valeurs qui se chevauchent. Certains flux de données étaient plus longs mais n’auraient pas de valeurs dans les flux plus petits. C’était donc le point de départ.

J’ai lu dans ce fichier et créé une table avec l’horodatage et la valeur incluse. L’horodatage serait notre index.

func FirstInsert(db *sql.DB, timestamp string, value float64) (bool, error) {

	insertReadingSql := `INSERT INTO Reading (TimeStamp, CarTemperature) VALUES (?,?)`

	statement, err := db.Prepare(insertReadingSql)

	if err != nil {
		log.Println("Failed to prepare SQL Statement")
		return false, err
	}

	_, err = statement.Exec(timestamp, value)

	if err != nil {
		log.Println("Failed to insert data")
		log.Printf("Timestamp: %v \n Value: %v \n", timestamp, value)
		return false, err
	}

	return true, nil
}

Ensuite, pour les flux suivants, j’ai lu dans chacun de ces .CSV et inséré des valeurs dans les horodatages correspondants :

func InsertData(db *sql.DB, columnname string, timestamp string, value float64) (bool, error) {

	updateReadingSql := `UPDATE Reading SET ` + columnname + ` =? WHERE TimeStamp = ?`

	statement, err := db.Prepare(updateReadingSql)

	if err != nil {
		log.Println("Failed to prepare SQL Statement")
		return false, err
	}
	_, err = statement.Exec(value, timestamp)

	if err != nil {
		log.Println("Failed to insert data")
		return false, err
	}

	return true, nil
}

Et au final, j’avais une belle base de données SQLite avec les valeurs dont j’avais besoin.

Vous pouvez télécharger toutes ces données et l’application pour les traiter ici.

Alors, à quel point a-t-il fait chaud ? ?

Maintenant, je peux plonger dans les données et avoir une bonne idée de la chaleur qu’il faisait dehors et de la température dans la voiture.

Température maximale à l’extérieur :

Température maximale dans la voiture :

Ouah. C’était inattendu. Et j’aimerais faire correspondre un peu les choses pour voir l’inverse de chacune.

La température a atteint son point le plus chaud à 2021-06-29 00:34:30 donc, le 29 juin à 17h34.

La température extérieure a culminé à 119,84 et la température à l’intérieur de la voiture était 159.08. Incroyable.

Qu’en est-il de la température maximale de la voiture ?

Malheureusement, le capteur de température extérieure n’a pas lu pendant ce temps, mais c’était environ une heure plus tard et a atteint 170,78 degrés. C’est avec les fenêtres ouvertes. Bien que cela se soit passé à plus de 100 températures, c’est quelque chose à considérer lorsque vous voyez un enfant ou un animal de compagnie dans une voiture par une chaude journée.

Il y a d’autres choses que nous pouvons examiner avec ces données. Voyons la relation entre les deux températures.

Voici un joli graphique de la température de la voiture par rapport à la température extérieure :

Il est intéressant de voir comment tard dans la nuit, lorsque les choses se sont “refroidies” à environ 80 degrés, les deux températures s’égalisent presque. Pourtant, si nous zoomons plus profondément, nous pouvons voir visuellement comment la chaleur s’accumule dans la voiture :

À un certain moment, il semble même que la voiture ait été glacière que la température extérieure.

A minuit, la voiture n’était plus qu’un deux degrés plus chaud que la température extérieure.

A 5h du matin c’était quatre degrés plus frais dans la voiture.

Quelques heures plus tard, c’était huit degrés plus chaud qu’à l’extérieur.

Près du pic de la journée, c’était 50 degrés plus chaud dans la voiture. Incroyable.

Vous pouvez voir les pics et les creux dans les graphiques.

Je ferai encore plus avec ces données à l’avenir. Très curieux de savoir comment cela s’est accéléré, et je veux en savoir plus.

Conclusion

J’ai donc toujours été contre le fait de laisser les enfants et les animaux domestiques dans votre voiture par une chaude journée. La plupart d’entre nous le sont. Mais il est intéressant de voir exactement à quel point il fait chaud à l’intérieur d’une voiture. C’est une justification absolue pour appeler la police quand vous le voyez. fin de la diatribe.

Ces données sont uniques en ce sens que nous avons mesuré pendant plus de 110 degrés-jours, mais vous pouvez toujours voir les effets de la voiture. La seule fois où la voiture n’était pas plus chaud qu’à l’extérieur quand il n’y avait pas de soleil dessus. Nous pouvons en déduire que le soleil qui brille à travers les vitres (elles ne sont pas teintées sur cette voiture) affecte la température intérieure. S’il s’agissait d’une journée ensoleillée à 80 degrés, j’imagine que l’intérieur pourrait encore être à 120 degrés ou plus.

Leçon : Nous savons tous que les voitures assises au soleil deviennent plus chaudes. Maintenant, nous pouvons voir exactement combien plus chaud.

Je voulais partager ces données, comment je les ai rassemblées et quels en ont été les résultats. J’espère que vous l’avez apprécié.

Vous pouvez télécharger ces données et les traiter vous-même. Les horodatages sont UTC, et je suis dans la région PST, alors gardez cela à l’esprit. Je suis curieux de voir ce que d’autres pourraient faire avec ces données.

Et n’oubliez pas de consulter certains des flux en direct que j’ai réalisés en travaillant sur ces données.

Des questions? Commentaires? Me crier dessus!

Vous voulez devenir un programmeur Go expert ?

Vous pouvez booster vos compétences en quelques week-ends en suivant ces cours de Go de haute qualité dispensés par les meilleurs experts !

Nous avons plus de 30 heures de cours de Go que vous pouvez suivre dès maintenant ! Vous pouvez l’essayer gratuitement pendant 10 jours.