Πίνακας περιεχομένων:

Hacking a LG Ducted Split for Home Automation: 8 βήματα (με εικόνες)
Hacking a LG Ducted Split for Home Automation: 8 βήματα (με εικόνες)

Βίντεο: Hacking a LG Ducted Split for Home Automation: 8 βήματα (με εικόνες)

Βίντεο: Hacking a LG Ducted Split for Home Automation: 8 βήματα (με εικόνες)
Βίντεο: Repairing LG Split Duct A/C 2024, Νοέμβριος
Anonim
Hacking a LG Ducted Split for Home Automation
Hacking a LG Ducted Split for Home Automation

Πρώτα απ 'όλα - Αυτό δεν είναι άλλο hack προσομοίωσης υπερύθρων τηλεχειριστηρίου. Το συγκεκριμένο AC δεν έχει καμία εύχρηστη διεπαφή σχεδιασμένη για οποιοδήποτε είδος ελέγχου εκτός από τα έξυπνα χειριστήρια που περιλαμβάνονται στον τοίχο.

Έχω ένα σύστημα αντίστροφης διάσπασης LG Ducted στο σπίτι μου. Δυστυχώς έγινε σε μια εποχή όπου το IoT δεν ήταν ψηλά σε καμία λίστα κατασκευαστών. Ανακάλυψα ότι είχε κάποιες επιλογές για τον "κύριο" έλεγχο, αλλά παρόλο που η μονάδα ήταν μόλις 2 ετών όταν την προσπάθησα για πρώτη φορά, οι πίνακες επέκτασης ήταν ανομπτάνιου και οι τιμές ήταν αστρονομικές ούτως ή άλλως. Όπως ήταν το πρόσθετο "Wireless RF Remote" που θα έκανε τα πράγματα πολύ πιο εύκολα αλλά αδύνατο να αγοραστούν.

Αν ήταν η επιλογή μου, δεν θα ήταν LG, αλλά αφού εγκαταστάθηκε στο σπίτι όταν το αγόρασα (και το κόστος αντικατάστασής του πιθανότατα θα υπερβαίνει τα 10.000 δολάρια) είναι αυτό με το οποίο έπρεπε να ασχοληθώ.

Στόχος - Να είναι σε θέση να ελέγχει το AC μέσω MQTT για σκοπούς αυτοματισμού μέσω OpenHAB και IFTTT/Google Assistant

Βήμα 1: Αποκωδικοποίηση της μορφής δεδομένων

Αποκωδικοποίηση της μορφής δεδομένων
Αποκωδικοποίηση της μορφής δεδομένων
Αποκωδικοποίηση της μορφής δεδομένων
Αποκωδικοποίηση της μορφής δεδομένων

Ξεκίνησα αυτή τη διαδικασία πριν από 4 χρόνια, αλλά δεν πήγα πολύ μακριά και δεν ήθελα να διακινδυνεύσω να βλάψω τη μονάδα - Ειδικά επειδή τα μέρη για αυτό φαίνεται σχεδόν αδύνατο να βρεθούν.

Σκίζοντας το χειριστήριο από τον τοίχο βρήκα 3 καλώδια τα οποία αποφάσισα ότι είναι γείωση, 12v και «σήμα»

Η τάση σηματοδότησης στη γραμμή δεδομένων ήταν στα 12v, αλλά παρατήρησα ότι φαινόταν να αυξομειώνεται στο πολύμετρο (κάποιο είδος παλμών στη γραμμή).

Μπήκα σε ένα βασικό κύκλωμα για να οδηγήσω έναν απομονωτή opto μέσω του πείρου δεδομένων και συνέδεσα την άλλη πλευρά του μονωτή opto ως είσοδο στην κάρτα ήχου του υπολογιστή μου και πήρα μια κακή έκδοση μιας εξόδου πεδίου (Εικόνα 1).

Αυτό είναι περίπου όσο έφτασα τότε - μπορούσα να δω ότι υπήρχε κάτι εκεί, αλλά δεν ήξερα πραγματικά πώς να το «αποκωδικοποιήσω».

Από τότε που ενεργοποίησα το Coffee Machine IoT, είχα ένα ανανεωμένο ενδιαφέρον να το δοκιμάσω ξανά με λίγη περισσότερη αποφασιστικότητα αυτή τη φορά.

Ανέβασα τα ευρήματά μου στα φόρουμ του EEVBlog για να δω αν κάποιος θα μπορούσε να ρίξει φως και ένας μεγάλος τύπος με το όνομα Ian ήρθε να με σώσει - το έθεσε με έναν τρόπο που είχε απόλυτο νόημα (Εικόνα 2)

Βασικά, η ροή δεδομένων είναι 13 byte του «τυπικού σειριακού» - 8 bits δεδομένων, ένα bit εκκίνησης και ένα bit bit (χωρίς ισοτιμία) αλλά με ΠΟΛΥ χαμηλό ρυθμό baud 104bps.

Βήμα 2: Κοιτάζοντας βαθύτερα

Κοιτάζοντας βαθύτερα
Κοιτάζοντας βαθύτερα

Έτσι τώρα που είχα μια ιδέα για το πώς διαμορφώθηκαν τα δεδομένα, χρειαζόμουν έναν τρόπο για να μπορώ να διαβάζω τα δεδομένα με πιο δυναμικό τρόπο.

Τράβηξα έναν από τους ελεγκτές μου από τον τοίχο και τον σύνδεσα μέσω ενός επιλογέα λογικής στάθμης σε ένα Arduino με ένα απλό σκίτσο για να διαβάσω 13 byte δεδομένων μέσω σειριακής θύρας λογισμικού που έχει ρυθμιστεί στα 104bps και να το εκτυπώσω:

168, 18, 0, 8, 0, 192, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 192, 6, 22, 0, 0, 0, 0, 40, 19, 0, 8, 0, 200, 6, 31, 0, 0, 0, 0, 40, 19, 0, 8, 0, 200, 6, 31, 0, 0, 0, 0, 200, 18, 0, 8, 64, 0, 6, 25, 0, 0, 0, 0, 200, 18, 0, 8, 64, 0, 6, 25, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, ** Στην πραγματικότητα 12 byte εδώ

Είχαμε δράση!

Αλλάζοντας τότε τις διάφορες ρυθμίσεις στο χειριστήριο, μπόρεσα να επεξεργαστώ τα byte που αλλάζουν:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Fan LOW168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, ανεμιστήρας MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, ανεμιστήρας HIGH

168, 67, 0, 0, 0, 248, 3, 33, 0, 0, 0, 0, 82, Z1234 168, 67, 0, 0, 0, 0, 192, 3, 34, 0, 0, 0, 0, 133, Z1 168, 67, 0, 0, 0, 160, 3, 34, 0, 0, 0, 0, 229, Z2 168, 67, 0, 0, 0, 144, 3, 34, 0, 0, 0, 0, 245, Z3 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Z4

168, 75, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 244, Mode FAN 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, Mode AUTO 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Mode COOL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, ΘΕΡΜΑΝΣΗ 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, Λειτουργία DH

168, 15, 0, 0, 0, 136, 3, 34, 0, 0, 0, 0, 49, Temp 18 168, 15, 0, 0, 0, 136, 4, 34, 0, 0, 0, 0, 48, Temp 19 168, 15, 0, 0, 0, 136, 5, 34, 0, 0, 0, 0, 51, Temp 20 168, 15, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 37, Temp 30

Οι αριθμοί είναι πολύ πιο λογικοί όταν τους κοιτάτε δυαδικά, αλλά τι συμβαίνει με το 13ο byte;; Είναι παντού…

Βήμα 3: Χαρτογράφηση

Χαρτογράφηση
Χαρτογράφηση

Μέσω δοκιμής και σφάλματος, μπόρεσα να προσδιορίσω τα σχετικά bit στα 13 bytes δεδομένων που θα χρειαζόμουν για να μπορώ να μεταδώσω.

Βήμα 4: Τοίχος από τούβλα μπροστά

Μπροστά τοίχος από τούβλα!
Μπροστά τοίχος από τούβλα!
Τοίχο από τούβλα μπροστά!
Τοίχο από τούβλα μπροστά!
Τοίχο από τούβλα μπροστά!
Τοίχο από τούβλα μπροστά!

Εδώ μπερδεύτηκε. Είχα δύο εμπόδια να ξεπεράσω

α) Το 13ο byte φάνηκε να είναι ένα άθροισμα ελέγχου των δεδομένων που χρειαζόμουν για να επεξεργαστώ με κάποιο τρόπο.β) Πώς μεταδίδω τα δεδομένα τότε; Είναι μόνο ένα καλώδιο.

Το τεύχος «α» αποδείχθηκε ΠΡΑΓΜΑΤΙΚΑ εύκολο, αλλά ήταν τυχαίο που κατάφερα να το ξεπεράσω.

Στις δοκιμές μου, έψαχνα σε στοιχεία όπως: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

Αυτά είναι τα 13bytes δεδομένων συμπεριλαμβανομένου του αθροίσματος ελέγχου (εδώ στο HEX αντί για DEC).

Όταν έψαχνα το μαντείο που είναι στο google για το "πώς να αντιστρέψω το άθροισμα ελέγχου", συνάντησα αυτήν τη σελίδα στο stack exchange με κάποιον άλλον με το όνομα Νικ που ρωτούσε σχεδόν το ίδιο πράγμα με εμένα αλλά όχι μόνο αυτό, μίλησαν για ένα κλιματιστικό και τα δεδομένα τους ήταν σχεδόν πανομοιότυπα με τα δικά μου - Θα μπορούσε να είναι;;; Σε όλη την αναζήτησή μου (σε περίπου 4 χρόνια), κανένα άτομο δεν είχε δημοσιεύσει καμία πληροφορία για το πώς να χακάρει το πρωτόκολλο σε αυτά τα κλιματιστικά και τυχαίνει να πέσω πάνω σε κάποιον που κάνει το ίδιο πράγμα αναζητώντας κάτι σχεδόν εντελώς άσχετο; Aταν ευλογία - δημοσίευσε ακόμη ότι το επεξεργάστηκε και η λύση ήταν: Προσθέστε όλα τα Bytes δεδομένων και στη συνέχεια XOR με το "U".

Με αυτό στο χέρι το πρόσθεσα στον κωδικό μου για να υπολογίσω τι θεωρώ ότι πρέπει να είναι το άθροισμα ελέγχου έναντι αυτού που ήταν στην πραγματικότητα, αλλά ήταν όλα ΛΑΘΟΣ !!

Όπως αποδείχθηκε, ήταν κάπως λάθος. Όταν άρχισα να κοιτάζω τους αριθμούς σε δυαδική μορφή, είχε απόλυτη αίσθηση.

Η απάντηση από το 'XOR με U' επέστρεφε πάντα 9 bits δεδομένων (το 9ο bit πάντα ένα) αλλά τα άλλα bits ήταν σωστά. Απλώς αφαίρεσα το 9ο bit παίρνοντας 256 από τον αριθμό που προέκυψε και μετά ταίριαξε !!

Αν δεν ήταν για αυτό το άτομο, θα μπορούσα να ξύνω το κεφάλι μου. Χαίρε και για αυτόν, αλλά δεν μπορώ να επικοινωνήσω μαζί του - αυτή ήταν βασικά η μόνη του ανάρτηση στο φόρουμ stackexchange. Λοιπόν, ευχαριστώ ξένο:)

Η επόμενη πρόκληση ήταν η δημιουργία ενός κυκλώματος που θα μου επέτρεπε να προσομοιώσω τον υπάρχοντα ελεγκτή. Χαρτογράφησα το σχηματικό για το κύκλωμα κίνησης (Pic1 και Pic 2), αλλά μου φάνηκε πολύ περίπλοκο για να χρειαστεί να το αναπαράγω για να πάρω αυτό που ήθελα. Είχα ήδη διαβάσει το σήμα τελικά. Επέλεξα μια πολύ απλούστερη μέθοδο - Χρησιμοποιώντας το arduino για να οδηγήσετε έναν απομονωτή opto για να τραβήξετε τη γραμμή σήματος 12v χαμηλά, όπως απαιτείται.

Σχεδίασα επίσης ένα απλούστερο κύκλωμα για το Rx αλλά αυτό δεν είναι δοκιμασμένο, κατέληξα να κολλήσω με τον μετατροπέα στάθμης για απλότητα.

