borft / py-goodwe

Python lib to query Goodwe inverters
GNU General Public License v3.0
15 stars 2 forks source link

psycopg2 error #2

Open FutureCow opened 2 years ago

FutureCow commented 2 years ago

Bedankt voor dit handige stukje code! Ik krijg helaas bij het uitvoeren van de code een foutmelding(begin gaat wel goed en data wordt uit de GoodWe gehaald): Traceback (most recent call last): File "run.py", line 88, in <module> cur.execute(query, values) psycopg2.errors.SyntaxError: syntax error at or near "ON" LINE 1: ....5,6553.5,148,49.97,655.35,655.35,4.3,1.1,1281.5) ON CONFLIC... Ik maak gebruik van een oude Synology NAS, waardoor ik alleen psycopg2-binary kan installeren. Dus wellicht dat mijn foutmelding daar mee te maken heeft. Heb je een idee hoe ik dit zou kunnen oplossen?

borft commented 2 years ago

Welke versie van Postgres draai je? in principe zou die binary package prima moeten werken.

ik zie helemaal geen line 88 ;) zou je op de regel voor de cur.execute() een print(f'query: {query} / values: {json.dumps(values, indent=4)}') kunnen toevoegen?

FutureCow commented 2 years ago

Ik heb zelf de MQTT er tussen gestopt, die werkt goed, vandaar dat de line wat verder naar beneden zit :) Wellicht dat het met de oude versie van postgresql te maken heeft: postgres (PostgreSQL) 9.3.25 Toevoegen van stukje code heeft deze foutmelding:

Traceback (most recent call last): File "run.py", line 88, in print(f'query: {query} / values: {json.dumps(values, indent=4)}') File "/var/packages/py3k/target/usr/local/lib/python3.8/json/init.py", line 234, in dumps return cls( File "/var/packages/py3k/target/usr/local/lib/python3.8/json/encoder.py", line 201, in encode chunks = list(chunks) File "/var/packages/py3k/target/usr/local/lib/python3.8/json/encoder.py", line 429, in _iterencode yield from _iterencode_list(o, _current_indent_level) File "/var/packages/py3k/target/usr/local/lib/python3.8/json/encoder.py", line 325, in _iterencode_list yield from chunks File "/var/packages/py3k/target/usr/local/lib/python3.8/json/encoder.py", line 438, in _iterencode o = _default(o) File "/var/packages/py3k/target/usr/local/lib/python3.8/json/encoder.py", line 179, in default raise TypeError(f'Object of type {o.class.name} ' TypeError: Object of type datetime is not JSON serializable

FutureCow commented 2 years ago

Als ik trouwens het stukje ON CONFLICT er even tussen uit haal krijg ik deze foutmelding psycopg2.errors.UndefinedTable: relation "sems" does not exist

borft commented 2 years ago

ah, dat laatste verklaart het probleem. je moet de tabellen nog even aanmaken, de queries daarvoor staan in examples/db.sql.

die kan je uitvoeren als volgt:

psql -U postgres -h localhost database < examples/db.sql
FutureCow commented 2 years ago

Ah, daar had ik idd niet aan gedacht. Krijg je (zonder de ON CONFLICT) deze foutmelding.... Traceback (most recent call last): File "run.py", line 89, in <module> cur.execute(query, values) psycopg2.errors.NumericValueOutOfRange: numeric field overflow DETAIL: A field with precision 4, scale 1 must round to an absolute value less than 10^3.

dit zijn de waardes: { "sample": "2022-01-14 15:07:24.733549", "voltage_dc_1": 265.2, "current_dc_1": 0.2, "voltage_dc_2": 198.8, "current_dc_2": 0.3, "voltage_dc_3": 6553.5, "current_dc_3": 6553.5, "voltage_dc_4": 6553.5, "current_dc_4": 6553.5, "voltage_ac_1": 231.2, "voltage_ac_2": 6553.5, "voltage_ac_3": 6553.5, "current_ac_1": 0.9, "current_ac_2": 6553.5, "current_ac_3": 6553.5, "frequency_ac_1": 49.98, "frequency_ac_2": 655.35, "frequency_ac_3": 655.35, "power_ac": 143, "status": "NORMAL", "temperature": 4.1, "yield_today": 1.2, "yield_total": 1281.6, "working_hours": 1879, "power_dc_1": 53.04, "power_dc_2": 59.64, "net_frequency_1": 49.98, "net_frequency_2": 655.35, "net_frequency_3": 655.35 }

borft commented 2 years ago

Ik denk dat het komt, omdat je geen 3 fase omvormer hebt (Die heb ik wel), waardoor de default waardes voor de spanning niet passen. In de code staat een list db_fields, je zou kunnen proberen daaruit voltage_ac_2 en voltage_ac_3 weg te halen en hetzelfde voor current_ac_2 en current_ac_3.

FutureCow commented 2 years ago

Oke, alles werkt nu bijna, alleen de ON CONFLIT error blijft terug komen.

borft commented 2 years ago

ja, die laatste is lastig. Postgres 9.3 is meer dan 8 jaar oud... ;) die ondersteunt de ON CONFLICT clause niet. Mag ik voorstellen dat je PG upgrade naar iets dat minder oud is? ;) Vanaf versie 9.5 zou het moeten werken. Ter referentie, de huidige versie van Postgres is 14!

