Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

psycopg2 error #2

Open
FutureCow opened this issue Jan 14, 2022 · 16 comments
Open

psycopg2 error #2

FutureCow opened this issue Jan 14, 2022 · 16 comments

Comments

@FutureCow
Copy link

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
Copy link
Owner

borft commented Jan 14, 2022

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
Copy link
Author

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
Copy link
Author

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
Copy link
Owner

borft commented Jan 14, 2022

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
Copy link
Author

FutureCow commented Jan 14, 2022

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
Copy link
Owner

borft commented Jan 14, 2022

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
Copy link
Author

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

@borft
Copy link
Owner

borft commented Jan 14, 2022

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
Copy link
Author

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
Copy link
Author

FutureCow commented Jan 15, 2022

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
Copy link
Owner

borft commented Jan 20, 2022 via email

@FutureCow
Copy link
Author

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
Copy link
Owner

borft commented Jan 21, 2022

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:

  • seriele port openen
  • wachten op een telegram
  • telegram parsen
  • data in de database opslaan

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

@FutureCow
Copy link
Author

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
Copy link
Owner

borft commented Jan 25, 2022

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

@borft
Copy link
Owner

borft commented Jan 25, 2022

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants