Aangezien ik de prijs van Aloaha exceptioneel vindt heb ik mijn best gedaan de kosten te drukken. Ik weet het, het stukje programma wat ik heb toegevoegd is amateuristisch maar mijn logging naar PVOutput.org loopt nu in ieder geval, met dank aan Martijn van Duijn en de helpfile van PVOutput. Al de variabelen kunnen nog in array's maar aangezien ik elke syntax moet opzoeken omdat ik perl nog niet machtig ben doe ik het even zo. Het belangrijkste op dit moment is dat ik geen data verlies. Het belangrijkste stukje code is het gedeelte dat voorkomt dat je inverters niet dubbel telt en de code die kijkt of alle inverters al een keer zijn langsgekomen. Er zitten nog geen routines in om errors op te vangen, komt allemaal nog. Het liefst zou ik zien dat iemand met perl ervaring hetzelfde gaat aanbieden maar dan uiteraard beter.
Hoe krijgen jullie zo mooi die tabellen, mij lukt dit niet.
De volgende stap is de aanschaf van een Raspberry. En daarna ga ik verder met het mij verdiepen in perl.
Hoe krijgen jullie zo mooi die tabellen, mij lukt dit niet.
De volgende stap is de aanschaf van een Raspberry. En daarna ga ik verder met het mij verdiepen in perl.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
| #!/usr/bin/perl #Copyright (c) 2012 Martijn van Duijn #PollEnecsys is free software: you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation, either version 3 of the License, or #(at your option) any later version. #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License #along with this program. If not, see <http://www.gnu.org/licenses/>. use Math::BaseCnv; use Math::BaseCnv dig; # enable the dig option use XML::Simple; use LWP::Simple; use DateTime; use LWP::UserAgent; use POSIX qw(strftime); my $ua = new LWP::UserAgent; dig('url'); # select the right alphabet for the base64 $apikey = "0a4235d8deeca1840fed913c401007962a7xxxxx"; $sysid = "19xxx"; $inverter1 =0; $inverter2 =0; $inverter3 =0; $inverter4 =0; $inverter5 =0; $inverter6 =0; $inverter7 =0; $inverter8 =0; $inverter9 =0; $serieno1 = 110062652; $serieno2 = 110062684; $serieno3 = 110063400; $serieno4 = 110076020; $serieno5 = 110085457; $serieno6 = 110075987; $serieno7 = 110106587; $serieno8 = 110054124; $serieno9 = 110064728; $LifekWhtotal = 0; $DCPowertotal = 0; #Write headers for the columns open WRITEFILE, ">>", "EnecsysLogfile.txt" or die $!; # define outputfile print "Enecsys Logging Script\n"; print WRITEFILE "date", "\t", "time", "\t", "ZigbeeString", "\t", "deviceID", "\t","DCpower", "\t","Efficiency", "\t", "ACpower", "\t","DCcurrent", "\t","DCVolt", "\t","LifetimeProduction", "\t","Time1", "\t","Time2", "\t","ACvolt", "\t","ACfreq", "\t","Temperature", "\t","HexZigbee","\n"; close WRITEFILE; for ($i=0; $i<50000; $i++) #This defines the number of reading loops. An infinite loop would also work, if you are not afraid of large logfiles { #print $i,"\n"; my $parser = new XML::Simple; my $url = 'http://192.168.0.11/ajax.xml'; #Put IP address of the gateway my $content = get $url or die "Unable to get $url\n"; my $data = $parser->XMLin($content); my $dt=DateTime->now(time_zone => 'Europe/Amsterdam' ); #adjust timezone if desired. If unspecified time is UTC. $Zigbee=$data->{zigbeeData}; #pick out the zigbee field $Zigbee =~ s/\r//g; #Remove lifefeed and CR from the string $Zigbee =~ s/\n//g; #Usually chomp is used for that, but there are issues between platforms with that if ($Zigbee =~ /^WZ/) #Gateway strings will just be logged { $time = $dt->hms(':'); $date = $dt->mdy('-'); open WRITEFILE, ">>", "EnecsysLogfile.txt" or die $!; # define outputfile print WRITEFILE $date, "\t", $time, "\t", $Zigbee, "\n"; close WRITEFILE; } if ($Zigbee =~ /^WS/ && length($Zigbee)==57 ) #Normal inverter strings are parsed { dig('url'); # $deviceID = substr($Zigbee,3,6); #This converts fields from base64 to decimal # $Ztime = cnv(substr($Zigbee,14,4),64,10); # # $ZUptime = cnv(substr($Zigbee,22,5),64,10); # $Zdccurrent = cnv(substr($Zigbee,35,2),64,10)/500; # $Zdcpower = cnv(substr($Zigbee,37,2),64,10); # $ZEfficiency = cnv(substr($Zigbee,39,3),64,10)/4000; # $Zacfreq = cnv(substr('A'.$Zigbee,42,1),64,10); # $Zacvolt = cnv(substr($Zigbee,43,3),64,10)/4; # $Ztemperature = cnv(substr('A'.$Zigbee,46,1),64,10); # $ZDCenergy = cnv(substr($Zigbee,47,3),64,10)/4; # $Zmonth = cnv(substr($Zigbee,50,2),64,10); $time = $dt->hms(':'); $date = $dt->mdy('-'); $DecZigbee = cnv('A'.substr($Zigbee,3,54),64,10); #decimal representation of whole Zigbee string dig('HEX'); #the url alphabet messes up de dec hex conversions, so change to HEX $HexZigbee = cnv($DecZigbee,10,16); #Hex representation of zigbeestring if (length($HexZigbee) ==80) # if we have a leading 0 it gets chopped off, this is a fix for that. { $HexZigbee="0".$HexZigbee; } $HexID = substr($HexZigbee,0,8); #Device ID in hex $IDEndian = unpack("H*", pack("V*", unpack("N*", pack("H*", $HexID)))); # some magic to convert from little to big endian $IDDec = cnv($IDEndian,16,10); #Device ID in decimal numbers. Should match Enecsys monitor site $HexTime1 = cnv(substr($HexZigbee,18,4),16,10); $HexTime2 = cnv(substr($HexZigbee,30,6),16,10); $HexDCCurrent = 0.025*cnv(substr($HexZigbee,46,4),16,10); #25 mA units? $HexDCPower = cnv(substr($HexZigbee,50,4),16,10); $HexEfficiency = 0.001*cnv(substr($HexZigbee,54,4),16,10);#expressed as fraction $HexACFreq = cnv(substr($HexZigbee,58,2),16,10); $HexACVolt = cnv(substr($HexZigbee,60,4),16,10); $HexTemperature = cnv(substr($HexZigbee,64,2),16,10); $HexWh = cnv(substr($HexZigbee,66,4),16,10); $HexkWh = cnv(substr($HexZigbee,70,4),16,10); $LifekWh = (0.001*$HexWh)+$HexkWh; $ACpower = $HexDCPower * $HexEfficiency; $HexDCVolt = sprintf("%0.2f",$HexDCPower / $HexDCCurrent); open WRITEFILE, ">>", "EnecsysLogfile.txt" or die $!; # define outputfile print $date, "\t", $time, "\t", $IDDec, "\t",$HexDCPower, "W\t",$LifekWh, "kWh\t",$HexTemperature, "C\n"; # print WRITEFILE $date, "\t", $time, "\t", $Zigbee, "\t", $deviceID, "\t",$Zdcpower, "\t", $ZEfficiency, "\t", $ACpower, "\t",$Zdccurrent, "\t",$ZDCenergy, "\t",$Zmonth, "\t",$Ztime, "\t",$Zacvolt, "\t", $Zacfreq, "\t",$Ztemperature, "\t",$ZUptime, "\t",$LifekWh, "\t",$HexZigbee, "\t",$IDDec,"\n"; print WRITEFILE $date, "\t", $time, "\t", $Zigbee, "\t", $IDDec, "\t",$HexDCPower, "\t", $HexEfficiency, "\t", $ACpower, "\t",$HexDCCurrent, "\t",$HexDCVolt, "\t",$LifekWh, "\t",$HexTime1, "\t", $HexTime2, "\t",$HexACVolt, "\t",$HexACFreq, "\t",$HexTemperature, "\t",$HexZigbee,"\n"; close WRITEFILE; } if($IDDec==$serieno1 and $inverter1==0) { $inverter1 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno2 and $inverter2==0) { $inverter2 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno3 and $inverter3==0) { $inverter3 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno4 and $inverter4==0) { $inverter4 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno5 and $inverter5==0) { $inverter5 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno6 and $inverter6==0) { $inverter6 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno7 and $inverter7==0) { $inverter7 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno8 and $inverter8==0) { $inverter8 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if($IDDec==$serieno9 and $inverter9==0) { $inverter9 = 1; $LifekWhtotal = $LifekWhtotal + $LifekWh; $DCPowertotal = $DCPowertotal + $HexDCPower; } if ($inverter1==1 and $inverter2==1 and $inverter3==1 and $inverter4==1 and $inverter5==1 and $inverter6==1 and $inverter7==1 and $inverter8==1 and $inverter9==1) { my $updateurl="http://pvoutput.org/service/r2/addstatus.jsp"; my $ua=LWP::UserAgent->new( default_headers=>HTTP::Headers->new("X-Pvoutput-Apikey"=>$apikey, "X-Pvoutput-SystemId"=>$sysid)); $ua->env_proxy; my @data=("d"=>strftime("%Y%m%d",localtime), "t"=>strftime("%H:%M",localtime), "c1"=>0, "v2"=>$DCPowertotal, "v5"=>23.4, "v6"=>225.1); my $res=$ua->post($updateurl, \@data); print ($updateurl); print (@data,"\n"); print $LifekWhtotal,"\n"; print $DCPowertotal,"\n"; $LifekWhtotal = 0; $DCPowertotal = 0; $inverter1 = 0; $inverter2 = 0; $inverter3 = 0; $inverter4 = 0; $inverter5 = 0; $inverter6 = 0; $inverter7 = 0; $inverter8 = 0; $inverter9 = 0; } if ($Zigbee =~ /^WS/ && length($Zigbee)!=57 ) #other inverter strings (startup?) { $time = $dt->hms(':'); $date = $dt->mdy('-'); #print $date, "\t", $time, "\t", $Zigbee, "\n"; open WRITEFILE, ">>", "EnecsysLogfile.txt" or die $!; # define outputfile print WRITEFILE $date, "\t", $time, "\t", $Zigbee, "\n"; close WRITEFILE; } sleep 1; } |
www.mrmodelrailroad.com