pymscada 0.1.11b7__py3-none-any.whl → 0.1.11b9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pymscada might be problematic. Click here for more details.

pymscada/bus_server.py CHANGED
@@ -265,7 +265,11 @@ class BusServer:
265
265
  if len(data) > 300:
266
266
  logging.warning(f'process: log message too long from {bus_id}')
267
267
  else:
268
- logging.warning(data.decode())
268
+ log_msg = data.decode()
269
+ logging.warning(log_msg)
270
+ client_addr = self.connections[bus_id].addr
271
+ self.bus_tag.value = f'\x03{client_addr}: {log_msg}'.encode()
272
+ self.bus_tag.time_us = int(time.time() * 1e6)
269
273
  else: # consider disconnecting
270
274
  logging.warn(f'invalid message {cmd}')
271
275
 
@@ -1,5 +1,5 @@
1
1
  bus_ip: 127.0.0.1
2
- bus_port: 1325
2
+ bus_port: 1324
3
3
  proxy: 'http://127.0.0.1:3128'
4
4
  api:
5
5
  url: http://dataservice.accuweather.com/forecasts/v1/hourly/12hour/
@@ -1,5 +1,5 @@
1
1
  bus_ip: 127.0.0.1
2
- bus_port: 1325
2
+ bus_port: 1324
3
3
  proxy:
4
4
  api:
5
5
  api_key: ${OPENWEATHER_API_KEY}
pymscada/demo/tags.yaml CHANGED
@@ -116,4 +116,60 @@ localhost_ping:
116
116
  google_ping:
117
117
  desc: Ping time to google
118
118
  type: float
119
- units: ms
119
+ units: ms
120
+ Murupara_Temp:
121
+ desc: Murupara Temperature
122
+ type: float
123
+ units: '°C'
124
+ dp: 1
125
+ min: -50
126
+ max: 50
127
+ Murupara_WindSpeed:
128
+ desc: Murupara Wind Speed
129
+ type: float
130
+ units: 'm/s'
131
+ dp: 1
132
+ min: 0
133
+ max: 200
134
+ Murupara_WindDir:
135
+ desc: Murupara Wind Direction
136
+ type: float
137
+ units: '°'
138
+ dp: 0
139
+ min: 0
140
+ max: 360
141
+ Murupara_Rain:
142
+ desc: Murupara Rainfall
143
+ type: float
144
+ units: 'mm'
145
+ dp: 1
146
+ min: 0
147
+ max: 1000
148
+ Murupara_Temp_03:
149
+ desc: Murupara Temperature 3-Hour Forecast
150
+ type: float
151
+ units: '°C'
152
+ dp: 1
153
+ min: -50
154
+ max: 50
155
+ Murupara_WindSpeed_03:
156
+ desc: Murupara Wind Speed 3-Hour Forecast
157
+ type: float
158
+ units: 'm/s'
159
+ dp: 1
160
+ min: 0
161
+ max: 200
162
+ Murupara_WindDir_03:
163
+ desc: Murupara Wind Direction 3-Hour Forecast
164
+ type: float
165
+ units: '°'
166
+ dp: 0
167
+ min: 0
168
+ max: 360
169
+ Murupara_Rain_03:
170
+ desc: Murupara Rainfall 3-Hour Forecast
171
+ type: float
172
+ units: 'mm'
173
+ dp: 1
174
+ min: 0
175
+ max: 1000
@@ -78,3 +78,49 @@ pages:
78
78
  scale: mS
79
79
  color: red
80
80
  dp: 1
81
+ - name: Weather
82
+ parent:
83
+ items:
84
+ - type: uplot
85
+ ms:
86
+ desc: Weather
87
+ age: 172800
88
+ legend_pos: left
89
+ time_pos: left
90
+ time_res: m
91
+ axes:
92
+ - scale: x
93
+ range: [-86400, 0] # 24 hours of data
94
+ - scale: temp
95
+ range: [-10, 40] # Temperature in Celsius
96
+ dp: 1
97
+ - scale: wind
98
+ range: [0, 100] # Wind speed in km/h
99
+ dp: 1
100
+ - scale: dir
101
+ range: [0, 360] # Wind direction in degrees
102
+ dp: 0
103
+ - scale: rain
104
+ range: [0, 50] # Rain in mm
105
+ dp: 1
106
+ series:
107
+ - tagname: Murupara_Temp
108
+ label: Temperature
109
+ scale: temp
110
+ color: red
111
+ dp: 1
112
+ - tagname: Murupara_WindSpeed
113
+ label: Wind Speed
114
+ scale: wind
115
+ color: blue
116
+ dp: 1
117
+ - tagname: Murupara_WindDir
118
+ label: Wind Direction
119
+ scale: dir
120
+ color: green
121
+ dp: 0
122
+ - tagname: Murupara_Rain
123
+ label: Rainfall
124
+ scale: rain
125
+ color: lightblue
126
+ dp: 1
@@ -73,6 +73,7 @@ class OpenWeatherClient:
73
73
 
