You need to import it before using it.

import weewx.tags

-tk

On Sat, Dec 22, 2018 at 10:19 AM Mic G77 <[email protected]> wrote:

> Don't pay attention to my previous post. It was just a bracket missing.
> Now I get the following error :
> déc. 22 19:13:15 raspberry weewx[7261]: ****    File
> "/usr/share/weewx/weewx/engine.py", line 570, in post_loop
> déc. 22 19:13:15 raspberry weewx[7261]: ****      self._software_catchup()
> déc. 22 19:13:15 raspberry weewx[7261]: ****    File
> "/usr/share/weewx/weewx/engine.py", line 634, in _software_catchup
> déc. 22 19:13:15 raspberry weewx[7261]: ****
>  self.engine.dispatchEvent(weewx.Event(weewx.NEW_ARCHIVE_RECORD, ...are'))
> déc. 22 19:13:15 raspberry weewx[7261]: ****    File
> "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent
> déc. 22 19:13:15 raspberry weewx[7261]: ****      callback(event)
> déc. 22 19:13:15 raspberry weewx[7261]: ****    File
> "/usr/share/weewx/user/alarm.py", line 116, in newArchiveRecord
> déc. 22 19:13:15 raspberry weewx[7261]: ****      time_binder =
> weewx.tags.TimeBinder(db_lookup, event.record['dateTime'])
> déc. 22 19:13:15 raspberry weewx[7261]: ****  AttributeError: 'module'
> object has no attribute 'tags'
> déc. 22 19:13:15 raspberry weewx[7261]: ****  Exiting.
> Hint: Some lines were ellipsized, use -l to show in full.
>
>
>
>
> And this is my service (it s badly written, i know):
>
> import time
> import smtplib
> from email.mime.text import MIMEText
> import threading
> import syslog
>
> import weewx
> from weewx.engine import StdService
> from weeutil.weeutil import timestamp_to_string, option_as_list
>
> sumwater = "/var/tmp/SumWater"
>
>
> # Inherit from the base class StdService:
> class MyAlarm(StdService):
>     """Service that sends email if an arbitrary expression evaluates
> true"""
>
>     def __init__(self, engine, config_dict):
>         # Pass the initialization information on to my superclass:
>         super(MyAlarm, self).__init__(engine, config_dict)
>
>         # This will hold the time when the last alarm message went out:
>         self.last_msg_ts = 0
>
>         #self.water_period = 1200 #20 minutes
>         #self.water_alarm = 100 # seuil en litre d'envoi du mail
>         self.water_events = []
>         self.archive_water_events = []
> #        self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_record)
>
>         try:
>             # Dig the needed options out of the configuration dictionary.
>             # If a critical option is missing, an exception will be raised
> and
>             # the alarm will not be set.
>             self.expression    = config_dict['Alarm']['expression']
>             self.water_period  =
> int(config_dict['Alarm'].get('water_period'))
>             self.water_alarm   =
> int(config_dict['Alarm'].get('water_alarm'))
>             self.time_wait     = int(config_dict['Alarm'].get('time_wait',
> 3600))
>             self.smtp_host     = config_dict['Alarm']['smtp_host']
>             self.smtp_user     = config_dict['Alarm'].get('smtp_user')
>             self.smtp_password = config_dict['Alarm'].get('smtp_password')
>             self.SUBJECT       = config_dict['Alarm'].get('subject',
> "Alarm message from weewx")
>             self.FROM          = config_dict['Alarm'].get('from', '
> [email protected]')
>             self.TO            =
> option_as_list(config_dict['Alarm']['mailto'])
>             syslog.syslog(syslog.LOG_INFO, "alarm: Alarm set for
> expression: '%s'" % self.expression)
>
>             # If we got this far, it's ok to start intercepting events:
>             self.bind(weewx.NEW_ARCHIVE_RECORD, self.newArchiveRecord)
>  # NOTE 1
>         except KeyError, e:
>             syslog.syslog(syslog.LOG_INFO, "alarm: No alarm set.  Missing
> parameter: %s" % e)
>
>
>     def newArchiveRecord(self, event):
>         """Gets called on a new archive record event."""
>
>         db_lookup = self.engine.db_binder.bind_default()
>         time_binder = weewx.tags.TimeBinder(db_lookup,
> event.record['dateTime'])
>         todays_water = time_binder.day().water.sum
>         with open(sumwater,'w') as new_file:
> #             new_file.write(time_binder)
>              new_file.write(todays_water)
>
>
>
>         # To avoid a flood of nearly identical emails, this will do
>         # the check only if we have never sent an email, or if we haven't
>         # sent one in the last self.time_wait seconds:
>         if not self.last_msg_ts or abs(time.time() - self.last_msg_ts) >=
> self.time_wait :
>             # Get the new archive record:
>             record = event.record
>
>             # Be prepared to catch an exception in the case that the
> expression contains
>             # a variable that is not in the record:
>
>             AlarmWater = MyAlarm.CheckAlarmWater(self, record)
>
>             try:
>    # NOTE 2
>                 # Evaluate the expression in the context of the event
> archive record.
>                 # Sound the alarm if it evaluates true:
>                 if eval(self.expression, None, record) or AlarmWater :
>                   # NOTE 3
>                     # Sound the alarm!
>                     # Launch in a separate thread so it doesn't block the
> main LOOP thread:
>                     t  = threading.Thread(target = MyAlarm.soundTheAlarm,
> args=(self, record))
>                     t.start()
>                     # Record when the message went out:
>                     self.last_msg_ts = time.time()
>             except NameError, e:
>                 # The record was missing a named variable. Write a debug
> message, then keep going
>                 syslog.syslog(syslog.LOG_DEBUG, "alarm: %s" % e)
>
>     def soundTheAlarm(self, rec):
>         """This function is called when the given expression evaluates
> True."""
>
>         # Get the time and convert to a string:
>         t_str = timestamp_to_string(rec['dateTime'])
>
>         # Log it
>         syslog.syslog(syslog.LOG_INFO, "alarm: Water issue or Alarm
> expression \"%s\" evaluated True at %s" % (self.expression, t_str))
>
>         # Form the message text:
>         msg_text = "Water issue or \nAlarm expression \"%s\" evaluated
> True at %s\nRecord:\n%s" % (self.expression, t_str, str(rec))
>         # Convert to MIME:
>         msg = MIMEText(msg_text)
>
>         # Fill in MIME headers:
>         msg['Subject'] = self.SUBJECT
>         msg['From']    = self.FROM
>         msg['To']      = ','.join(self.TO)
>
>         # Create an instance of class SMTP for the given SMTP host:
>         s = smtplib.SMTP(self.smtp_host)
>         try:
>             # Some servers (eg, gmail) require encrypted transport.
>             # Be prepared to catch an exception if the server
>             # doesn't support it.
>             s.ehlo()
>             s.starttls()
>             s.ehlo()
>             syslog.syslog(syslog.LOG_DEBUG, "alarm: using encrypted
> transport")
>         except smtplib.SMTPException:
>             syslog.syslog(syslog.LOG_DEBUG, "alarm: using unencrypted
> transport")
>
>         try:
>             # If a username has been given, assume that login is required
> for this host:
>             if self.smtp_user:
>                 s.login(self.smtp_user, self.smtp_password)
>                 syslog.syslog(syslog.LOG_DEBUG, "alarm: logged in with
> user name %s" % (self.smtp_user,))
>
>             # Send the email:
>             s.sendmail(msg['From'], self.TO,  msg.as_string())
>             # Log out of the server:
>             s.quit()
>         except Exception, e:
>             syslog.syslog(syslog.LOG_ERR, "alarm: SMTP mailer refused
> message with error %s" % (e,))
>             raise
>
>         # Log sending the email:
>         syslog.syslog(syslog.LOG_INFO, "alarm: email sent to: %s" %
> self.TO)
>
>     def CheckAlarmWater(self, data):
>         #data=event.record
>         data_type = 'archive'
>         if data_type == 'loop':
>             # punt any old events from the loop event list...
>             if (self.rain_events and self.water_events[0][0] <=
> data['dateTime'] - self.water_period):
>                 events = []
>                 for e in self.water_events:
>                     if e[0] > data['dateTime'] - self.water_period:
>                         events.append((e[0], e[1]))
>                 self.water_events = events
>             # ...then add new rain event if there is one
>             if 'water' in data and data['water']:
>                 self.water_events.append((data['dateTime'], data['water']))
>         elif data_type == 'archive':
>             # punt any old events from the archive event list...
>             if (self.archive_water_events and
> self.archive_water_events[0][0] <= data['dateTime'] - self.water_period):
>                 events = []
>                 for e in self.archive_water_events:
>                     if e[0] > data['dateTime'] - self.water_period:
>                         events.append((e[0], e[1]))
>                 self.archive_water_events = events
>             # ...then add new rain event if there is one
>             if 'water' in data and data['water']:
>                 self.archive_water_events.append((data['dateTime'],
> data['water']))
>         # for both loop and archive, add up the rain...
>         watersum = 0
>         if len(self.water_events) != 0:
>             # we have loop rain events so add them up
>             for e in self.water_events:
>                 watersum += e[1]
>         elif data_type == 'archive':
>             # no loop rain events but do we have any archive rain events
>             for e in self.archive_water_events:
>                 watersum += e[1]
>         # ...then divide by the period and scale to an hour
>         #data['URasp'] = watersum
>         if watersum > self.water_alarm :
>             return True
>         else:
>             return False
>
>
>
>
> Le vendredi 21 décembre 2018 13:19:47 UTC+1, Thomas Keffer a écrit :
>>
>> Thanks, that's what we needed.
>>
>> Schematically, this would look something like the following. I've left
>> out details, but if you've already done one service, you should be able to
>> follow it. If not, let me know. NOT TESTED!
>>
>>
>> class WaterConsumption(StdService):
>>     """Service that sends email if my water consumption is too high"""
>>
>>     def __init__(self, engine, config_dict):
>>         # Pass the initialization information on to my superclass:
>>         super(WaterConsumption, self).__init__(engine, config_dict)
>>
>>         # Get email info, as in the alarm.py example
>>         ...
>>
>>         # Bind to the NEW_ARCHIVE_RECORD event
>>         self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_record)
>>
>>     def new_archive_record(self, event):
>>         """Called when a new archive record has arrived."""
>>
>>         db_lookup = self.engine.db_binder.bind_default()
>>         time_binder = weewx.tags.TimeBinder(db_lookup,
>> event.record['dateTime']
>>
>>         todays_water = time_binder.day().water.sum
>>         if todays_water > 2000:
>>             # Send an email (as in the alarm.py example)
>>             ...
>>
>>
>>
>>
>>
>> On Fri, Dec 21, 2018 at 1:15 AM Mic G77 <[email protected]> wrote:
>>
>>> Thank you for your interest in my problem.
>>>
>>> I' m creating a new service.
>>> I've already created a data record 'water' which gives me my water
>>> consumption.
>>> It works on the basis of the electricity.py exemple.
>>> Now i want to create an email alarm when my total day consumption is
>>> above a certain amount. (Here, my service will be built on the alarm.py
>>> exemple).
>>>
>>> If I was using a Template, i would write $day.water.sum but as it is in
>>> a service, I don't have access to this kind of tag. (at least I don't know
>>> how to do it).
>>>
>>> So, the easiest way seems to me to have access the day table of the
>>> archive.
>>> I would like to do it properly (for exemple, i don't want to write
>>> '/var/lib/weews/archive' in an sql command).
>>> Thank you in advance.
>>>
>>>
>>>
>>>
>>> Le vendredi 21 décembre 2018 10:01:59 UTC+1, Andrew Milner a écrit :
>>>
>>>> As tom says - a little more information would be helpful.
>>>>
>>>> If you just want to retrieve data from the database then a python
>>>> program can of course access any table in the weewx database by using sql
>>>> search commands.  All depends what you are actually trying to do and what
>>>> you want to do with the data once it has been retrieved.
>>>>
>>>>
>>>>
>>>> On Friday, 21 December 2018 10:20:38 UTC+2, Mic G77 wrote:
>>>>>
>>>>> Hello.
>>>>> I just want to gain access to daily summaries.
>>>>>
>>>>>
>>>>> Le jeudi 20 décembre 2018 23:31:49 UTC+1, Thomas Keffer a écrit :
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> There are a lot of ways to do this, so it would help if we knew a
>>>>>> little more about what you want to do with the data. For example, are you
>>>>>> trying to calculate an aggregate? Or, just gain access to the daily
>>>>>> summaries?
>>>>>>
>>>>>> -tk
>>>>>>
>>>>>> On Thu, Dec 20, 2018 at 1:38 PM Mic G77 <[email protected]> wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>> i'm trying to do a new service. I'm rather a beginner in python
>>>>>>> although i have already developped some services in the
>>>>>>> /usr/share/weewx/user/ folder;
>>>>>>> In one of them, i would like to have access to some date which are
>>>>>>> in the archive_day_outTemp.
>>>>>>>
>>>>>>> I don't know how to do. It seems that in the event that is send in
>>>>>>> the new_archive_record function, there is only the actual record stored 
>>>>>>> in
>>>>>>> the database.
>>>>>>> If someone could send a simple exemple, it would help me.
>>>>>>>
>>>>>>> Thanks in advance.
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "weewx-user" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "weewx-user" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "weewx-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to