Skrypt który pobier...
 
Powiadomienia
Wyczyść wszystko

Pomoc Skrypt który pobiera dane ze strony www i zapisuje te dane w Domoticz

14 Wpisów
2 Użytkownicy
0 Reactions
2,161 Wyświetleń
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

Witam

Od penego czasu ogrzewam wodę grzałką elektryczną, prąd wykorzystje z paneli fotowoltaicznych. Chciałbym efektywnie wykorzystywać prąd tzn aby grzałka właczała się tylko wtedy gdy produkcja prądu jest powyrzej 1400W gdyż taką moc ma grzłka zamontowana w boilerze, aby nie pobierać prądu z sieci i nie tracić 20% które operator zabiera za magazynowanie prądu. Mój inwerer jest firmy STECA mam dostęp do danych przez www po jego IP.
Potrzebuję skrypt który by te dane pobierał np co 30sek i zapisywał je w domoticzu np w wirtualnym czujniku, te dane domoticz wy wykorzystywał jako informacja czy załączać grzałkę czy rozłaczyć ją.

Pomoże ktoś napisać taki skrypt pod RPI?

 
Dodane : 09/06/2021 8:03 pm
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 

Kombinuj z biblioteką bs4 w pythonie:

#!/usr/bin/env python

from bs4 import BeautifulSoup
import requests
import re

DOMOTICZ_IP = 'http://192.168.18.101'
DEVICE_IDX_total = '45'
DEVICE_IDX_today = '46'
DEVICE_IDX_power = '47'

url='http://admin:admin@192.168.18.110/index_cn.html'

page = requests.get(url).text
soup = BeautifulSoup(page,  "html.parser")
klasy_div=soup.findAll('div', class_='lab_r2')


print(klasy_div)
#print(klasy_div[0].text)
#total = klasy_div[6].text
#today = klasy_div[7].text
#power = klasy_div[8].text

#requests.get(DOMOTICZ_IP + "/json.htm?type=command&param=udevice&idx=" + DEVICE_IDX_total + "&svalue=" + total)
#requests.get(DOMOTICZ_IP + "/json.htm?type=command&param=udevice&idx=" + DEVICE_IDX_today + "&svalue=" + today)
#requests.get(DOMOTICZ_IP + "/json.htm?type=command&param=udevice&idx=" + DEVICE_IDX_power + "&svalue=" + power)

W url zamiast admin:admin dajesz własny login i hasło do inwentera oraz poprawy url.

Co do elementu class_ lab_r2 to musisz w kodzie źródłowym poszukać jak nazywa się twoja zmienna gdzie zapisane są wartości produkcji prądu.

 
Dodane : 07/11/2021 6:34 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

@leckimarcin bardzo dziękuję tylko ten skrypt gdzie wpisać?

 
Dodane : 07/11/2021 6:47 pm
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 

@muchac35  to jest skrypt w języku python, wrzucasz do edytora tekstowego np. nano, zapisujesz jako nazwa.py i odpalasz poleceniem #python nazwa.py.

Możesz go wrzucić do autostartu. Jak już ogarniesz wszystkie zmienne to dobrze jest dorzucić jeszczed sprawdzanie czy falownik jest zalogowany w sieci, bo pewnie w nocy nic nie wysyła:

import os
hostname = "192.168.1.x"
response = os.system("ping -c 1 " + hostname)

if response == 0:
  #tutaj wywołujesz instrukcje z postu wyżej
 
Dodane : 07/11/2021 6:59 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

Ok potestuje i dam znac

 
Dodane : 07/11/2021 7:03 pm
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 

@muchac35 Jest tego dużo w necie jak wpiszesz scraping python.

 
Dodane : 07/11/2021 7:17 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

@leckimarcin 

plik wykonawczy zrobiłem zmieniłem ip jaki ma falownikzmieniłem na poprawne ip domoticza ale czy trzeba gdzieś wpisać port na którym jest dostęp do domoticza?

nie jestem w stanie zrozumieć tych

klasy_div=soup.findAll('div', class_='lab_r2')
#requests.get(DOMOTICZ_IP + "/json.htm?type=command&param=udevice&idx=" + DEVICE_IDX_total + "&svalue=" + total)
print(klasy_div)
#print(klasy_div[0].text)
#total = klasy_div[6].text
 
Dodane : 10/11/2021 9:01 am
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 

Pierwsza linijka wyszukuje wszystkie elementy div na stronie falownika - musisz otworzyć źródło strony i poszukać odpowiedni element, pod którym znajduje się wartość, która Cię interesuje.

Druga linijka jest zakomentowana, bo póki nie znajdziesz odpowiedniego elementu to python by się wysypywał. 

Polecenie print tylko pomaga sprawdzić działanie skryptu - później to zakomentuj haszem.

Jeżeli skrypt znajdzie kilka elementów div to w kwadratowym nawiasie podajesz numer zaczynając od 0.

Na YT jest dużo filmów jak używać skryptów skrobiacych do stron www. Jak co pytaj;)

 

P.S. domoticz na razie zostaw w spokoju, najpierw za pomocą polecenia print próbuj wyświetlić interesującą cię wartość, a następnie zajmujesz się przesłaniem tego do domoticza za pomocą json.

 
Dodane : 10/11/2021 11:00 am
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

@leckimarcin ok wyszukałem na YT może pokapuje

ale muszę jakieś biblioteki instalować na RPI? i czy ten port domoticza w tym skrypcie mam gdzieś wpisać?

na stronie falownika wyszukałem

se

1959.6 ta liczba się ciągle zmienia i właśnie te dane aby domoticz miał

 
Dodane : 10/11/2021 11:10 am
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 
klasy_div=soup.findAll('td', class_='invisible_narow')

Musisz zainstalować poprzez pip bs4 i requests.

A w domoticzu musisz sobie stworzyć odpowiednie okienko i wpisać w skrypt idx z domoticza.

 
Dodane : 10/11/2021 4:10 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 
Dodane przez: @leckimarcin
klasy_div=soup.findAll('td', class_='invisible_narow')

Musisz zainstalować poprzez pip bs4 i requests.

jak to się indstaluje?

jeśli juz dodałem do tego skryptu klasy_div=soup.findAll('td', class_='invisible_narow') to przy uruchomieniu tego skryptu gdzie mogę zobaczyć jakie dane pobiera ?

 

 
Dodane : 10/11/2021 4:14 pm
leckimarcin
(@leckimarcin)
Wpisów: 53
Kontrybutor
 

@muchac35 pip inatall bs4

Jak używasz python3 to musisz dać pip3, i wtedy wywołujesz program też przez python3 nazwa.py

 
Dodane : 10/11/2021 4:17 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

@leckimarcin 

Ja uruchamiam ten skrypt gdy jestem zalogowany przez ssh i włączam sudo MC

Następnie podświetlenie mój skrypt o nazwie steca.sh i enter

 
Dodane : 10/11/2021 4:43 pm
(@muchac35)
Wpisów: 490
Ekspert
Autor tematu
 

@leckimarcin 

zainstalowałem:
pip install bs4

uruchamiam komendą:
python3 steca.py

odpowiedż mam taką:
Traceback (most recent call last):
File "steca.py", line 19, in <module>
print(klasy_div[0].text)
IndexError: list index out of range

 

co robię nie tak?

 
Dodane : 23/11/2021 2:20 pm
Udostępnij: