ESPHome IEC 62056-21 Component
IEC 62056-21 είναι ένα διεθνές πρότυπο για ένα πρωτόκολλο ανταλλαγής δεδομένων με μετρητές κοινής ωφέλειας. Κυρίως για ηλεκτρική ενέργεια αλλά και για νερό, θερμική και άλλους μετρητές. Προηγουμένως ήταν γνωστό ως IEC 61107.
Το στοιχείο iec62056
σας επιτρέπει να διαβάσετε δεδομένα από οποιονδήποτε συμβατό μετρητή. Απαιτεί μια σειριακή θύρα και μια εξωτερική οπτική διεπαφή. Η ανταλλαγή δεδομένων χρησιμοποιεί ένα υπέρυθρο οπτικό κανάλι. Οι συμβατοί μετρητές είναι εξοπλισμένοι με μια χαρακτηριστική στρογγυλή μεταλλική πλάκα με δύο οπτοστοιχεία μέσα. Το πρωτόκολλο θα μπορούσε να χρησιμοποιηθεί με άλλα επίπεδα μεταφοράς, π.χ. βρόχος ρεύματος αλλά το στοιχείο δοκιμάστηκε μόνο με την οπτική διεπαφή.
Υποστηρίζει 4 λειτουργίες του IEC 62056-21: A, B, C και D. Η λειτουργία E δεν υποστηρίζεται.
Το στοιχείο δεν υποστηρίζει προγραμματισμό. Η ρύθμιση των παραμέτρων διαμόρφωσης του μετρητή απαιτεί έναν μυστικό κωδικό πρόσβασης που καθιστά αδύνατη τη χρήση από απλούς χρήστες.
Υπάρχουν άλλα πρότυπα έξυπνων μετρητών που χρησιμοποιούν την ίδια οπτική διεπαφή. Αν και μοιράζονται κάποιες κοινές έννοιες, δεν είναι συμβατά.
Εγκατάσταση
Προσθέστε τον ακόλουθο κώδικα στο αρχείο διαμόρφωσης YAML του ESPHome για να αναφερθείτε σε εξωτερικό στοιχείο.
yaml
external_components:
# IEC62056 component
- source: github://aquaticus/esphome-iec62056
Θεωρία λειτουργίας
Το στοιχείο λειτουργεί σε 2 κύριες λειτουργίες:
- Διμερής επικοινωνία με έναν μετρητή. Σε αυτή τη λειτουργία, ένας μετρητής στέλνει δεδομένα μόνο όταν ζητηθεί. Απαιτεί έναν δέκτη και πομπό IR. Αυτή είναι η λειτουργία A, B και C σύμφωνα με το IEC 62056-21.
- Μονομερής επικοινωνία, όπου ένας μετρητής στέλνει δεδομένα σε έναν ανιχνευτή από καιρό σε καιρό. Απαιτεί μόνο έναν δέκτη IR. Στην ορολογία του IEC 62056-21 είναι η λειτουργία D.
Λειτουργίες A, B, C
Το στοιχείο διαβάζει δεδομένα για πρώτη φορά 15 δευτερόλεπτα μετά την εκκίνηση. Πρώτα, στέλνει ένα αίτημα αναγνώρισης στα 300 bps. Ο μετρητής επιστρέφει τη μέγιστη ταχύτητα baud που μπορεί να χειριστεί. Στη συνέχεια, η ταχύτητα baud της σειριακής θύρας αλλάζει στην τιμή που παρέχεται από τον μετρητή ή ρυθμίζεται από την επιλογή baud_rate_max
. Ο μετρητής μεταδίδει δεδομένα καταχωρητών με τους σχετικούς κωδικούς OBIS.
Εάν η μετάδοση έχει αποτύχει (κακή αθροιστική τιμή ή μη έγκυρη μορφή), το εξάρτημα θα προσπαθήσει να διαβάσει τα δεδομένα ξανά, αλλά αυτή τη φορά χρησιμοποιώντας χαμηλότερη ταχύτητα μετάδοσης. Για κάθε επανάληψη, η ταχύτητα μειώνεται. Ο αριθμός των επαναλήψεων και οι καθυστερήσεις μπορούν να ρυθμιστούν.
Εάν ο μετρητής λειτουργεί με μπαταρία, μπορεί να εφαρμοστεί μια ειδική ακολουθία αφύπνισης. Αυτό συμβαίνει μόνο όταν το battery_meter
έχει οριστεί σε True
.
Λειτουργία D
Για μετρητές που λειτουργούν στη λειτουργία D, χρειάζεστε μόνο έναν δέκτη IR καθώς η μετάδοση σε έναν μετρητή δεν υποστηρίζεται. Σε αυτή τη λειτουργία, ο μετρητής στέλνει δεδομένα κάθε λίγα δευτερόλεπτα χωρίς καμία αίτηση. Πρέπει να ρυθμίσετε τη σειριακή θύρα ώστε να ταιριάζει με τη μορφή μετάδοσης του μετρητή. Σε αντίθεση με τις λειτουργίες A, B και C που ανιχνεύονται αυτόματα, η Λειτουργία D πρέπει να ενεργοποιηθεί χειροκίνητα ορίζοντας mode_d=True
στη διαμόρφωση της πλατφόρμας.
Λειτουργία E
Αυτή η λειτουργία δεν υποστηρίζεται. Η Λειτουργία E χρησιμοποιεί δυαδική κωδικοποίηση μέσω συνδέσμου HDLC.
Το εξάρτημα προσπαθεί να χρησιμοποιήσει τη λειτουργία C για μετρητές που αναφέρουν τη λειτουργία E. Αυτό θα πρέπει να λειτουργήσει εάν ο μετρητής υποστηρίζει και τις λειτουργίες E και C. Για μετρητές που υποστηρίζουν μόνο τη λειτουργία E, η ανάγνωση δεν είναι δυνατή.
Κωδικοί OBIS
Ο κωδικός OBIS (Object Identification System) αναγνωρίζει τις διάφορες μετρήσεις από έναν μετρητή. Ο κωδικός αποτελείται από έως και 6 υπο-αναγνωριστικά ομάδας. Ο κωδικός είναι μορφοποιημένος ως εξής: A-B:C.D.E*F
, όπου:
A
- μέσο: 0=αφηρημένα αντικείμενα, 1=ηλεκτρισμός, 6=θερμότητα, 7=αέριο, 8=νερόB
- κανάλι, 0=κανένα διαθέσιμο κανάλιC
- φυσική τιμή, για παράδειγμα ρεύμα, τάση, θερμοκρασία.D
- τύπος μέτρησης,E
- τιμολόγιο, 0=σύνολο, 1=τιμολόγιο #1, 2=τιμολόγιο #2 κ.ο.κ.F
- περίοδος χρέωσης
Τα A
, B
και F
μπορεί να παραλειφθούν. Οι κωδικοί μπορεί να χρησιμοποιούν δεκαεξαδικούς αριθμούς, για παράδειγμα, ο κωδικός 15.8.0
θα μπορούσε να αναπαρασταθεί ως F.8.0
.
Οι κωδικοί είναι τυποποιημένοι, αλλά οι συσκευές στέλνουν διαφορετικό αριθμό κωδικών. Για να λάβετε μια λίστα με τους κωδικούς που υποστηρίζονται από τον μετρητή σας, ενεργοποιήστε το DEBUG
log για το εξάρτημα iec62056
και παρατηρήστε την έξοδο του log. Δείγμα εξόδου:
log
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.1(00000009999.567*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.2(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.3(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.4(00000000000.000*kWh)'
TIP
Ο κωδικός OBIS του αισθητήρα πρέπει να ταιριάζει ακριβώς με αυτό που μεταδίδεται από έναν μετρητή. Αυτό είναι το μέρος πριν από την πρώτη παρένθεση (
.
Εάν ένας κωδικός OBIS είναι μόνο δύο ψηφία, θα πρέπει να χρησιμοποιήσετε εισαγωγικά στο αρχείο ρυθμίσεων. Για παράδειγμα, "1.2"
αντί για απλά 1.2
.
Για μια λίστα με κωδικούς OBIS για ηλεκτρικούς μετρητές, μπορείτε να επισκεφθείτε:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Υλικό
Για να επικοινωνήσετε με έναν μετρητή, πρέπει να συνδέσετε μια οπτική διεπαφή στη σειριακή θύρα. Η διεπαφή αποτελείται από ένα υπέρυθρο LED και έναν φωτοτρανζίστορ. Επιπλέον, η συσκευή πρέπει να είναι εξοπλισμένη με έναν μαγνήτη δακτυλίου για να παραμένει ευθυγραμμισμένη με τον μετρητή.
Εάν ο μετρητής λειτουργεί σε μονοκατευθυντική λειτουργία D, απαιτείται μόνο ένας υπέρυθρος φωτοτρανζίστορ.
Ανιχνευτής
Το πρότυπο ορίζει τις μέγιστες διαστάσεις του ανιχνευτή που μπορεί να συνδεθεί σε έναν μετρητή. Πρέπει να είναι εξοπλισμένος με έναν μαγνήτη καθώς είναι ο μόνος τρόπος να παραμένει ο ανιχνευτής σε σταθερή θέση.
Ρύθμιση
Για να δείτε δεδομένα μετρητή στο Home Assistant, πρέπει να ορίσετε έναν αισθητήρα ή έναν αισθητήρα κειμένου με τον κατάλληλο κωδικό OBIS. Σημειώστε ότι οι μετρητές υποστηρίζουν διαφορετικά σύνολα κωδικών OBIS. Από προεπιλογή, το στοιχείο δεν ορίζει κανέναν αισθητήρα.
Σειριακή θύρα
Το στοιχείο απαιτεί UART bus. Η σειριακή πρέπει να ρυθμιστεί ως 7E1 στις περισσότερες περιπτώσεις. Όταν mode_d=True
, ο ρυθμός baud πρέπει να οριστεί σε μια τιμή που υποστηρίζεται από τον μετρητή. Συνήθως 2400 ή 9600 bps. Για άλλες λειτουργίες (mode_d=False
), η ταχύτητα μετάδοσης διαπραγματεύεται με έναν μετρητή. Το baud_rate
αγνοείται και μπορεί να είναι οποιαδήποτε τιμή.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
Για το ESP8266 συνιστάται ιδιαίτερα η χρήση υλικού UART. Το λογισμικό UART δεν μπορεί να χειριστεί μεταδόσεις ταχύτερες από 4800 bps.
Ίσως χρειαστεί να απενεργοποιήσετε την καταγραφή αν ο οπτικός ανιχνευτής είναι συνδεδεμένος στη σειριακή θύρα που χρησιμοποιείται από το στοιχείο καταγραφής.
yaml
# Ορίστε το baud_rate σε 0 για να απενεργοποιήσετε την καταγραφή μέσω UART.
logger:
baud_rate: 0
Πλατφόρμα
Για να χρησιμοποιήσετε το στοιχείο, πρέπει να ορίσετε την ενότητα πλατφόρμας iec62056
στο αρχείο ρυθμίσεων. Αποτελείται από βασικές ρυθμίσεις.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Παράδειγμα διαμόρφωσης πλατφόρμας για μονοκατευθυντική επικοινωνία
iec62056:
mode_d: True
Μεταβλητές διαμόρφωσης
- update_interval (Προαιρετικό, Time): Το διάστημα για ανάγνωση δεδομένων από έναν μετρητή. Από προεπιλογή είναι
15min
. Τοnever
απενεργοποιεί τις ενημερώσεις. Σε αυτή την περίπτωση, πρέπει να χρησιμοποιηθεί ένας διακόπτης για να ενεργοποιήσει την ανάγνωση. Για συνεχείς αναγνώσεις χρησιμοποιήστε μια μικρή τιμή όπως 1s. - baud_rate_max (Προαιρετικό, int): Περιορίζει τη μέγιστη ταχύτητα μετάδοσης στην καθορισμένη τιμή. Από προεπιλογή, είναι ρυθμισμένο σε
9600
καθώς παρέχει σταθερή σύνδεση. Για να το απενεργοποιήσετε, ορίστε το σε0
. Με αυτόν τον τρόπο μπορείτε να χρησιμοποιήσετε τη μέγιστη δυνατή ταχύτητα baud19200
αν ο μετρητής το υποστηρίζει. Για το ESP8266 χρησιμοποιήστε το λογισμικό UART ρυθμισμένο σε4800
ή χαμηλότερο. - receive_timeout (Προαιρετικό, Time): Μέγιστος χρόνος που το στοιχείο περιμένει δεδομένα από έναν μετρητή πριν αναφέρει σφάλμα μετάδοσης. Από προεπιλογή είναι
3s
. - battery_meter (Προαιρετικό, boolean): Ορίστε το σε true αν ο μετρητής είναι με μπαταρία. Με αυτόν τον τρόπο θα χρησιμοποιηθεί ειδική ακολουθία ενεργοποίησης.
- retry_delay (Προαιρετικό, Time): Σε περίπτωση αποτυχίας μετάδοσης, χρόνος αναμονής πριν την επανάληψη της μετάδοσης. Από προεπιλογή είναι
15s
. - retry_counter_max (Προαιρετικό, int): Σε περίπτωση αποτυχίας μετάδοσης, ο μέγιστος αριθμός επαναλήψεων. Από προεπιλογή είναι
2
. - uart_id (Προαιρετικό, ID: Καθορίστε χειροκίνητα το ID του Στοιχείου UART αν θέλετε να χρησιμοποιήσετε πολλαπλά UART buses.
- mode_d (Προαιρετικό, boolean): Ορίστε το σε
True
αν ο μετρητής στέλνει δεδομένα κάθε λίγα δευτερόλεπτα. Αυτό αναγκάζει το στοιχείο να λειτουργεί σε λειτουργία D. Σε αυτή τη λειτουργία, δεδομένα δεν μεταδίδονται ποτέ σε έναν μετρητή. Αν οριστεί, οποιαδήποτε άλλη ρύθμιση εκτός από τοreceive_timeout
αγνοείται. Μην ξεχάσετε να ορίσετε την ταχύτητα baud του UART που χρησιμοποιεί ο μετρητής. Αν δεν είστε σίγουροι δοκιμάστε2400 7E1
ή9600 7E1
.
WARNING
Τα μετρητικά όργανα με μπαταρία συνήθως περιορίζουν τον αριθμό των μετρήσεων για να διατηρήσουν την ενέργεια, π.χ. σε 4 μετρήσεις την ημέρα. Αν ένας μετρητής δεν επιβάλλει τον περιορισμό, οι συχνές μετρήσεις μπορεί να μειώσουν σημαντικά τη διάρκεια ζωής της μπαταρίας.
Αισθητήρας
Ο αισθητήρας αναφέρει την πρώτη τιμή μέσα σε αγκύλες από την εγγραφή. Για τα παρακάτω δεδομένα
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
η τιμή του αισθητήρα είναι 6000.385
. Για να λάβετε τη δεύτερη τιμή (ημερομηνία/ώρα σε αυτό το παράδειγμα) χρησιμοποιήστε έναν Αισθητήρα Κειμένου.
Ο αισθητήρας υποστηρίζει μόνο δεκαδικές τιμές. Αν η εγγραφή περιέχει δεδομένα σε οποιαδήποτε άλλη μορφή, πρέπει να χρησιμοποιήσετε έναν Αισθητήρα Κειμένου και προαιρετικά lambda για να τα μετατρέψετε σε αριθμό.
yaml
# Example sensor configuration entries
sensor:
- platform: iec62056
obis: 1-0:15.8.0
name: Absolute active energy total
unit_of_measurement: kWh
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
- platform: iec62056
name: Instantaneous current in phase L1
obis: 1-0:31.7.0
unit_of_measurement: A
accuracy_decimals: 2
device_class: current
state_class: measurement
- platform: iec62056
name: Instantaneous voltage in phase L1
obis: 1-0:32.7.0
unit_of_measurement: V
accuracy_decimals: 1
device_class: voltage
state_class: measurement
- platform: iec62056
name: Absolute active instantaneous power
obis: 1-0:15.7.0
unit_of_measurement: kW
accuracy_decimals: 3
device_class: energy
state_class: measurement
Μεταβλητές διαμόρφωσης
- obis (Απαιτείται): Κωδικός OBIS.
- Όλες οι άλλες επιλογές από τον Αισθητήρα.
Αισθητήρας Κειμένου
Ο αισθητήρας κειμένου παρέχει δεδομένα ανάγνωσης ως κείμενο. Σε αντίθεση με τον Αισθητήρα, μπορείτε να επιλέξετε ποιο μέρος της ανάγνωσης αναφέρεται και ακόμη και να στείλετε ολόκληρη την εγγραφή δεδομένων πίσω στο Home Assistant.
yaml
# Sample text sensor configuration
# Data record:
# 1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
text_sensor:
- platform: iec62056
obis: 1-0:15.6.0
group: 2 # "2000-01-01 20:10:30"
name: Date time
- platform: iec62056
obis: 1-0:15.6.0
group: 1 # "00000006000.385"
name: Value
- platform: iec62056
obis: 1-0:15.6.0
group: 0 # "1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)"
name: The entire record
Μεταβλητές διαμόρφωσης
- obis (Απαιτείται): Κωδικός OBIS. Μπορείτε να ορίσετε πολλούς αισθητήρες κειμένου με το ίδιο OBIS αλλά διαφορετική ομάδα.
- group (Προαιρετικό, int): Ομάδα τιμών,
0
,1
, ή2
. Προεπιλογή στο1
. Αν οριστεί στο0
, αναφέρεται ολόκληρη η εγγραφή δεδομένων συμπεριλαμβανομένου του κωδικού OBIS. Το1
αναφέρει την πρώτη τιμή, το2
τη δεύτερη. - Όλες οι άλλες επιλογές είναι από τον Αισθητήρα Κειμένου.
Μετατροπή δεδομένων
Αν ένας μετρητής αναφέρει δεδομένα ως μη δεκαδική τιμή, μπορείτε να τα μετατρέψετε αυτόματα χρησιμοποιώντας έναν αισθητήρα προτύπου και lambda. Ας υποθέσουμε ότι ο μετρητής στέλνει μια εγγραφή όπως η παρακάτω με δεδομένα κωδικοποιημένα σε δεκαεξαδικό:
text
0-0:96.8.0*255(ABCDEF00)
Πρώτα, δημιουργήστε έναν αισθητήρα προτύπου που θα δημοσιεύει δεδομένα ως δεκαδική τιμή.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Τώρα δημιουργήστε έναν αισθητήρα κειμένου που θα λαμβάνει δεδομένα ως συμβολοσειρά, θα τα μετατρέπει σε δεκαδικό και θα τα δημοσιεύει.
yaml
text_sensor:
- platform: iec62056
id: hex_sensor
obis: 0-0:96.8.0*255
name: Hex content
internal: True
on_value:
lambda: |-
std::string hex_str = id(hex_sensor).state;
uint32_t dec=std::stoul(hex_str, nullptr, 16);
ESP_LOGI("iec62056.component", "Converted HEX '%s' to %u decimal", hex_str.c_str(), dec);
id(hex_to_dec_sensor).publish_state((float)dec);
Κάθε φορά που ο αισθητήρας κειμένου λαμβάνει μια νέα τιμή, τη μετατρέπει σε δεκαδικό και τη δημοσιεύει χρησιμοποιώντας τον αισθητήρα με το id hex_to_dec_sensor
. Η σημαία internal
αποτρέπει τον αισθητήρα από το να είναι ορατός στο Home Assistant. Στο αρχείο καταγραφής θα πρέπει να δείτε:
log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal
Τα ίδια αποτελέσματα μπορούν να επιτευχθούν χρησιμοποιώντας lambdas του Home Assistant. Σε αυτό το σενάριο, ο αισθητήρας κειμένου δημοσιεύει την δεκαεξαδική τιμή και ο αισθητήρας προτύπου του Home Assistant κάνει τη μετατροπή.
Διακόπτης
Ο διακόπτης παρέχει τη δυνατότητα ενεργοποίησης ανάγνωσης κατόπιν αιτήματος. Όταν η κατάσταση αλλάζει από OFF
σε ON
, το στοιχείο ξεκινά τη μετάδοση δεδομένων από έναν μετρητή. Μπορείτε να χρησιμοποιήσετε τον διακόπτη σε αυτοματισμούς.
Οι μεταβλητές διαμόρφωσης από τον Διακόπτη μπορούν να χρησιμοποιηθούν.
yaml
# Sample switch configuration
switch:
- platform: iec62056
name: 'Readout Trigger'
Δεν μπορείτε να ενεργοποιήσετε ανάγνωση στη λειτουργία D.
Δυαδικός αισθητήρας
Ορίζεται σε ON
όταν ξεκινά η μετάδοση σε έναν μετρητή. OFF
όταν η μετάδοση ολοκληρώνεται.
Μπορείτε να χρησιμοποιήσετε όλες τις μεταβλητές διαμόρφωσης από τον Δυαδικό Αισθητήρα.
yaml
# Sample automation to turn LED on when data read from a meter
switch:
- platform: gpio
pin: GPIO2
name: Internal LED
id: led_switch
internal: True
binary_sensor:
- platform: iec62056
id: meter_status
name: Meter Connection Status
on_press:
then:
- switch.turn_on: led_switch
on_release:
then:
- switch.turn_off: led_switch
Αντιμετώπιση προβλημάτων
- Βεβαιωθείτε ότι ο ανιχνευτής είναι σωστά ευθυγραμμισμένος με τα οπτικά στοιχεία στον μετρητή.
- Οι μετρητές συνήθως εγκαθίστανται σε όχι πολύ καθαρές περιοχές. Ίσως χρειαστεί να αφαιρέσετε τη σκόνη από τη οπτική διεπαφή από καιρό σε καιρό.
- Εάν αντιμετωπίσετε σφάλματα μετάδοσης και ελέγχου BCC, μειώστε τον ρυθμό baud χρησιμοποιώντας τη ρύθμιση
baud_rate_max
. - Εάν η συσκευή σας χειρίζεται πολλούς αισθητήρες που ξοδεύουν πολύ χρόνο στον βρόχο ενημέρωσης, ίσως χρειαστεί να αυξήσετε το μέγεθος του buffer της σειριακής θύρας. Ειδικά αν παρατηρήσετε προβλήματα μετάδοσης όταν ενεργοποιούνται επιπλέον αισθητήρες αλλά όχι όταν είναι απενεργοποιημένοι.