Pira.cz Technical Forum

FM Analysis => FM Scope Script Files => Topic started by: Jan on October 05, 2025, 09:36:22 pm

Title: FM email alert script (pira)
Post by: Jan on October 05, 2025, 09:36:22 pm
Characteristics


Instructions for use


Code: [Select]
;P75/P175/P275 FM email alert script 1.0.0 :: (C) Pira.cz 2025
;FM Scope version required: 1.7.2 or later

;Characteristics
; * Watching for no signal, silence, pilot level, audio channel balance
; * Supports several devices and several stations each, in sequence
; * Most of the time, the devices are free and accessible for manual check
; * Sends email alerts, sends daily email report

;*************************************************************
;*** Instructions for use:                                 ***
;*************************************************************

; 1) Check the User configurable parameters below
; 2) Fill/edit the Task List (connections and stations)
; 3) Check the email configuration in Options - SMTP Settings
; 4) Add this script file to Options - Task Scheduler
; 5) Keep the FM Scope running on the PC

;*************************************************************
;*** User configurable parameters:                         ***
;*************************************************************

set (DataPath,c:\alerts) ;existing folder on your harddisk to store the text logs
set (DelayMeasuring,60) ;how long to watch each station [sec]
set (DelayBetweenEmails,28800) ;minimum delay between two emails with same content [sec]
set (EmailRecipients,your@email.com) ;where to send the emails
set (LimitBalance,6) ;max. banalce error in dB
set (LimitSilence,20) ;min. average deviation in kHz
set (LimitPilotMax,8.0) ;max. pilot level in kHz
set (LimitPilotMin,5.0) ;min. pilot level in kHz
call (Initialize)

;*************************************************************
;*** Task List (connections and stations):                 ***
;*************************************************************

;device 1
set (ConnectionParameters,192.168.0.101:10001)
call (CreateConnection)
tune (88.5) ;edit the frequencies as required
call (CheckStation)
tune (101.9)
call (CheckStation)
;... further frequencies here ...
disconnect

;device 2
set (ConnectionParameters,192.168.0.102:10001)
call (CreateConnection)
tune (89.3)
call (CheckStation)
tune (93.5)
call (CheckStation)
;... further frequencies here ...
disconnect

;... further devices here ...

call (SaveLog)

;*************************************************************
;*** Daily email report:                                   ***
;*************************************************************

set (CurrentDate,%date)
if (%CurrentDate$=%LastReportDate)
  goto (SkipDailyReport)
  endif
 
call (SendRegularReport)
set (LastReportDate,%CurrentDate)
SkipDailyReport:

;*************************************************************
;*** End:                                                  ***
;*************************************************************

stop

;*************************************************************
;*** Functions:                                            ***
;*************************************************************

CreateConnection:

set (ConnectionAttempts,0)

CreateConnectionLoop:

if (%ConnectionAttempts>=5)
  call (SendNoConnection)
  disconnect
  return
  endif

inc (ConnectionAttempts)
set (NewText,%crConnecting to %ConnectionParameters)
call (AddToLog)
disconnect
connect (%ConnectionParameters)
if (%connected=0)
  sleep (10)
  goto (CreateConnectionLoop)
  endif
 
;simple communication test 
tune (87.5)
send (?F)
set (w1,%freq)
tune (108.0)
send (?F)
if (%w1$=%freq)
  goto (CreateConnectionLoop)
  endif

return

;*************************************************************

CheckStation:

if (%connected=0)
  set (NewText,Frequency skipped - no connection)
  call (AddToLog)
  return
  endif

;initialization of the cycle:
set (EndTime,%timestamp)
inc (EndTime,%DelayMeasuring)
set (SignalQualityMax,0)
set (DeviationAve,0)
set (PltMin,999)
set (PltMax,0.0)
set (LMax,-60)
set (RMax,-60)

send (?F)
set (NewText,[Checking %frequency])
call (AddToLog)
setmode (0)
sleep (5)
mpx.run
textwindow.addtext ( )

CheckStationLoop:

getquality
getpilot
send (?A)
send (?C)

if (%quality>%SignalQualityMax)
  set (SignalQualityMax,%quality)
  endif

if (%pilot_>%PltMax)
  set (PltMax,%pilot_)
  endif
if (%pilot_<%PltMin)
  set (PltMin,%pilot_)
  endif

if (%devave_>%DeviationAve)
  set (DeviationAve,%devave_)
  endif

if (%lmaxdb>%LMax)
  set (LMax,%lmaxdb)
  endif
if (%rmaxdb>%RMax)
  set (RMax,%rmaxdb)
  endif