Βήμα 5: Λειτουργώντας

Μόλις έβαλα το κύκλωμα εκπομπής σε πλάκα, και με μια αγωνιστική καρδιά, έπιασα μια (στατική) σειρά 12 byte, υπολόγισα το άθροισμα ελέγχου και έβαλα το arduino να στείλει την εντολή - Εκπληκτικά, η οθόνη ενημερώθηκε !!! Νίκη!

Η τελική πραγματική δοκιμή ήταν να προσθέσω το arduino μου στο BUS με τους 2 άλλους ελεγκτές για μια πραγματική ζωντανή δοκιμή και σίγουρα, λειτούργησε.

Έτσι, τώρα μπορούσα να διαβάζω και να γράφω στο λεωφορείο, αλλά απλώς δεν είχα τη δυνατότητα να το κάνω απλά.

Δεδομένου ότι χρησιμοποιώ το MQTT σχεδόν αποκλειστικά για όλους τους αυτοματισμούς στο σπίτι μου, ήταν φυσικό να είναι το ίδιο. Έγραψα τον κώδικα για αρκετές ημέρες για να ελέγξω τα 4 κύρια στοιχεία του AC, διαβάζοντας επίσης την υπάρχουσα κατάσταση (από τις άλλες ενότητες του BUS)

Η πρόθεση ήταν να λειτουργήσει ο κωδικός σε μια μονάδα ESP8266, ωστόσο φαίνεται ότι το ESP8266 δεν είναι σε θέση να παράγει ένα ρυθμό baud τόσο χαμηλό όσο 104bps. Έπρεπε να επιστρέψω σε ένα γενικό Arduino Uno με Wiznet ethernet, αλλά αυτό δεν ήταν δύσκολο, καθώς το ράφι μου ήταν κυριολεκτικά στην άλλη πλευρά του τοίχου από έναν από τους ελεγκτές AC.

Ο κώδικας είναι λίγο παντού, αλλά πρέπει να είναι ευανάγνωστος. Είχα πολλά προβλήματα με το να εμποδίσω τον ελεγκτή να διαβάσει τη δική του έξοδο, αλλά και να επαναλάβει τον κώδικα που έχει δημοσιεύσει, τα θέματα που έλαβε από το MQTT πίσω στο aircon. Βασικά, θα δημιουργούσε έναν άπειρο βρόχο. Στο τέλος, ορισμένες εκκαθαρίσεις buffer και καθυστερήσεις στην επεξεργασία του κώδικα μετά τη δημοσίευση στο MQTT το ταξινόμησαν.

Οι ακίδες Rx, Tx στο AC κωδικοποιούνται ως 3, 4, αλλά αλλάξτε αν θέλετε

Ο κώδικας έχει ρυθμιστεί ώστε να δημοσιεύει και να δέχεται εντολές ως εξής:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - Λειτουργία ψύξης, αφύγρανση, ανεμιστήρας, αυτόματο, Heatha/mod/5557/F 0/1/2 - Χαμηλός ανεμιστήρας, med, highha/mod/5557/Z, δηλαδή 1111 για όλες τις ζώνες σε 1000 για μόλις ζώνη 1 ενεργοποιημένη.

** Από τον ελεγκτή, οι ζώνες δεν μπορούν να ρυθμιστούν σε "0000", ωστόσο φαίνεται ότι αν εκδώσετε την τιμή, θα επιστρέψει σε "1000".

Η τελευταία έκδοση του κώδικα είναι διαθέσιμη από το GitHub Repo μου:

Βήμα 6: Κάτι πιο μόνιμο

Κάτι Πιο Μόνιμο
Κάτι Πιο Μόνιμο
Κάτι Πιο Μόνιμο
Κάτι Πιο Μόνιμο

Συγκέντρωσα έναν πρωτότυπο πίνακα arduino και εγκατέστησα όλα τα μέρη όπως τα έβαλα στο ψωμί.

Βήμα 7: Διαμόρφωση OpenHAB

Δείτε το συνημμένο αρχείο για στοιχεία OpenHAB, χάρτη ιστότοπου και κανόνες

