Πίνακας περιεχομένων
Τα δεδομένα GPS αλλάζουν συνεχώς όταν ταξιδεύετε. Ο στόχος εδώ είναι να χρησιμοποιήσετε το SmartHome στο HomeMatic ή το RaspberryMatic για να καταγράψετε αυτά τα δεδομένα και, εάν είναι απαραίτητο, να ενημερώσετε άλλες παραμέτρους που εξαρτώνται από αυτά.
Θα μπορούσατε, βέβαια, να προσδιορίζετε συνεχώς την τοποθεσία και, επομένως, να ανακτάτε πάντα τα δεδομένα καιρού σε σχέση με την τοποθεσία, αλλά αυτό θα δημιουργούσε περιττή διαδικτυακή κίνηση και φορτίο επεξεργαστή. Ως εκ τούτου, το σύστημα ελέγχει μόνο για αλλαγή θέσης και προσδιορίζει τα δεδομένα καιρού σε σχέση με την τρέχουσα θέση μόνο όταν αναγνωρίζεται αλλαγή θέσης και ενημερώνει τα δεδομένα αναλόγως.
Προσαρμογή των δεδομένων GPS για σύγκριση
Καθώς οι συντεταγμένες GPS αυξομειώνονται πάντα στα δύο τελευταία ψηφία των τιμών γεωγραφικού μήκους και πλάτους λόγω της σκόπιμης ανακρίβειας των παρόχων υπηρεσιών GPS, ακόμη και αν παραμείνετε στην ίδια τοποθεσία αμετάβλητοι, λαμβάνονται υπόψη μόνο τέσσερα δεκαδικά ψηφία για τη σύγκριση. Επομένως, μια αλλαγή θέσης αναγνωρίζεται μόνο εάν αλλάξει τουλάχιστον το τέταρτο δεκαδικό ψηφίο.
Συμπλήρωμα σεναρίου (GPS_Data)
Οι ακόλουθες γραμμές σεναρίου προστίθενται στο εδώ συζητήθηκε το σενάριο GPS_Data προστέθηκε. Οι γραμμές που αρχίζουν με θαυμαστικό αντιπροσωπεύουν σχόλια. Οι δηλώσεις WriteLine χρησιμοποιούνται μόνο για τον έλεγχο της εξόδου και μπορούν να διαγραφούν.
Πρέπει να δημιουργηθούν νέες μεταβλητές του τύπου DRAWING CHAIN:
- W_Lat_short_act (Για την αποθήκευση του τρέχοντος γεωγραφικού πλάτους με τέσσερα δεκαδικά ψηφία)
- W_Lon_short_act (Για την αποθήκευση του τρέχοντος γεωγραφικού μήκους με τετραγωνισμένα δεκαδικά ψηφία)
- W_Lat_short_old (Για να αποθηκεύσετε το - παλιό - γεωγραφικό πλάτος περικομμένο σε τέσσερα δεκαδικά ψηφία)
- W_Lon_short_old (Για την αποθήκευση του - παλαιού - γεωγραφικού μήκους με αποκοπή σε τέσσερα δεκαδικά ψηφία)
Σενάριο
! Αποθήκευση γεωδεδομένων περικομμένων σε 4 δεκαδικά ψηφία (ToString(4))
var lat_short_akt = lat.ToString(4),
WriteLine("lat_short_akt");WriteLine(lat_short_akt),
dom.GetObject('W_Lat_short_akt').State(lat_short_akt),
var lon_short_akt = lon.ToString(4),
WriteLine("lon_short");WriteLine(lon_short_akt),
dom.GetObject('W_Lon_short_akt').State(lon_short_akt),
! Σύγκριση τρέχουσας και παλαιάς θέσης
var W_lat_short_alt = dom.GetObject("W_Lat_short_alt").Value();WriteLine(W_lat_short_alt),
var W_lon_short_alt = dom.GetObject("W_Lon_short_alt").Value();WriteLine(W_lon_short_alt),
if ((lat_short_akt W_lat_short_alt) && (lon_short_akt W_lon_short_alt))
{
dom.GetObject("W_Lat_short_alt").State(lat_short_akt),
dom.GetObject("W_Lon_short_alt").State(lon_short_akt),
! Συγκεντρώστε τη διεύθυνση URL με τα τρέχοντα δεδομένα GPS - το AppID "... xxx ..." πρέπει να συμπληρωθεί με το δικό σας ID.
var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]",
WriteLine("νέα διεύθυνση URL για νέα γεωδεδομένα");WriteLine(url),
! Αποστολή της αίτησης URL
var posValueStart,
var posValueEnd,
var pos,
var data,
var posStart,
var posEnd; string stderr; string stdout,
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr),
WriteLine(stdout),
! Εξαγωγή των δεδομένων
! Όνομα_πόλης
pos = 0,
posStart = 'name':"',
posEnd = '", "local_names",
posValueStart = stdout.Find(posStart) + posStart.Length(),
posValueEnd = stdout.Find(posEnd)-posValueStart,
string city_name = stdout.Substr(posValueStart, posValueEnd),
WriteLine("όνομα πόλης");WriteLine(όνομα πόλης),
dom.GetObject("W_city_name").State(city_name),
! Κωδικός χώρας
pos = 0,
posStart = 'country":"',
posEnd = '", "state",
posValueStart = stdout.Find(posStart) + posStart.Length(),
posValueEnd = stdout.Find(posEnd)-posValueStart,
string country_code = stdout.Substr(posValueStart, posValueEnd),
WriteLine("country_code");WriteLine(country_code),
dom.GetObject("W_country_code").State(country_code),
! Περιοχή
pos = 0,
posStart = 'state":"',
posEnd = '"}]",
posValueStart = stdout.Find(posStart) + posStart.Length(),
posValueEnd = stdout.Find(posEnd)-posValueStart,
string W_region = stdout.Substr(posValueStart, posValueEnd),
WriteLine("W_region");WriteLine(W_region),
dom.GetObject("W_region").State(W_region),
}
! Ο κλάδος ELSE μπορεί να παραλειφθεί και χρησιμοποιείται μόνο για να επαληθεύσει ότι το σενάριο έχει εκτελεστεί μέχρι τέλους, εάν η θέση δεν έχει αλλάξει
else
{
WriteLine("Τα δεδομένα είναι ίσα"),
}