1 """The sms gateway to interact with a GSM modem."""
6 from gammu.asyncworker
import GammuAsyncWorker
10 from .const
import DOMAIN, SMS_STATE_UNREAD
12 _LOGGER = logging.getLogger(__name__)
16 """SMS gateway to interact with a GSM modem."""
19 """Initialize the sms gateway."""
20 _LOGGER.debug(
"Init with connection mode:%s", config[
"Connection"])
22 self.
_worker_worker.configure(config)
30 """Initialize the sms gateway asynchronously. This method is also called in config flow to verify connection."""
39 @param state_machine: state machine
40 @type state_machine: gammu.StateMachine
42 state_machine.ReadDevice()
44 _LOGGER.debug(
"Pulling modem")
49 """Read all received SMS messages.
51 @param state_machine: state machine which invoked action
52 @type state_machine: gammu.StateMachine
55 _LOGGER.debug(
"SMS entries:%s", entries)
59 decoded_entry = gammu.DecodeSMS(entry)
61 _LOGGER.debug(
"Processing sms:%s,decoded:%s", message, decoded_entry)
62 sms_state = message[
"State"]
63 _LOGGER.debug(
"SMS state:%s", sms_state)
64 if sms_state == SMS_STATE_UNREAD:
65 if decoded_entry
is None:
66 text = message[
"Text"]
69 for inner_entry
in decoded_entry[
"Entries"]:
70 if inner_entry[
"Buffer"]
is not None:
71 text += inner_entry[
"Buffer"]
74 "phone": message[
"Number"],
75 "date":
str(message[
"DateTime"]),
79 _LOGGER.debug(
"Append event data:%s", event_data)
80 data.append(event_data)
85 """Read and delete all SMS in the modem."""
87 memory = state_machine.GetSMSStatus()
89 remaining = memory[
"SIMUsed"] + memory[
"PhoneUsed"]
90 start_remaining = remaining
95 _LOGGER.debug(
"Start remaining:%i", start_remaining)
100 entry = state_machine.GetNextSMS(Folder=0, Start=
True)
101 all_parts = entry[0][
"UDH"][
"AllParts"]
102 part_number = entry[0][
"UDH"][
"PartNumber"]
103 part_is_missing = all_parts > start_remaining
104 _LOGGER.debug(
"All parts:%i", all_parts)
105 _LOGGER.debug(
"Part Number:%i", part_number)
106 _LOGGER.debug(
"Remaining:%i", remaining)
107 _LOGGER.debug(
"Start is_part_missing:%s", part_is_missing)
110 entry = state_machine.GetNextSMS(
111 Folder=0, Location=entry[0][
"Location"]
114 if part_is_missing
and not force:
115 _LOGGER.debug(
"Not all parts have arrived")
118 remaining = remaining - 1
119 entries.append(entry)
122 _LOGGER.debug(
"Deleting message")
124 state_machine.DeleteSMS(Folder=0, Location=entry[0][
"Location"])
125 except gammu.ERR_MEMORY_NOT_AVAILABLE:
126 _LOGGER.error(
"Error deleting SMS, memory not available")
128 except gammu.ERR_EMPTY:
131 _LOGGER.warning(
"Failed to read messages!")
134 return gammu.LinkSMS(entries)
138 """Notify hass when an incoming SMS message is received."""
139 for message
in messages:
141 "phone": message[
"phone"],
142 "date": message[
"date"],
143 "text": message[
"message"],
145 self.
_hass_hass.bus.async_fire(f
"{DOMAIN}.incoming_sms", event_data)
148 """Send sms message via the worker."""
152 """Get the IMEI of the device."""
156 """Get the current signal level of the modem."""
160 """Get the current network info of the modem."""
163 if not network_info[
"NetworkName"]:
164 network_info[
"NetworkName"] = gammu.GSMNetworks.get(
165 network_info[
"NetworkCode"]
170 """Get the manufacturer of the modem."""
174 """Get the model of the modem."""
176 if not model
or not model[0]:
180 display = f
"{display} ({model[1]})"
184 """Get the firmware information of the modem."""
186 if not firmware
or not firmware[0]:
188 display = firmware[0]
190 display = f
"{display} ({firmware[1]})"
194 """Terminate modem connection."""
199 """Create the sms gateway."""
201 gateway =
Gateway(config, hass)
203 await gateway.init_async()
204 except gammu.GSMError
as exc:
205 _LOGGER.error(
"Failed to initialize, error %s", exc)
206 await gateway.terminate_async()
208 except gammu.GSMError
as exc:
209 _LOGGER.error(
"Failed to create async worker, error %s", exc)
def get_and_delete_all_sms(self, state_machine, force=False)
def sms_read_messages(self, state_machine, force=False)
def get_signal_quality_async(self)
def get_manufacturer_async(self)
def sms_pull(self, state_machine)
def get_firmware_async(self)
def send_sms_async(self, message)
def terminate_async(self)
def __init__(self, config, hass)
def get_model_async(self)
def _notify_incoming_sms(self, messages)
def get_network_info_async(self)
def create_sms_gateway(config, hass)