if (%timestamp>=%EndTime)
  mpx.stop
  rds.getdata
  goto (Evaluation)
  endif

sleep(1)
textwindow.addtext (.)
goto (CheckStationLoop)

;*************************************************************

Evaluation:

set (AlertText,)

set (w1,%PltMin to %PltMax)
if (%PltMin$=%PltMax)
  set (w1,%PltMin)
  endif
set (Summary,%rdspi %rdsps; Signal %SignalQualityMax; Pilot %w1 kHz; Dev. Ave %DeviationAve kHz; R/L balance %RMax/%LMax dB)
set (NewText,%Summary)
call (AddToLog)

if (%SignalQualityMax<3)
  set (AlertText,%AlertTextNo signal! )
  goto (EvalutionSkipValues)
  endif

if (%rdspi$=0000)
  if (%rdsps$="        ")
    set (NewText,Warning: No RDS)
    call (AddTolog)
    endif
  endif

if (%PltMax=0)
  set (NewText,Warning: No pilot)
  call (AddTolog)
  goto (EvalutionSkipStereo)
  endif
if (%PltMin>%LimitPilotMax)
  set (AlertText,%AlertTextPilot level failed! )
  endif
if (%PltMax<%LimitPilotMin)
  set (AlertText,%AlertTextPilot level failed! )
  endif

set (w1,%RMax)
inc (w1,%LimitBalance) 
if (%LMax>%w1)
  set (AlertText,%AlertTextChannel balance failed! )
  endif
set (w1,%LMax)
inc (w1,%LimitBalance) 
if (%RMax>%w1)
  set (AlertText,%AlertTextChannel balance failed! )
  endif
 
EvalutionSkipStereo: 
 
if (%DeviationAve<%LimitSilence)
  set (AlertText,%AlertTextAudio level failed! )
  endif

EvalutionSkipValues: 
 
if (%AlertText$=)
  set (NewText,No problem found)
  call (AddToLog) 
  return
  endif

set (NewText,%AlertText)
call (AddToLog)
call (SendAlert)
return
 
;*************************************************************

SendRegularReport:

set (NewText,Sending regular report to %EmailRecipients%cr)
call (AddToLog)

email.to (%EmailRecipients)
email.subject (FM Scope Daily Report)
if (%ProblemCounter=0)
  email.body (No problem found.)
  endif
if (%ProblemCounter>0)
  email.body (%ProblemCounter problems found. See the files attached.)
  endif   
email.attachfile (%DataPath\recent.txt)
email.attachfile (%DataPath\daily.txt)
email.send
 
set (ProblemCounter,0)
savetext (%DataPath\daily.txt,)
return
 
;*************************************************************

SendAlert:

inc (ProblemCounter)

if (%LastAlertText%freq$=%AlertText)
  set (w1,%LastAlertAt%freq)
  inc (w1,%DelayBetweenEmails)
  if (%w1>%timestamp)
    return
    endif
  endif

set (NewText,Sending alert message to %EmailRecipients)
call (AddToLog)

email.to (%EmailRecipients)
email.subject (Alert for %ConnectionParameters - %frequency)
email.body (%date %time:%cr%cr%AlertText%cr%Summary%cr%crSent from FM Scope)
email.send
set (LastAlertAt%freq,%timestamp)
set (LastAlertText%freq,%AlertText)
return
 
;*************************************************************

SendNoConnection:

set (NewText,Unable to connect!)
call (AddToLog)

inc (ProblemCounter)

set (w1,%LastNoConnectAlert)
inc (w1,%DelayBetweenEmails)
if (%w1>%timestamp)
  return
  endif

email.to (%EmailRecipients)
email.subject (Alert for %ConnectionParameters)
email.body (Unable to connect to the device%cr%crSent from FM Scope)
email.send
set (LastNoConnectAlert,%timestamp)
return

;*************************************************************

SaveLog:

set (NewText,%crEnd of task list%cr)
call (AddToLog)
savetext (%DataPath\recent.txt,%RecentLog)
appendtext (%DataPath\daily.txt,%RecentLog)
set (RecentLog,)
return
 
;*************************************************************

AddToLog:

textwindow.addline (%NewText)
set (RecentLog,%RecentLog%cr%NewText)
return

;*************************************************************

Initialize:

setproperty (ExecutionSpeed,4)
page.show (6)
setproperty (OnlineUpdate,1)
set (RecentLog,)
textwindow.clear
set (NewText,Starting at %date %time)
call (AddToLog)
set (ProblemCounter,0)
mpx.stop

return