Die iSpindel kann ihre Dtaen, wie Temperatur, Neigungswinkel und berechnete Dichte an verschiende Dienste im Netz senden. Aber sie kann auch die Daten über TCP an einen lokalen Server senden. Wer also nicht möchte, dass seine Daten irgendwo ins Netz gesendet werden, kann hier recht einfach einen Server dafür auf einem RaspberryPi aufsetzen. Wichtig ist, dass beide sich im gleichen Netz befinden.
Damit dies funktioniert muss im Setup Menu der iSpindel der Service Type auf TCP gesetzt werden und dazu auch eine IP Adresse und Port angegeben werden, auf dem der Server lauscht. Das Messgerät verbindet sich dann alle angegebenen Sekunden mit dem Server und versucht seine Daten als JSON Daten zu verschicken.
#!/usr/bin/python3 from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR from datetime import datetime import _thread import time import json import time import os import sys #-------------variablen------------------ filepath = "/home/pi/Diskstation/Andre/projekte/" srv_port = 9501 delim = "," nline = "\r\n" rcv_buffer = 256 #-------------variablen------------------ def recv_handler(clientsock, addr) : inpstr = "" spindle_name = "" spindle_id = 0 angle = 0.0 temperature = 0.0 battery = 0.0 gravity = 0.0 user_token = "" interval = 0 rssi = 0 inpstr = "" while 1: data = clientsock.recv(rcv_buffer) inpstr += str(data.rstrip().decode("utf-8")) if not data: break clientsock.close() if inpstr[0] == "{": if inpstr.find("}") != -1: jinput = json.loads(inpstr) spindle_name = jinput["name"] spindle_id = jinput["ID"] angle = jinput["angle"] temperature = jinput["temperature"] battery = jinput["battery"] try: gravity = jinput['gravity'] interval = jinput['interval'] rssi = jinput['RSSI'] except: print("old fw") try: user_token = jinput['token'] except: user_token = '*' try: with open(filepath+str(spindle_name)+".csv", 'a') as csv_file: cdt = datetime.now() outstr = cdt.strftime("D:%x,C:%X") + delim outstr += "A:"+str(angle) + delim outstr += "G:"+str(gravity) + delim outstr += "T:"+str(temperature) + delim outstr += "B:"+str(battery) + delim outstr += "I:"+str(interval) + delim outstr += nline csv_file.writelines(outstr) print(outstr) print(repr(addr) + " CSV data written") except IOError: print(repr(addr) + " CSV Error: ") def main() : net_addr = ("0.0.0.0", srv_port) serversock = socket(AF_INET, SOCK_STREAM) serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) serversock.bind(net_addr) serversock.listen(5) while 1: print("waiting for connection on port: " + str(srv_port)) clientsock, addr = serversock.accept() print("connected: " + str(addr)) _thread.start_new_thread(recv_handler, (clientsock, addr)) main()
Der Server ist in Python3 geschrieben und der Interpreter ist bei einer Python Installation standardmäßig mit dabei. Das Skript muss dann lediglich gestartet werden. Es schreibt die Daten in eine CSV Datei hinein, die mit zB Tabellenkalkulationen bearbeitet werden kann.
<br>D:04/10/21,C:08:45:17,A:7.568016,G:7.568016,T:24.5,B:4.129301,I:15,<br>
Im Internet findet man auch noch viele anderer Server Programme, aber ich wollte meines so klein und einfach, wie möglich halten.
Links:
https://zwieselbrau.wordpress.com/2020/04/28/ispindel-elektronische-vergaerungsmessung/
https://itzwieseltal.wordpress.com/2019/12/09/raspberry-pi-4-als-server/
https://github.com/sky4walk/iSpindelClone/raw/master/software/server/iSpindelServerDateWriter.py