74
74
  async def fetch_current_data(self):
75
75
  """Fetch current weather data for all locations."""
76
+ logging.info('fetching current')
76
77
  if self.session is None:
77
78
  self.session = aiohttp.ClientSession()
78
79
  for location, coords in self.locations.items():
@@ -92,6 +93,7 @@ class OpenWeatherClient:
92
93
 
93
94
  async def fetch_forecast_data(self):
94
95
  """Fetch forecast weather data for all locations."""
96
+ logging.info('fetching forecast')
95
97
  if self.session is None:
96
98
  self.session = aiohttp.ClientSession()
97
99
  for location, coords in self.locations.items():
@@ -113,9 +115,9 @@ class OpenWeatherClient:
113
115
  """Poll OpenWeather APIs every 10 minutes."""
114
116
  now = int(time())
115
117
  if now % 600 == 0: # Every 10 minutes
116
- await self.fetch_current_data()
118
+ asyncio.create_task(self.fetch_current_data())
117
119
  if now % 10800 == 60: # Every 3 hours, offset by 1 minute
118
- await self.fetch_forecast_data()
120
+ asyncio.create_task(self.fetch_forecast_data())
119
121
 
120
122
  async def start(self):
121
123
  """Start bus connection and API polling."""
pymscada/www_server.py CHANGED
@@ -182,8 +182,6 @@ class WSHandler():
182
182
  if action == 'set': # pc.CMD_SET
183
183
  self.tag_by_name[tagname].value = value, time_us, bus
184
184
  elif action == 'rta': # pc.CMD_RTA
185
- if tagname not in self.tag_by_name:
186
- self.do_sub(tagname)
187
185
  if 'File' in value:
188
186
  file = await anext(self.ws)
189
187
  value['_file_data'] = file.data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymscada
3
- Version: 0.1.11b7
3
+ Version: 0.1.11b9
4
4
  Summary: Shared tag value SCADA with python backup and Angular UI
5
5
  Author-Email: Jamie Walton <jamie@walton.net.nz>
6
6
  License: GPL-3.0-or-later
@@ -15,7 +15,7 @@ Project-URL: Bug Tracker, https://github.com/jamie0walton/pymscada/issues
15
15
  Requires-Python: >=3.9
16
16
  Requires-Dist: PyYAML>=6.0.1
17
17
  Requires-Dist: aiohttp>=3.8.5
18
- Requires-Dist: pymscada-html>=0.1.10b2
18
+ Requires-Dist: pymscada-html>=0.1.10b5
19
19
  Requires-Dist: cerberus>=1.3.5
20
20
  Requires-Dist: pycomm3>=1.2.14
21
21
  Requires-Dist: pysnmplib>=5.0.24
@@ -1,17 +1,17 @@
1
- pymscada-0.1.11b7.dist-info/METADATA,sha256=l0xmM3BBv29_Ko1pw7BakDuFU20zMPzoNUk2VPQ3vF8,2349
2
- pymscada-0.1.11b7.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
- pymscada-0.1.11b7.dist-info/entry_points.txt,sha256=j_UgZmqFhNquuFC2M8g5-8X9FCpp2RaDb7NrExzkj1c,72
4
- pymscada-0.1.11b7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1
+ pymscada-0.1.11b9.dist-info/METADATA,sha256=_Vl7Sc7VlQZgKxlhqBtIRwQ6i6kuux42oMrXRmzYhZ0,2349
2
+ pymscada-0.1.11b9.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ pymscada-0.1.11b9.dist-info/entry_points.txt,sha256=j_UgZmqFhNquuFC2M8g5-8X9FCpp2RaDb7NrExzkj1c,72
4
+ pymscada-0.1.11b9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
5
5
  pymscada/__init__.py,sha256=NV_cIIwe66Ugp8ns426rtfJIIyskWbqwImD9p_5p0bQ,739
6
6
  pymscada/__main__.py,sha256=WcyVlrYOoDdktJhOoyubTOycMwpayksFdxwelRU5xpQ,272
7
7
  pymscada/bus_client.py,sha256=ZUCynJtEvmHruzLS6ZAzp-_0dv1A1u_POgemb38kHuc,8989
8
- pymscada/bus_server.py,sha256=8F1beP4NRCBpGJQ0u9NZI1mP6P29HSl6mm9GoGMTCJA,11795
8
+ pymscada/bus_server.py,sha256=eD4Fz4Sv4EIu2vney_d0jAryiCk5eoH5NQA-dAZRTqA,12029
9
9
  pymscada/checkout.py,sha256=1Al29nVqCebupYvMgcY5boz772PtsVp1MVbYaQajV5Q,3373
10
10
  pymscada/config.py,sha256=vwGxieaJBYXiHNQEOYVDFaPuGmnUlCnbNm_W9bugKlc,1851
11
11
  pymscada/console.py,sha256=b4gm7cuhYKGFNtHoxygWkrqiN42mU8DM4KUi-Q74M4U,8793
12
12
  pymscada/demo/README.md,sha256=iNcVbCTkq-d4agLV-979lNRaqf_hbJCn3OFzY-6qfU8,880
13
13
  pymscada/demo/__init__.py,sha256=WsDDgkWnZBJbt2-cJCdc2NvRAv_T4a7WOC1Q0k_l0gI,29
14
- pymscada/demo/accuweather.yaml,sha256=rJIiBTUHfaxuYqLLuyKtAe5dqXVdQyEeHJgIy7z-qXo,322
14
+ pymscada/demo/accuweather.yaml,sha256=Fk4rV0S8jCau0173QCzKW8TdUbc4crYVi0aD8fPLNgU,322
15
15
  pymscada/demo/bus.yaml,sha256=zde5JDo2Yv5s7NvJ569gAEoTDvsvgBwRPxfrYhsxj3w,26
16
16
  pymscada/demo/files.yaml,sha256=XWtmGDJxtD4qdl2h7miUfJYkDKsvwNTgQjlGpR6LQNs,163
17
17
  pymscada/demo/history.yaml,sha256=c0OuYe8LbTeZqJGU2WKGgTEkOA0IYAjO3e046ddQB8E,55
@@ -19,7 +19,7 @@ pymscada/demo/logixclient.yaml,sha256=G_NlJhBYwT1a9ceHDgO6fCNKFmBM2pVO_t9Xa1NqlR
19
19
  pymscada/demo/modbus_plc.py,sha256=3zZHHbyrdxyryEHBeNIw-fpcDGcS1MaJiqEwQDr6zWI,2397
20
20
  pymscada/demo/modbusclient.yaml,sha256=geeCsUJZkkEj7jjXR_Yk6R5zA5Ta9IczrHsARz7ZgXY,1099
21
21
  pymscada/demo/modbusserver.yaml,sha256=67_mED6jXgtnzlDIky9Cg4j-nXur06iz9ve3JUwSyG8,1133
22
- pymscada/demo/openweather.yaml,sha256=NQ2HL_RlTQ8amYuNQhk09bC7w_rTmIeQ1RsxX1LLtKU,430
22
+ pymscada/demo/openweather.yaml,sha256=eFaRc7JxkEwRswCtmJiypsfR5xgQR-R-UtwvfwDHw-w,430
23
23
  pymscada/demo/opnotes.yaml,sha256=gdT8DKaAV4F6u9trLCPyBgf449wYaP_FF8GCbjXm9-k,105
24
24
  pymscada/demo/ping.yaml,sha256=fm3eUdR2BwnPI_lU_V07qgmDxjSoPP6lPazYB6ZgpVg,149
25
25
  pymscada/demo/pymscada-bus.service,sha256=F3ViriRXyMKdCY3tHa3wXAnv2Fo2_16-EScTLsYnSOA,261
@@ -35,8 +35,8 @@ pymscada/demo/pymscada-io-snmpclient.service,sha256=Rsm8uiwnoGx-1MkXqYgtj4UP9-r7
35
35
  pymscada/demo/pymscada-opnotes.service,sha256=TlrTRgP3rzrlXT8isAGT_Wy38ScDjT1VvnlgW84XiS8,354
36
36
  pymscada/demo/pymscada-wwwserver.service,sha256=7Qy2wsMmFEsQn-b5mgAcsrAQZgXynkv8SpHD6hLvRGc,370
37
37
  pymscada/demo/snmpclient.yaml,sha256=z8iACrFvMftYUtqGrRjPZYZTpn7aOXI-Kp675NAM8cU,2013
38
- pymscada/demo/tags.yaml,sha256=G1d6whGAg41l1meBmxJWrOA47opF-LLRbg2nqFOZzvs,1835
39
- pymscada/demo/wwwserver.yaml,sha256=Bx7yn2GplDsqh2hzjjuHK_aIZSoTEBTPDL6hGlUTmhQ,1789
38
+ pymscada/demo/tags.yaml,sha256=9xydsQriKT0lNAW533rz-FMVgoedn6Lwc50AnNig7-k,2733
39
+ pymscada/demo/wwwserver.yaml,sha256=mmwvSLUXUDCIPaHeCJdCETAp9Cc4wb5CuK_aGv01KWk,2759
40
40
  pymscada/files.py,sha256=MisnKoWvkffPMSj6sGVmm-4fh866x4UX3t9LJg4oCfk,2400
41
41
  pymscada/history.py,sha256=G079gHfzasmGtI5ANS8MdETD4bdZg5vHE_yTKk7atHw,9504
42
42
  pymscada/iodrivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -46,7 +46,7 @@ pymscada/iodrivers/logix_map.py,sha256=ljjBAMJcw199v1V5u0Yfl38U6zbZzba5mdY4I3Zvd
46
46
  pymscada/iodrivers/modbus_client.py,sha256=DIGrEPz_Bwwj9CEeog5fQqiAu1UMV7xVL6KxlKgXNPs,9592
47
47
  pymscada/iodrivers/modbus_map.py,sha256=af2J3CGSeYQ4mSy8rNsERp9z7fRgRUYk3it5Mrc_IQA,7255
48
48
  pymscada/iodrivers/modbus_server.py,sha256=VqvjOJ4-LOVaD1jOK22raXhrCshJEaWlMxLvn5xMnFc,6570
49
- pymscada/iodrivers/openweather.py,sha256=ftFLXp5qAQ1G3dx8zKH1ZrhoW6E2kQTqBOnT7XE0wcQ,5467
49
+ pymscada/iodrivers/openweather.py,sha256=w_OSL5UG30IBTuaR6Exmao7XJae_hKo1JM04XT8Ke7M,5580
50
50
  pymscada/iodrivers/ping_client.py,sha256=UOQgUfoIcYqy5VvKyJ8XGHHjeSRTfjmrhyWEojhIZQk,4188
51
51
  pymscada/iodrivers/ping_map.py,sha256=EbOteqfEYKIOMqPymROJ4now2If-ekEj6jnM5hthoSA,1403
52
52
  pymscada/iodrivers/snmp_client.py,sha256=66-IDzddeKcSnqOzNXIZ8wuuAqhIxZjyLNrDwDvHCvw,2708
@@ -65,5 +65,5 @@ pymscada/tag.py,sha256=Oxh70q2MrPAEI94v4QsWt4gD8QP6BlfzNv9xXeeUFys,10103
65
65
  pymscada/tools/snmp_client2.py,sha256=pdn5dYyEv4q-ubA0zQ8X-3tQDYxGC7f7Xexa7QPaL40,1675
66
66
  pymscada/tools/walk.py,sha256=OgpprUbKLhEWMvJGfU1ckUt_PFEpwZVOD8HucCgzmOc,1625
67
67
  pymscada/validate.py,sha256=fPMlP6RscYuTIgdEJjJ0ZZI0OyVSat1lpqg254wqpdE,13140
68
- pymscada/www_server.py,sha256=A0mxgJVCDpxIFb_SBMYiw4XbsVAfOxZnaqVxo_qM6DM,12122
69
- pymscada-0.1.11b7.dist-info/RECORD,,
68
+ pymscada/www_server.py,sha256=rV1Vsk3J1wBhFMBCnK33SziNuTGgVwNc5zLjQQFxJ-s,12021
69
+ pymscada-0.1.11b9.dist-info/RECORD,,