FutureCow commented 2 years ago

Yep, ben ik mij van bewust. Nadeel is dus oude NAS, waar het bijna onmogelijk op is om iets goed te updaten. DOCKER werkt bijvoorbeeld al niet...

FutureCow commented 2 years ago

met wat kunst en vliegwerk postgresql 11 er naast kunnen installeren. Dus de database loopt nu vol! Ik draai nu ook de push_status en push_output, maar er wordt weinig naar pvoutput gestuurt (api en site-id staan goed) bij push_output krijg ik helemaal niks te zien bij push_status alleen: got 0 rows

borft commented 2 years ago

Is er inmiddels al data? En, heb je ook data van je slimme meter in de DB? Die wordt namelijk meegequeried in een join. Dus als die tabel leeg is zou dat het kunnen verklaren.

On Sat, 15 Jan 2022, 11:01 FutureCow, @.***> wrote:

met wat kunst en vliegwerk postgresql 11 er naast kunnen installeren. Dus de database loopt nu vol! Ik draai nu oop de push_status en push_output, maar er wordt weinig naar pvoutput gestuurt (api en site-id staan goed) bij push_output krijg ik helemaal niks te zien bij push_status alleen: got 0 rows

— Reply to this email directly, view it on GitHub https://github.com/borft/py-goodwe/issues/2#issuecomment-1013654842, or unsubscribe https://github.com/notifications/unsubscribe-auth/AKZDIOAQKHMZMFBSD5JZRFLUWFAYRANCNFSM5L62MY7Q . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you commented.Message ID: @.***>

FutureCow commented 2 years ago

Had het nog niet aan de praat, heb idd nog geen p1 toegevoegd. Mijn p1 reader is alleen een netwerk reader via port 8088 van de p1 reader komen de telegrams binnen. Ik weet niet of ik de ook kan gebruiken met p1.py?

borft commented 2 years ago

niet zonder aanpassingen, maar een http request doen en de output daarvan parsen is neit al te moeilijk. Heb je ergens een specificatie van het protocol (of welk type is het precies)? Allicht dat ik even wat kan proberen.

Het script doet niet heel meer dan:

De eerste 2 stappen vervangen door een http request zou niet heel moeilijk moeten zijn.

FutureCow commented 2 years ago

het werkt via rfc2217: COM over TCP/IP een soort telnet verbinding. Volgens mij zou die via pyserial moeten/kunnen werken, ik heb rfc2217://ip:port geprobeerd, maar dat werkte helaas niet.

borft commented 2 years ago

hmm, dat zou wel moeten werken. Zou het kunnen dat je nog options als baudrate, etc moet zetten?

borft commented 2 years ago

Een andere optie is socat waarmee je, op basis van rfc2217 een lokale seriele port kan maken (ik gebruik hier iets vergelijkbaars voor mijn zwave netwerk). Vervolgens kan je het p1 script tegen die seriele port laten praten.