Συνδυάστε το με το δέσιμο IFTTT OpenHab και το Google Assistant/Home και έχετε ένα πολύ δυνατό φωνητικό ή/και «έξυπνο» κλιματιστικό που ξεπερνά σχεδόν κάθε εμπορικά διαθέσιμο προϊόν!

Βήμα 8: Περίληψη

Συμπερασματικά - Εάν είστε μια από τις φτωχές ψυχές με ένα ελαφρώς παλαιότερο κλιματιστικό κλιματιστικό LG, δεν είστε μόνοι. Υπάρχει ακόμα ελπίδα για εμάς!

Ελπίζω ότι αυτό το διδακτικό θα βρει κάποιον που το χρειάζεται όσο εγώ. Βασικά ΔΕΝ υπάρχουν πληροφορίες που θα μπορούσα να βρω (εκτός από το άθροισμα ελέγχου από το «Nick»). Έπρεπε να ξεκινήσω από την αρχή, αλλά είμαι εκστασιασμένος με το αποτέλεσμα.

Οι πληροφορίες είναι λίγο ασαφείς, αλλά αν είστε στην ίδια κατάσταση με εμένα, θα είμαι περισσότερο από πρόθυμος να σας βοηθήσω.

- Προσοχή / Ενημέρωση --- Παρόλο που είναι δυνατή η αλλαγή των ρυθμίσεων στο AC με τη μονάδα Απενεργοποιημένη, διαπίστωσα ότι όταν πρόκειται για τον έλεγχο της Ζώνης φαίνεται να το μπερδεύει. Έκανα πολλές δοκιμές με τη μονάδα σβηστή και διαπίστωσα ότι οι ζώνες θα εμφανίζονταν ως ανενεργές, αλλά όταν η μονάδα λειτουργεί, φαίνεται ότι οι αποσβεστήρες δεν είναι πλήρως κλειστοί (αλλά ούτε και πλήρως ανοιχτοί). Έκανα επαναφορά της μονάδας στον κύριο διακόπτη και αυτό έλυσε το πρόβλημα. Δεδομένου ότι αλλάζουμε ζώνες μόνο όταν η μονάδα είναι ενεργοποιημένη, αυτό δεν ήταν πρόβλημα

Έχω επίσης ενημερώσει τον κώδικα για να δημοσιεύω μόνο (σε MQTT) αλλαγές που προέρχονται από τον κύριο ελεγκτή και όχι από την κύρια μονάδα. Για άλλη μια φορά, αυτό θα μπορούσε να προκαλέσει προβλήματα επειδή η κύρια μονάδα θα στείλει '0000' για τις ζώνες (που θα μπορούσε επίσης να ήταν το πρόβλημα)

Ο ενημερωμένος κώδικας εισάγει επίσης ορισμένους περιορισμούς χρονισμού για να αποτρέψει τη μετάδοση του arduino ταυτόχρονα με την κύρια και την κύρια μονάδα. Είμαι βέβαιος ότι υπάρχει πιθανώς μια μέθοδος που χρησιμοποιεί ο ελεγκτής για να ξεκινήσει μια αποστολή δεδομένων, όπως το να τραβάει τη γραμμή χαμηλά για το Xms πριν από την αποστολή, αλλά δεν το έχω ανακαλύψει ακόμα αν υπάρχει

Ανακάλυψα ότι η κύρια μονάδα θα στέλνει δεδομένα κάθε 60 δευτερόλεπτα και ο κύριος ελεγκτής στέλνει κάθε 20 δευτερόλεπτα. Ο κώδικας επιχειρεί να σταματήσει την αποστολή δεδομένων εντός 2 δευτερολέπτων από τη λήψη του πακέτου δεδομένων. Ωστόσο, μερικές φορές η κύρια και η κύρια μονάδα μεταδίδονται πολύ κοντά μεταξύ τους. Αυτό μάλλον θα τελειοποιηθεί σύντομα.--------------------------------

** Μπορεί να λειτουργήσει σε νεότερες μονάδες

*** Ορισμένες πληροφορίες που βρέθηκαν στα ερευνητικά μου ταξίδια έδειξαν ότι η διαχωριστική συσκευή Panasonic μπορεί να χρησιμοποιήσει το ίδιο πρωτόκολλο. YMMV.

Συνιστάται: